Ffmpeg

當ffmpeg到達命名管道的末尾時,如何阻止它退出?

  • November 22, 2018

我正在使用一個程序,它在執行時連續將 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/fifowhich 保持對 的寫​​入結束的打開句柄/tmp/fifo, thecat將在第一個 之後終止echo

引用自:https://unix.stackexchange.com/questions/483359