ライブパイピングとフィルタリング bash 出力

ライブパイピングとフィルタリング bash 出力

ffmpegBashはいくつかのコマンド(デフォルトではいくつかのコマンド)を実行しており、そのコマンドを使用してgrep結果awkをフィルタリングしています。このコマンドは時間がかかり、ビデオの再生中にいくつかの結果を出力し続けます。チューブもgrep同じです。ただし、awkパイプはコマンドが完了するのを待ってからすぐにすべてを印刷するので、これはうまくいきません。出力したいすぐに一致するものが見つかりました。

実行中にリアルタイムで結果を出力するようにこのコマンドをどのように変更できますか?

ffmpeg -i freeze.mp4 -vf "freezedetect=n=-60dB:d=2" -map 0:v:0 -f null - 2>&1 | grep freezedetect | awk '{print $4,$5}' | tr -d , | grep lavfi

答え1

標準ツールを使用してみてください。

ffmpeg -i freeze.mp4 -vf "freezedetect=n=-60dB:d=2" -map 0:v:0 -f null - 2>&1 |  stdbuf -o 0 grep freezedetect | stdbuf -o 0 awk '{print $4,$5}' | stdbuf -o 0 tr -d , | stdbuf -o 0 grep lavfi

答え2

expectunbufferこの問題を解決するために使用できるツールが提供されています。ffmpegパイプに通常含まれる4Kバッファを使用する代わりに、システムがインタラクティブであるかのように動作する擬似端末を使用して長期実行プロセスに接続します。

$ unbuffer ffmpeg [...] | grep [...] | awk [...]

また、 と 1 つのタスクをgrep組み合わせることができます。awk

代わりに:

[...] | grep freezedetect | awk '{print $4,$5}' | tr -d , | grep lavfi

代わりに、次のことができます。

[...] | awk '/freezedetect/ && ( $4 /lavfi/ || $5 /lavfi/ ) {print $4,$5}' | tr -d ,

関連情報