Читать из байтов, а не из имени файла, чтобы конвертировать аудио

У меня есть небольшие звуковые файлы, хранящиеся в 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')

Вопрос связан с линией аудиосегмента, так как она не соответствует стандарту AudioSegment.from_wav("/input/file.wav").export("/output/file.mp3", format="mp3"), и ошибка 'bytes' object has no attribute 'read' по-прежнему выдается. Это достижимо с pydub?


person O. Barinov    schedule 08.06.2017    source источник
comment
В каком формате бинарные данные? Волна?   -  person Jiaaro    schedule 08.06.2017
comment
@Jiaaro Да, это так   -  person O. Barinov    schedule 08.06.2017


Ответы (1)


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 и т. д.
person Jiaaro    schedule 08.06.2017
comment
Вы, сэр, действительно лучший, я использовал pydub для многих разных вещей, и каждый раз он отлично работает. Благодарю вас! - person Sophie Proud; 23.04.2019
comment
Сэр @Jiaaro, не могли бы вы помочь, пожалуйста, я столкнулся с той же проблемой - отредактируйте и передайте wav-файл без сохранения stackoverflow.com/questions/63467345/ - person ERJAN; 19.08.2020