Ffmpeg
當ffmpeg到達命名管道的末尾時,如何阻止它退出?
我正在使用一個程序,它在執行時連續將 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 以進行寫入(並保持打開狀態)。例子:
在一個視窗中:
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
which 保持對 的寫入結束的打開句柄/tmp/fifo
, thecat
將在第一個 之後終止echo
。