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

Sak*_*ain 7 javascript python audio howler.js

我正在制作一个简单的网络应用程序,需要使用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();
}
Run Code Online (Sandbox Code Playgroud)

...它工作得很好。由于我将处理相当数量的音频文件,我想我会使用一个简短的 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))
Run Code Online (Sandbox Code Playgroud)

我注意到 base64 字符串与我之前从网站获得的字符串不同。我将其粘贴到前面显示的 JS 函数中,但是当我尝试播放声音时,出现以下错误:

Uncaught DOMException: Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.
Run Code Online (Sandbox Code Playgroud)

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

Sak*_*ain 9

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

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

真的很愚蠢的错误,但希望它可以帮助某人。