私はffmpegを使って複数のビデオを変換しており、ffmpeg出力でいくつかの用語を強調したいと思います。しかし、私が試したソリューションは、常にリアルタイム変換の進行状況を消滅させました。
私が試したのは、主にstderrをstdoutにリダイレクトし、次にgrepまたはackをリダイレクトすることでした(ffmpegのコマンドは読みやすくするために単純化されました)。
ffmpeg -i input.mp4 ouput.mkv 2>&1 | ack --passthru --color "pcm_s16le|aac"
または
ffmpeg -i input.mp4 ouput.mkv 2>&1 | grep -E "pcm_s16le|aac|$"
(|$
パスのように色を付けずにすべてのアイテムを一致させることができるトリックに注意してください。)
リアルタイム進行情報とは、次の内容を意味します。
frame=190 fps=3.7 q=-0.0 size=308kB time=06:08.66 bitrate=677kbits/s speed=0.17x
出力単語の一部を強調表示する方法はありますか?そしてリアルタイムの進捗状況を確認しますか?
答え1
あなたが見ている問題は、従来のUnix LF(改行、ASCII 10)の代わりにCR(キャリッジリターン、ASCII 13)行の終わりに印刷される進行情報によるものであることはほとんど明らかです。これは、各新しい進捗状況の更新が以前の進捗状況の更新を重複して印刷できるようにするために行われます。
残念ながら、これは意味完全なセット進行状況の更新は、他のすべての行ベースのツールと一緒に1行でgrep
処理されます。ack
これが「ロック」のように見え、ffmpeg
完了するまで何も印刷しない理由であり、標準のUnixラインベース以外の同様のハイライトツールを考えることはできません。
あなたできる次のようにしてみてください。
ffmpeg ... | tr \\015 \\012 | grep ...
すべてのCRをLFに変換します。これを通してgrep
他。各進捗状況の更新を別々の行として処理してください。より各更新を端末に別々の行で入力します。
frame= 85 fps=0.0 q=28.0 size= 0kB time=00:00:03.79 bitrate= 0.1kbits/s dup=1 drop=0 speed=7.55x
frame= 129 fps=129 q=28.0 size= 0kB time=00:00:05.65 bitrate= 0.1kbits/s dup=1 drop=0 speed=5.64x
frame= 172 fps=111 q=28.0 size= 256kB time=00:00:07.42 bitrate= 282.6kbits/s dup=1 drop=0 speed=4.81x
frame= 213 fps=104 q=28.0 size= 512kB time=00:00:09.17 bitrate= 457.3kbits/s dup=1 drop=0 speed=4.49x
frame= 254 fps= 99 q=28.0 size= 512kB time=00:00:10.85 bitrate= 386.3kbits/s dup=1 drop=0 speed=4.22x
frame= 295 fps= 96 q=28.0 size= 768kB time=00:00:12.56 bitrate= 500.7kbits/s dup=1 drop=0 speed=4.08x
frame= 333 fps= 93 q=28.0 size= 1024kB time=00:00:14.14 bitrate= 593.1kbits/s dup=1 drop=0 speed=3.94x
frame= 382 fps= 93 q=28.0 size= 1024kB time=00:00:16.19 bitrate= 518.1kbits/s dup=1 drop=0 speed=3.93x
frame= 428 fps= 93 q=28.0 size= 1280kB time=00:00:18.11 bitrate= 579.0kbits/s dup=1 drop=0 speed=3.92x
frame= 473 fps= 92 q=28.0 size= 1536kB time=00:00:20.00 bitrate= 628.9kbits/s dup=1 drop=0 speed=3.91x
frame= 519 fps= 92 q=28.0 size= 1536kB time=00:00:21.93 bitrate= 573.8kbits/s dup=1 drop=0 speed= 3.9x
frame= 567 fps= 92 q=28.0 size= 1792kB time=00:00:23.91 bitrate= 613.9kbits/s dup=1 drop=0 speed=3.89x
frame= 601 fps= 90 q=28.0 size= 2048kB time=00:00:25.32 bitrate= 662.6kbits/s dup=1 drop=0 speed= 3.8x
frame= 637 fps= 89 q=28.0 size= 2304kB time=00:00:26.83 bitrate= 703.3kbits/s dup=1 drop=0 speed=3.75x
frame= 684 fps= 89 q=28.0 size= 2304kB time=00:00:28.77 bitrate= 655.9kbits/s dup=1 drop=0 speed=3.74x
frame= 720 fps= 84 q=-1.0 size= 2924kB time=00:00:30.01 bitrate= 798.0kbits/s dup=1 drop=0 speed= 3.5x
...
最大応答性のために、このパイプラインのコンポーネント間のstdioバッファリングを無効にすることもできます。
stdbuf -o0 ffmpeg ... 2>&1 | stdbuf -i0 -o0 tr \\015 \\012 | stdbuf -i0 -o0 grep ...
答え2
Adrianの答えはとても役に立ちましたが、会話を失いました。
File 'output.mkv' already exists. Overwrite ? [y/N]
このツールを使用すると、ログファイルを
vialog
使用してもxterm
常に機能するようにできます。stdbuf -o0 vialog ffmpeg -t 10 -i input.mp4 output.mkv | stdbuf -i0 -o0 tr -s '\015' '\012' | stdbuf -i0 -o0 grep --color -e 'time' -e 'speed' -e 'Audio:' -e 'Video:' -e '$'
xterm
ウィンドウとの会話ターミナルウィンドウで
vialog
開始する場所を強調表示します(これはコンソールウィンドウになりますxterm
)。
vialog
このリンクからツールを見つけることができます。[遅い]コマンドラインプロセスに注意が必要な場合は目を覚ますでしょうか?
vialog
必要な作業をより正確に行うために変更したい場合があります。