问题
I have small-sized sound files stored in MongoDB
as BSON
.
Task is to retrieve Binary data from the database, convert it to an appropriate format and send back to the front end.
The problem is with the converting. I have found pydub
can be used for this.
My code is as follows
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')
The question is with Audiosegment line as it does not follow the standard of
AudioSegment.from_wav("/input/file.wav").export("/output/file.mp3", format="mp3")
and an error of 'bytes' object has no attribute 'read'
is still thrown. Is it achievable with pydub
?
回答1:
AudioSegment.from_file()
takes a file path or file-like object as it's first argument. Assuming you have the raw bytes of a whole wave file (including wave headers, not just the audio data) then you can:
import io
s = io.BytesIO(y['data'])
AudioSegment.from_file(s).export(x, format='mp3')
If you only have the bytes of the audio samples you would need to know some metadata about your audio data:
AudioSegment(y['data'], sample_width=???, frame_rate=???, channels=???)
sample_width
is the number of bytes in each sample (so for 16-bit/CD audio, you'd use2
)frame_rate
is number of samples/second (aka, sample rate, for CD audio it's44100
)channels
how many audio streams are there, stereo is2
, mono is1
, etc
来源:https://stackoverflow.com/questions/44424874/read-from-bytes-not-filename-to-convert-audio