Команда Linux tee с несколькими fifo. фифо блоки тройник

Я пытаюсь разработать одну программу для воспроизведения и записи некоторых потоков RTMP. Программа разработана на Qt.

Я использую rtmpdump и mplayer. поскольку оба работают в отдельном процессе, я использую FIFO для передачи потока из rtmpdump в mplayer. Мне нужен отдельный процесс, потому что mplayer должен контролироваться пользователем. так что mplayer работает в подчиненном режиме.

это отлично работает для воспроизведения потока.

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

теперь поток течет вот так

rtmpdump | tee fifo_for_playing fifo_for recording 

один mplayer читает fifo_for_playing, а другой - fifo_for_recording.

Теперь проблема в том, что, поскольку mplayer, который должен записывать, запустится только тогда, когда пользователь нажмет кнопку записи, fifo_for_recording заблокирует тройник, поскольку он не открывается. так что играть тоже не начнется.

Кто-нибудь может предложить решение или лучший способ добиться этого? я пытаюсь сделать тройник с неблокирующим фифо. так что даже если один фифо не открыт для чтения, он не заблокирует тройник ..


person user937065    schedule 08.04.2013    source источник


Ответы (1)


У Fifos нет буфера (или он очень маленький). Если вы пишете в него, и никто не читает, вы блокируете, как вы выясняете.

Вы можете написать небольшую программу для чтения FIFO и буферизации его в памяти или на диске. Может программа dd это умеет?

Или вы можете вызвать rtmpdump с параметром -stop в цикле и заставить его записывать свой вывод в файл. Затем обработайте файлы по старинке без FIFO.

person Emery Lapinski    schedule 03.05.2014