【问题标题】:How to decode base64 String directly to binary audio format如何将base64字符串直接解码为二进制音频格式
【发布时间】: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


【解决方案1】:

在我的一个项目中也遇到了类似的问题。

我能够将 base64 字符串直接转换为 wav:

import base64
encode_string = base64.b64encode(open("audio.wav", "rb").read())
wav_file = open("temp.wav", "wb")
decode_string = base64.b64decode(encode_string)
wav_file.write(decode_string)

首先将其编码为base64。然后创建一个 wav 格式的文件,并将解码后的 base64 字符串写入该文件。

我知道这是一个很晚的答案。希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2020-01-03
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    相关资源
    最近更新 更多