我正在尝试开发一个程序来播放和录制一些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将阻止tee,因为它未打开。所以打也不会开始。
任何人都可以提出解决方案或更好的方法来实现这一目标吗?我想要做的是与非阻挡fifo发球。所以即使一个fifo没有打开阅读,它也不会阻挡发球台。
答案 0 :(得分:0)
Fifos没有缓冲区(或者如果它们有一个非常小的缓冲区)。如果你写信给它并且没有人正在读你,你正在发现它。
您可以编写一个小程序来读取fifo并将其缓冲在内存或磁盘中。也许dd程序可以做到这一点?
或者你可以在循环中使用-stop选项调用rtmpdump,并将其输出写入文件。然后在没有fifo的情况下以老式的方式处理文件。