我正在使用一个程序,它在运行时连续将 MPEG-TS 视频数据写入文件。我希望它可以连续运行很多天。
我想使用 ffmpeg 实时转码此视频数据。为了使 .mts 文件在我用完硬盘空间之前不会持续增长,我试图让第一个程序写入命名管道并ffmpeg
从该管道读取。
我试过这样做ffmpeg -i /tmp/test.mts -c:v libx264 test.mp4
,但似乎 ffmpeg 一旦到达管道末端就会退出,而不是等待新数据。例如,如果我启动程序,等待 30 秒然后运行 ffmpeg,我只会得到大约 50 秒的视频。(30 秒 + ffmpeg 赶上的时间)
我已经设法让它工作了,ffmpeg -i pipe:0 -c:v libx264 test.mp4 < /tmp/test.mts
但这对我来说感觉有点hacky,使用标准输入来做到这一点。有没有一种方法可以直接提供命名管道作为 ffmpeg 的输入,并让它在到达当前数据末尾时等待新数据?
谢谢!
只需从另一个地方打开该 fifo 以进行写入(并保持打开状态)。例子:
在一个窗口中:
在另一个窗口中:
这个想法是读者不会从管道接收到EOF,直到所有打开它以进行写入的进程都关闭它:
如果没有
exec 7>/tmp/fifo
which 保持对 的写入结束的打开句柄/tmp/fifo
, thecat
将在第一个 之后终止echo
。