Как записывать стрим в файл, используя ffmpeg+python?
У меня есть простой websocket клиент на python, который получает чанки ogg трека ежесекундно. Мне нужно, чтобы ffmpeg в онлайн режиме записывал эти чанки в файл. Если это важно, я могу менять ogg на любой другой формат. Моя реализация такая:
async def hello(uri):
process = subprocess.Popen(['ffmpeg', '-i', '-', 'ffmpeg.ogg'], stdin=subprocess.PIPE) # или sys.stdout
async with websockets.connect(uri) as websocket:
while True:
r = await websocket.recv()
process.stdin.write(r) # или sys.stdout.write()
В результате ffmpeg даже не создает файл, в который должен все это записывать.
Вместо этого через несколько секунд появляется ошибка Broken pipe, а в случае с sys.stdout сам ffmpeg выводит:
pipe:: Bad file descriptor
EDIT: Код для деления файла на чанки
from pydub import AudioSegment
song = AudioSegment.from_ogg("tst.ogg")
current_offset = 0
offset = 1000
while True:
chunk = song[current_offset:current_offset+offset]
current_offset += offset
websocket.send(chunk.raw_data)
Ответы (1 шт):
Автор решения: FlashlightED
→ Ссылка
Проблема решается добавлением опции -re к запуску ffmpeg:
ffmpeg -re -i - ffmpeg.ogg
И при отправке чанков сначала кодируем каждый чанк в ogg, используя pydub:
data = chunk.export('bin/chunk.ogg', 'ogg').read()
await websocket.send(data)