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 [...]
또한 및 를 하나의 작업으로 grep
결합 할 수 있습니다.awk
대신에:
[...] | grep freezedetect | awk '{print $4,$5}' | tr -d , | grep lavfi
대신 다음을 수행할 수 있습니다.
[...] | awk '/freezedetect/ && ( $4 /lavfi/ || $5 /lavfi/ ) {print $4,$5}' | tr -d ,