2016-05-06 4 views
0

ПроблемыЛучшего способ трубных кусков аудио и видео внутри питона для FFmpeg

Я получаю аудио и видео ломти от стороннего сервера, и я хотел бы направить эти куски в FFmpeg, чтобы создать WebM живой эфир в соответствии с этими инструкциями:

http://wiki.webmproject.org/adaptive-streaming/instructions-to-do-webm-live-streaming-via-dash

Здесь они используют вход с веб-камеры и микрофона, но мне нужно использовать куски данных, поэтому команда FFmpeg будет выглядеть как-то так:

cmd = [ 
     "ffmpeg", 
     "-f", "flv", "-i", "video.fifo", 
     "-f", "s16le", "-ar", "16000", "-ac", "1", "-i", "audio.fifo", 
     "-map", "0:0", 
     "-pix_fmt", "yuv420p", 
     "-c:v", "libvpx-vp9", 
     "-s", "640x480", "-keyint_min", "40", "-g", "40", "-speed", "6", 
     "-tile-columns", "4", "-frame-parallel", "1", "-threads", "8", 
     "-static-thresh", "0", "-max-intra-rate", "300", 
     "-deadline", "realtime", "-lag-in-frames", "0", 
     "-error-resilient", "1", 
     "-b:v", "3000k", 
     "-f", "webm_chunk", 
     "-header", self.video_header, 
     "-chunk_start_index", "1", 
     "video_360_%d.chk", 
     "-map", "1:0", 
     "-c:a", "libvorbis", 
     "-b:a", "16k", "-ar", "16000", 
     "-f", "webm_chunk", 
     "-audio_chunk_duration", "2000", 
     "-header", self.audio_header, 
     "-chunk_start_index", "1", 
     "audio_171_%d.chk" 
    ] 

Как вы можете видеть, я использую файл «video.fifo» и «audio.fifo», потому что я подумал, что было бы неплохо протрубить куски через именованный канал, но я могу " t заставить его работать. Вот что я делаю:

p = subprocess.Popen(cmd) 
fa = os.open("video.fifo", os.O_WRONLY) 
fv = os.open("audio.fifo", os.O_WRONLY) 

Так я первый запуск подпроцесс, так что он открывает ФИФО файлы для чтения. После этого я должен был бы открыть их для написания, но это не так. В частности, я могу открыть первый, но не второй. Возможно, это связано с тем, как ffmpeg обрабатывает свои входы, если их несколько, но я просто не знаю.

Вопрос

Как я могу либо решить проблему, не являющихся открывающихся именованных каналов или как я могу добиться того, чего я хотел достичь без именованных каналов.

ответ

0

Инструкции по вашей ссылке советуют использовать ffmpeg в фоновом режиме. С FFmpeg человека страницы:

-stdin

Включить взаимодействие со стандартным вводом. По умолчанию, если в качестве входа не используется стандартный ввод. Чтобы явно отключить взаимодействие, вам необходимо указать «-nostdin».

Отключение взаимодействия на стандартном входе полезно, например, если ffmpeg находится в фоновой группе процессов. Примерно такой же результат можно достичь с помощью «ffmpeg ... </dev/null« но для этого требуется оболочка.

У меня была аналогичная проблема не так давно. При работе с несколькими входами ffmpeg будет работать, как ожидалось, в первый раз, а затем запускать ошибки при каждом запуске. Добавление -nostdin к вашим глобальным аргументам или </dev/null должно исправить эту проблему. Лишенный всех колоколов, каждый из них должен работать.

ffmpeg [in-args][input][out-args][output] & </dev/null

ffmpeg [-nostdin in-args][input][out-args][output] &

Надеется, что это помогает.