【发布时间】:2018-10-21 02:34:06
【问题描述】:
音频文件通过 API 发送给我们,API 是 Base64 编码的 PCM 格式。我需要将其转换为 PCM,然后再转换为 WAV 进行处理。
我能够解码 -> 保存到 pcm -> 从 pcm 读取 -> 使用以下代码保存为 wav。
decoded_data = base64.b64decode(data, ' /')
with open(pcmfile, 'wb') as pcm:
pcm.write(decoded_data)
with open(pcmfile, 'rb') as pcm:
pcmdata = pcm.read()
with wave.open(wavfile, 'wb') as wav:
wav.setparams((1, 2, 16000, 0, 'NONE', 'NONE'))
wav.writeframes(pcmdata)
如果我可以将输入字符串解码为二进制并保存为 wav,那就容易多了。所以我在Convert string to binary in python 做了这样的事情
decoded_data = base64.b64decode(data, ' /')
ba = ' '.join(format(x, 'b') for x in bytearray(decoded_data))
with wave.open(wavfile, 'wb') as wav:
wav.setparams((1, 2, 16000, 0, 'NONE', 'NONE'))
wav.writeframes(ba)
但我在wav.writeframes 收到错误a bytes-like object is required, not 'str'。
还尝试了base54.decodebytes() 并得到了同样的错误。
这样做的正确方法是什么?
【问题讨论】:
-
@snakecharmerb 我没有得到错误使用这个。但是输出的wav文件不对。它应该是 5 秒的音频,但现在是 38 秒。而且尺寸太大了。
-
@snakecharmerb 不幸的是,仍然不对。音频大小要小得多,但仍然太长。另外,当我播放它时,它听起来不正确。
-
@ddd 在您的第一个示例中,保存和读取二进制文件的意义何在?而你为什么在第二个例子中执行
ba = ' '.join(format(x, 'b') for x in bytearray(decoded_data))?为什么不按原样使用decoded_data?你还有一些示例数据吗?
标签: python base64 decode wav python-bytearray