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

时间:2017-10-07 17:19:56

标签: javascript python audio howler.js

我正在制作一个简单的网络应用,需要使用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的方式似乎存在某种差异。造成这种情况的原因是什么?

1 个答案:

答案 0 :(得分:2)

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

base64.b64encode(f1.read())返回一个位字符串,在Python中,用下面的符号表示(即当你打印/写它时,你会看到它):b'string goes here'。所以问题只是b' '缠绕在我的实际base64字符串上,而我正在使用它。我所要做的只是通过将bitstring转换为ASCII来消除我所做的b' 'str(encoded_f1,'ascii', 'ignore')

真的很傻,但希望能帮助别人。