実行時に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
にパイピングしようとしましたが、成功しませんでした。
進歩を遂げるための解決策やヒントをいただければ幸いです。
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
を新たに呼び出すたびに、その特定のファイルが切り捨てられ、シェルによって書き換えられることに注意してください。代わりに>>
を使用して、既存のファイルに追加できます。