Проигрывание музыки из url потока чанками
Всех приветствую. Есть сайт где транслируется радио - (https://listen4.myradio24.com/5129) не реклама!
Хочу python'ом читать оттуда поток секторами и воспроизводить его. Пробовал:
import requests
import pyaudio
import ffmpeg
url = 'https://listen4.myradio24.com/5129' # replace with actual url
# get audio stream from url
res = requests.get(url, stream=True)
audio_stream = ffmpeg.input('pipe:0')
# play audio stream using pyaudio
with audio_stream.output('pipe:', format='rawaudio', layout='stereo') as out:
with pyaudio.PyAudio() as audio:
stream = audio.open(format=audio.get_format_from_width(out.get_sample_rate()),
channels=out.get_channels(),
rate=out.get_sample_rate(),
output=True)
for frame in out:
stream.write(frame)
Но получал ошибку:
with audio_stream.output('pipe:', format='rawaudio', layout='stereo') as out:
AttributeError: __enter__
Ответы (1 шт):
Автор решения: kristal
→ Ссылка
Проще самому реализовать логику для работы с контекстным менеджером, я накидал небольшой код, он должен сработать для вас:
import pyaudio
import ffmpeg
import subprocess
class Player:
def __init__(self, url:str):
self.url = url
self.ffmpeg_command = ffmpeg.compile(
ffmpeg.output(ffmpeg.input(self.url), 'pipe:', format='wav', acodec='pcm_s16le', ac=2, ar='44100'),
overwrite_output=True)
self.audio = pyaudio.PyAudio()
self.stream = self.audio.open(
format=pyaudio.paInt16,
channels=2,
rate=44100,
output=True
)
self.process = None
def __enter__(self):
self.process = subprocess.Popen(self.ffmpeg_command,
stdout=subprocess.PIPE,
stderr=subprocess.DEVNULL,
shell=True)
return self
def read(self):
raw_audio = self.process.stdout.read(4096)
if not raw_audio: raise RuntimeError("Ошибка воспроизведения")
self.stream.write(raw_audio)
def __exit__(self, exc_type, exc_val, exc_tb):
self.stream.stop_stream()
self.stream.close()
self.audio.terminate()
self.process.kill()
if __name__ == '__main__':
with Player(url='https://listen4.myradio24.com/5129') as player:
while True:
player.read()