问题描述
我在服务器上将音频记录存储为base64,webm格式,并想用python将其解码为wav文件。我从这里找到的一个类似问题尝试了两种建议的方法:How to decode base64 String directly to binary audio format。但是我在两种建议下都面临着不同的问题:
使用file.write的版本生成了一个wav文件,我可以使用VLC播放器播放该文件,其中包含预期的内容。但是,当我尝试使用matlab或python读取消息时,显示“未知格式”或“缺少riff”时,我收到一条错误消息。
fin = open(dirName + file,"r")
b64_str = fin.read()
fin.close()
# decode base64 string to original binary sound object
decodedData = base64.b64decode(b64_str)
webmfile = (outdir + file.split('.')[0] + ".webm")
wavfile = (outdir + file.split('.')[0] + ".wav")
with open(webmfile,'wb') as wm:
wm.write(decodedData)
with open(webmfile,'rb') as wm:
webmdata = pcm.read()
with open(wavfile,'wb') as file:
file.write(webmdata)
使用writeframes设置参数的版本会生成一个文件,我可以使用matlab或python读取该文件,但是该文件不包含预期的内容,并且比预期的要短。
with wave.open(wavfile,'wb') as wav:
wav.setparams((1,2,48000,'NONE','NONE'))
wav.writeframes(webmdata)
关于如何解决此问题的任何想法?文件本身很好。使用在线转换器对其进行转换是可行的。
解决方法
万一某人遇到相同的问题,这是对我有用的解决方案: 以下代码从base64 str创建一个webm文件:
import base64
decodedData = base64.b64decode(b64_str)
webmfile = (outdir + file.split('.')[0] + ".webm")
with open(webmfile,'wb') as file:
file.write(decodedData)
对于转换,我使用了ffmpy:
from ffmpy import FFmpeg
ff = FFmpeg(
executable = 'C:/Program Files/ffmpeg-2020/bin/ffmpeg.exe',inputs={file:None},outputs = {outfile:'-c:a pcm_f32le'})
ff.cmd
ff.run()
经过这两个步骤,我能够使用matlab或任何其他程序读取生成的wav文件。