Linux tee команда с несколькими fifo. футболка блоков fifo
Я пытаюсь разработать одну программу для воспроизведения и записать несколько потоков RTMP. Программа разработана в Qt.
я использую rtmpdump и mplayer. так как оба работают в отдельном процессе, я использую fifo для передачи потока из rtmpdump в mplayer. Мне нужен отдельный процесс, потому что mplayer должен контролироваться пользователем. так что mplayer работает в режиме slave.
это нормально работает для воспроизведения потока.
Теперь я хочу записать поток в другой файл. я знаю, что могу использовать mplayer для этого. но при использовании одного mplayer это невозможно, поскольку он поддерживает только воспроизведение или запись. поэтому подумал об использовании команды tee для разделения потока и использования процесса 2 mplayer, одного для записи и одного для воспроизведения.
теперь поток течет так
rtmpdump | tee fifo_for_playing fifo_for recording
один mplayer читает fifo_for_playing, а другой - fifo_for_recording.
Теперь проблема в том, что mplayer, который должен записывать, запустится только тогда, когда пользователь нажмет кнопку записи, fifo_for_recording заблокирует тройник, так как он не открыт. так что игра тоже не запустится.
Кто-нибудь может предложить решение или лучший способ добиться этого? то, что я пытаюсь сделать, это тройник с не блокирующим fifo. так что даже если один fifo не открыт для чтения, он не заблокирует тройник..
1 ответ
У файлов Fifos нет буфера (или, если он есть, он очень маленький). Если вы пишете в него, и никто не читает ваш блок, как вы узнаете.
Вы можете написать небольшую программу для чтения fifo и буферизации в памяти или на диске. Может быть, программа dd может это сделать?
Или вы можете вызвать с помощью rtmpdump с опцией -stop в цикле и записать вывод в файл. Затем обработайте файлы по старинке без fifo.