Linux中使用多个fifo的tee命令,fifo会阻塞tee。

5
我正在尝试开发一个程序来播放和记录一些RTMP流。该程序是在Qt中开发的。
我使用rtmpdump和mplayer。由于两者都在单独的进程中运行,所以我使用了一个fifo将流从rtmpdump传递到mplayer。我需要单独的进程,因为mplayer需要被用户控制,所以mplayer以slave模式运行。
对于播放流,这很好地工作了。
现在我想将流记录到另一个文件中。我知道可以使用mplayer来做到这一点。但是使用单个mplayer是不可能的,因为它只支持播放或录制其中之一。所以考虑使用tee命令来拆分流,并使用两个mplayer进程,一个用于录制,一个用于播放。
现在流程如下:
rtmpdump | tee fifo_for_playing fifo_for recording 

一个mplayer正在读取fifo_for_playing,另一个正在读取fifo_for_recording。
现在的问题是,既然只有当用户按下录制按钮时,应该录制的mplayer才会开始,因此fifo_for_recording将阻塞tee,因为它没有打开。 因此,播放也不会开始。
有人能提供解决方案或更好的方法来实现这一点吗? 我试图使用非阻塞FIFO进行分流。 因此,即使一个FIFO没有打开以供读取,它也不会阻止分流。
1个回答

1
Fifos没有缓冲区(或者如果有,它非常小)。如果你往里面写入数据而没有人来读取,你会被阻塞,就像你现在遇到的问题一样。
你可以编写一个小程序来读取fifo并将其缓存在内存或磁盘中。也许dd程序可以做到这一点?
或者你可以使用rtmpdump命令,并在循环中使用-stop选项,让它将输出写入文件。然后用传统的方式处理文件,而不是使用fifo。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接