Как играть мп3 из байт?

Есть ли способ воспроизводить mp3 из байтов напрямую с помощью python? Если нет, могу ли я преобразовать двоичный файл в другой аудиоформат и сделать его воспроизводимым?

Изменить: следующий код работает для wav файлов, но не для mp3

from pygame import mixer, time

mixer.pre_init(44100, -16, 2, 2048)
mixer.init()

data = open('filename.mp3', 'rb').read()
sound = mixer.Sound(buffer=data)

audio = sound.play()
while audio.get_busy():
    time.Clock().tick(10)

Изменить: проблема решена, см. мой ответ ниже, если вы столкнулись с похожей проблемой.


person tushar    schedule 12.05.2017    source источник
comment
Просто чтобы уточнить, у вас есть файл в формате .mp3, и вы хотите воспроизвести его с помощью Python? А какую операционную систему вы используете?   -  person cameronroytaylor    schedule 12.05.2017
comment
У меня нет, я стримлю бинарный mp3 и не хочу записывать его на диск. Я использую Mac, но решение для Linux тоже подойдет.   -  person tushar    schedule 12.05.2017
comment
Просто чтобы уточнить, когда вы говорите «двоичный», это массив амплитуд или он на самом деле в формате mp3? И когда вы говорите о потоковой передаче, вы имеете в виду, что это должно происходить в режиме реального времени?   -  person cameronroytaylor    schedule 12.05.2017
comment
Не знаю, как это сделать в режиме реального времени, но если вы обнаружите, что можете записывать короткие фрагменты на диск, возможно, вы могли бы использовать os.system("afplay path/temp.mp3"). Возможно, потребуется больше деталей, чтобы получить более полезный ответ.   -  person cameronroytaylor    schedule 12.05.2017
comment
Да, это делается в режиме реального времени, и я хочу воспроизвести аудио после получения нескольких тысяч байтов. Извините, я не должен использовать слово двоичный. Это настоящие байты в формате mp3.   -  person tushar    schedule 12.05.2017
comment
В настоящее время я использую afplay и tempfiles, но я хочу сделать это без сохранения на диск, как я уже упоминал.   -  person tushar    schedule 12.05.2017
comment
Возможно, вы сможете поместить данные в экземпляр StringIO или BytesIO и передать их тому, что воспроизводит mp3, как будто это был файл.   -  person martineau    schedule 12.05.2017
comment
Это то, что я хочу найти   -  person tushar    schedule 12.05.2017


Ответы (2)


Для тех, кто может столкнуться с подобной проблемой, это работает

from pydub import AudioSegment
from pydub.playback import play
import io

data = open('filename.mp3', 'rb').read()

song = AudioSegment.from_file(io.BytesIO(data), format="mp3")
play(song)
person tushar    schedule 13.05.2017
comment
Спасибо за этот вариант, я изо всех сил пытался заставить IPython Audio работать - person Rameez Ahmed Sayad; 02.01.2019
comment
попробовал это, но получил ошибку ffmpeg, мой вопрос: у вас установлен ffmpeg через pip или в вашу ОС? - person Fernando B; 13.09.2019

Я видел ваш тег pygame, поэтому я сделаю это в pygame. Pygame может загружать файлы из байтов с помощью этой строки: sound = pygame.mixer.Sound(bytes) или sound = pygame.mixer.Sound(buffer=bytes). Я не могу гарантировать, что это будет работать с файлами mp3, однако вам может понадобиться использовать файлы OGG или WAV в виде байтов.

person makeworld    schedule 12.05.2017
comment
Я добавил фрагмент кода в свой пост. Это работает для wav, но файлы mp3 звучат поврежденными. - person tushar; 13.05.2017