具有多个fifo的Linux tee命令。先进先出三通

具有多个fifo的Linux tee命令。先进先出三通,linux,nonblocking,fifo,tee,mplayer,Linux,Nonblocking,Fifo,Tee,Mplayer,我正在尝试开发一个程序来播放和录制一些rtmp流。该程序是用Qt开发的 我正在使用rtmpdump和mplayer。由于两者都在单独的进程中运行,所以我使用fifo将流从rtmpdump传递到mplayer。我需要单独的进程,因为mplayer需要由用户控制。所以mplayer在从属模式下运行 这对播放流很有效 现在我想将流记录到另一个文件中。我知道我可以使用mplayer来实现这一点。但是使用单个mplayer是不可能的,因为它只支持播放或录制。因此,考虑使用tee命令分割流,并使用2个mpl

我正在尝试开发一个程序来播放和录制一些rtmp流。该程序是用Qt开发的

我正在使用rtmpdump和mplayer。由于两者都在单独的进程中运行,所以我使用fifo将流从rtmpdump传递到mplayer。我需要单独的进程,因为mplayer需要由用户控制。所以mplayer在从属模式下运行

这对播放流很有效

现在我想将流记录到另一个文件中。我知道我可以使用mplayer来实现这一点。但是使用单个mplayer是不可能的,因为它只支持播放或录制。因此,考虑使用tee命令分割流,并使用2个mplayer进程,一个用于录制,一个用于播放

现在溪流是这样流动的

rtmpdump | tee fifo_for_playing fifo_for recording 
一个mplayer正在读取fifo以进行播放,另一个正在读取fifo以进行录制

现在的问题是,由于本应记录的mplayer仅在用户按下记录按钮时才会启动,因此fifo\u for\u记录将阻止T形三通,因为T形三通未打开。所以比赛也不会开始


有人能提出一个解决方案或更好的方法来实现这一点吗?我想做的是用非阻塞fifo发球。因此,即使一个fifo没有打开进行读取,它也不会阻塞T形三通。

fifo没有缓冲区(或者如果它们有缓冲区,则缓冲区非常小)。如果你写信给它,而没有人在读,你就会阻止,正如你发现的那样

您可以编写一个小程序来读取fifo并将其缓冲在内存或磁盘中。也许dd程序可以做到这一点

或者您可以在循环中使用rtmpdump和-stop选项调用,并让它将输出写入文件。然后用老式的方式处理文件,不使用fifo