リアルタイムアップデートで出力で用語を強調表示する方法は?

リアルタイムアップデートで出力で用語を強調表示する方法は?

私は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必要な作業をより正確に行うために変更したい場合があります。

関連情報