从字节而不是文件名读取以转换音频

O. *_*nov 7 python pydub

我已经存储在小型的声音文件MongoDB作为BSON。任务是从数据库中检索二进制数据,将其转换为适当的格式并发送回前端。问题在于转换。我发现pydub可以用于此。

我的代码如下

 query_param = json_data['retriever']
 query_param1 = query_param.replace('"', "");
 data = db.soundData
 y = data.find_one({'name': query_param1})
 s = y['data'] // here I retrieve the binary data 
 AudioSegment.from_file(s).export(x, format="mp3")
 return send_file(x, 'audio/mp3')
Run Code Online (Sandbox Code Playgroud)

问题在于 Audiosegment 线,因为它不遵循 的标准 AudioSegment.from_wav("/input/file.wav").export("/output/file.mp3", format="mp3") 并且'bytes' object has no attribute 'read'仍然抛出错误。它可以实现pydub吗?

Jia*_*aro 18

AudioSegment.from_file()将文件路径或类文件对象作为第一个参数。假设您拥有整个波形文件的原始字节(包括波形标题,而不仅仅是音频数据),那么您可以:

import io
s = io.BytesIO(y['data'])
AudioSegment.from_file(s).export(x, format='mp3')
Run Code Online (Sandbox Code Playgroud)

如果您只有音频样本的字节,则需要了解有关音频数据的一些元数据:

AudioSegment(y['data'], sample_width=???, frame_rate=???, channels=???)
Run Code Online (Sandbox Code Playgroud)
  • sample_width是每个样本中的字节数(因此对于 16 位/CD 音频,您可以使用2
  • frame_rate是采样数/秒(也就是采样率,对于 CD 音频来说是44100
  • channels有多少音频流,立体声是2,单声道是1等等

  • 先生,您真是最棒的,我已经使用 pydub 做了很多不同的事情,而且每次都工作得很好。谢谢你! (2认同)