9

我将小型声音文件存储MongoDBBSON. 任务是从数据库中检索二进制数据,将其转换为适当的格式并发送回前端。问题在于转换。我发现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')

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

4

1 回答 1

20

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

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

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

AudioSegment(y['data'], sample_width=???, frame_rate=???, channels=???)
  • sample_width是每个样本中的字节数(因此对于 16 位/CD 音频,您可以使用2
  • frame_rate是每秒的样本数(又名,采样率,对于 CD 音频它是44100
  • channels有多少音频流,立体声是2,单声道是1
于 2017-06-08T13:36:14.570 回答