ffmpeg
Bashはいくつかのコマンド(デフォルトではいくつかのコマンド)を実行しており、そのコマンドを使用して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
expect
unbuffer
この問題を解決するために使用できるツールが提供されています。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 ,