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標準入力を使ってこれを行うことは私に少し古い学校のように感じます。名前付きパイプをffmpegへの入力として直接提供し、現在のデータの終わりに達した後に新しいデータを待機させる方法はありますか?

ありがとうございます!

ベストアンサー1

書き込みのために他の場所で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します。catecho

おすすめ記事