実行中に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
します。cat
echo