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

问题描述:

我正在制作一个简单的网络应用程序,需要播放一些音频文件,使用howler.js。 howler.js接受base64 URI作为输入,所以我想尝试一下。为了测试它,我拿了一个示例音频文件,并使用在线audio-to-base64 encoder获取base64 URI。我添加的数据描述(“数据:音频/ WAV; BASE64”)以base64字符串的前面,复制并粘贴到下面的JS函数...:为什么使用python和在线webapp将wav文件编码为base64会给出不同的结果?

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

...它完美地工作。由于我会处理相当数量的音频文件,我想我会使用一个简短的python脚本将它们全部转换为base64。为了测试,我转换相同的音频到Base64字符串以下Python代码:

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. 

似乎有某种的方式蟒蛇不同的是编码为base64。这可能是什么原因?

+0

atob()'叫什么? – guest271314

+0

它被称为howler.js代码本身。看看这里:https://github.com/goldfire/howler.js/blob/master/dist/howler.core.min.js(代码是在一行,但CTRL + F会告诉你在哪里'atob()'被调用)。 –

+0

你可以创建一个jsfiddle https://jsfiddle.net或者plnkr https://plnkr.co,包括在'python'创建的'data URI'吗? – guest271314

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

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

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