라이브 파이핑 및 필터링 bash 출력

라이브 파이핑 및 필터링 bash 출력

ffmpegBash에서 몇 가지 명령(기본적으로 몇 가지 명령)을 실행하고 있으며 해당 명령을 사용 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

expectunbuffer이 문제를 해결하는 데 사용할 수 있는 도구가 제공됩니다 . 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 ,

관련 정보