为什么用python和在线webapp将wav文件编码到base64会产生不同的结果



我正在制作一个简单的web应用程序,它需要播放一些音频文件,使用howler.js。howler.js接受base64 URI作为输入,所以我想尝试一下。为了测试它,我取了一个示例音频文件,并使用在线音频到base64编码器来获取base64 URI。我在base64字符串的前面添加了数据描述("data:audio/wav;base64"),并将其复制粘贴到以下JS函数中…:

function playSound() {
var data = "";
var sound = new Howl({
src: [data],
loop: false
});
sound.play();
}

而且效果很好。由于我要处理相当多的音频文件,我想我应该使用一个简短的python脚本将它们全部转换为base64。为了测试,我用以下python代码将相同的音频转换为base64字符串:

import base64
with open("0.wav", "rb") as f1,open("b64.txt", "w") as f2:
encoded_f1 = base64.b64encode(f1.read())
f2.write("data:audio/wav;base64,")
f2.write(str(encoded_f1))

我注意到base64字符串与我之前从网站上得到的字符串不同。我把这个粘贴到前面显示的JS函数中,但当我尝试播放声音时,我得到了以下错误:

Uncaught DOMException: Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.

python对base64的编码方式似乎存在某种差异。这可能是什么原因?

过了一段时间,问题变得很明显。这只是我在OP中提到的用于将base64编码写入文件的代码块(第二个块)的问题。

base64.b64encode(f1.read())返回一个位字符串,在Python中,该位字符串用以下符号表示(即,当您打印/写入它时,您会看到它是这样的):b'string goes here'。所以问题只是b' '被包裹在我实际的base64字符串中,而我正在使用它。我所要做的就是去掉b' ',这是我通过将位字符串转换为ASCII来完成的,如下所示:str(encoded_f1,'ascii', 'ignore')

真是愚蠢的错误,但希望它能帮助别人。

最新更新