如何将Base64编码的PCM直接解码为二进制并保存为WAV?
解决Base64编码PCM直接转WAV的报错问题
哦,我明白你的问题了——你想跳过中间保存PCM文件的步骤,直接把Base64解码后的PCM二进制数据转成WAV对吧?你之前的错误出在把二进制数据转换成了字符串格式的二进制位,而wave.writeframes()需要的是原始的字节对象,不是字符串。
正确的实现代码
其实不需要多余的转换步骤,base64.b64decode()返回的就是bytes类型的PCM原始数据,直接传给writeframes()就行:
import base64 import wave # 假设data是你通过API接收的Base64编码PCM字符串 decoded_data = base64.b64decode(data, ' /') # 解码后直接得到PCM字节流 with wave.open(wavfile, 'wb') as wav: # 设置WAV文件参数:单声道、16位采样深度、16000采样率、无压缩 wav.setparams((1, 2, 16000, 0, 'NONE', 'NONE')) wav.writeframes(decoded_data) # 直接写入解码后的字节数据
错误原因解释
你之前写的这段代码是问题所在:
ba = ' '.join(format(x, 'b') for x in bytearray(decoded_data))
这里把decoded_data(已经是bytes)转换成了由二进制位组成的字符串,而wave.writeframes()要求传入的是原始字节对象,不是字符串,所以才会抛出a bytes-like object is required, not 'str'的错误。
为什么这个方法可行?
原来的流程是「解码→保存PCM→读取PCM→写入WAV」,而现在直接把解码后的字节数据传给writeframes(),完全跳过了中间的文件IO操作,既简化了代码,又提升了处理效率。
另外,你尝试的base64.decodebytes()和b64decode()在功能上是一致的(只要处理了自定义分隔符),但核心问题还是不要把解码后的字节转成字符串格式。
内容的提问来源于stack exchange,提问作者ddd
相关产品推荐
相关产品推荐

