我正在制作一个简单的网络应用,需要使用howler.js播放一些音频文件。 howler.js接受base64 URI作为输入,所以我想尝试一下。为了测试它,我采用了一个示例音频文件并使用在线audio-to-base64 encoder来获取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的方式似乎存在某种差异。造成这种情况的原因是什么?
答案 0 :(得分:2)
过了一会儿回到这里,问题变得明显了。我在用于将base64编码写入文件的OP(第二个块)中提到的代码块只是一个问题。
base64.b64encode(f1.read())
返回一个位字符串,在Python中,用下面的符号表示(即当你打印/写它时,你会看到它):b'string goes here'
。所以问题只是b' '
缠绕在我的实际base64字符串上,而我正在使用它。我所要做的只是通过将bitstring转换为ASCII来消除我所做的b' '
:str(encoded_f1,'ascii', 'ignore')
。
真的很傻,但希望能帮助别人。