실시간 업데이트를 통해 출력에서 ​​용어를 강조 표시하는 방법은 무엇입니까?

실시간 업데이트를 통해 출력에서 ​​용어를 강조 표시하는 방법은 무엇입니까?

저는 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) 줄 끝으로 인쇄되는 진행 정보 때문임이 거의 확실합니다. 이는 각각의 새로운 진행 업데이트가 이전 진행 업데이트를 중복 인쇄할 수 있도록 하기 위해 수행됩니다.

불행하게도 이것은 의미완전한 세트진행률 업데이트는 다른 모든 행 기반 도구와 함께 한 줄로 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원하는 작업을 더 정확하게 수행하기 위해 수정하고 싶을 수도 있습니다 .

관련 정보