web-dev-qa-db-ja.com

bashを使用してFFmpeg端末出力を読み取る

実行時にFFmpegによって生成された端末からの出力テキストを読み取る方法について少し質問があります。カメラが配置されている場所でインターネット接続の問題が発生すると、カメラストリームを備えたストリーミングサーバーがあり、破損したりドロップしたりすることがあります。このストリームはwhileループによってチェックされ、接続が完全に切断されると、ループはストリームを再起動しようとします。

ただし、場合によっては、パケットが大幅に失われると、ストリームが破損しますが、完全には停止しません。 FFmpegエンコーディングがハングし、サーバーへの接続が切断されません。 (私の「再起動」ループは役に立たない)。これが発生すると、ビデオのFPSが低い値に下がり始め、その値をキャプチャして必要なアクションを実行する必要があります。

その情報を含むその行は次のようになります。

frame=74190 fps= 20 q=0.0 size=  285208kB time=01:01:49.45 bitrate= 629.9kbits/s

したがって、fps= 20の値が18以下に低下した場合、適切なアクションが実行されます。何を使用する必要がありますか? grepにパイピングしようとしましたが、成功しませんでした。

進歩を遂げるための解決策やヒントをいただければ幸いです。

1
Pavol

Ffmpegの出力はstderrではなくstdoutに書き込まれることに注意してください( これは何ですか? )。

grep ffmpegのログ出力が必要な場合は、最初にstderrからstdoutにすべてをパイプする必要があります。これは、Bashでは次の方法で実行できます。

ffmpeg … 2>&1 | grep …

ただし、サーバーからプロセスを実行している場合は、代わりに出力をログファイルに転送し、必要に応じてこれをgrepすることをお勧めします。

ffmpeg … 2>&1 > /var/log/ffmpeg.log
grep "fps=…" /var/log/ffmpeg.log

> /var/log/ffmpeg.logを新たに呼び出すたびに、その特定のファイルが切り捨てられ、シェルによって書き換えられることに注意してください。代わりに>>を使用して、既存のファイルに追加できます。

3
slhck