我正在使用一个程序,该程序在运行时将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
但是使用stdin做到这一点对我来说有点不客气。有没有一种方法可以直接将命名管道作为ffmpeg的输入,并让其在到达当前数据末尾时等待新数据?
谢谢!
只需打开该fifo即可从另一个地方进行书写(并保持打开状态)。例子:
在一个窗口中:
mkfifo /tmp/test.mts
exec 7<>/tmp/test.mts
ffmpeg -i /tmp/test.mts out.mp4
在另一个窗口中:
cat ... >/tmp/test.mts
cat ... >/tmp/test.mts
这样的想法是,在打开了要写入的所有进程都将其关闭之前,阅读器不会从管道中接收到EOF:
$ mkfifo /tmp/fifo
$ cat /tmp/fifo &
[1] 26437
$ exec 7>/tmp/fifo
$ echo yes >/tmp/fifo
yes
$ echo yes >/tmp/fifo
yes
$ echo yes >/tmp/fifo
yes
$ exec 7>&-
$
[1]+ Done cat /tmp/fifo
如果没有exec 7>/tmp/fifo
这使打开的句柄到书写结束/tmp/fifo
时,cat
将第一后已终止echo
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句