현재 폴더 및 하위 디렉터리에 있는 모든 비디오 파일의 총 재생 시간을 얻는 방법

현재 폴더 및 하위 디렉터리에 있는 모든 비디오 파일의 총 재생 시간을 얻는 방법

현재 디렉터리와 하위 디렉터리에서 .mp4로 끝나는 파일 묶음의 지속 시간을 얻으려고 합니다. ffprobe를 사용하려고 합니다. 단순화를 위해 find를 사용하는 대신 ls를 사용합니다. 기간을 초 단위로만 나열해도 괜찮을 것입니다. 모든 내용을 요약하는 것은 아마도 제 범위를 벗어나기 때문입니다!

나의 현재 노력은 다음과 같습니다.

 ls -a * |grep .mp4$|xargs ffprobe

이라고 볼 수 있다

입력 파일 이름으로 "SomeVideo.mp4" 매개 변수가 제공되었지만 "DifferentVideo.mp4"가 지정되었습니다.

어떻게 해야 하나요? ffprobe는 한 번에 하나의 파일만 처리할 수 없나요?

답변1

그리고 exiftool:

$ exiftool -ext mp4 -r -n -q -p '${Duration;$_ = ConvertDuration(our $total += $_)}' . | tail -n 1
4 days 22:14:59

주로 다른 점은매우 유사한 질문에 대한 @don_cristi의 답변, 이는 EXIFtool이 향상된 기능을 갖춘 파일을 -r -ext mp4재귀적으로 검색할 수 있게 해줍니다 .extr

답변2

기본 요구 사항에 따라 파일을 반복하여 한 번에 하나씩 전달해야 합니다 ffprobe. 이렇게 하면 시간, 분, 초 단위로 기간을 얻을 수 있습니다.

for mp4 in *.mp4
do
    echo "Processing $mp4"
    ffprobe "$mp4" 2>&1 | awk '/Duration/ {print $2}'
done

좀 둘러봐좀 더 조심스럽게ffprobe, 초를 직접 전달할 수 있습니다

for mp4 in *.mp4
do
    echo "Processing $mp4"
    ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$mp4"
done

일단 그렇게 하고 나면, 그것들을 모두 합치는 것은 큰 도약이 아닙니다.

for mp4 in *.mp4
do
    echo "Processing $mp4"
    ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$mp4"
done |
    awk -F '
        { sec += $1 }                                                # Total time (seconds)
        END {
            h = int(sec / 3600);                                     # Hours
            m = int((sec - (h*3600)) / 60);                          # Minutes
            s = sec - (h*3600) - (m*60);                             # Seconds
            printf "%d (%d hour, %d min, %d sec)\n", sec, h, m, s    # Print the result
        }
    '

마지막으로 현재 디렉터리의 파일뿐만 아니라 모든 하위 디렉터리의 파일도 처리하도록 외부 루프를 수정합니다. 다음 으로 일치하는 하위 디렉터리를 허용하는 bash기능을 사용하세요.**

shopt -s globstar                                                    # Enable extended globbing
for mp4 in **/*.mp4
do
    echo "Processing $mp4"
    ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$mp4"
done |
    # Continue as before...

답변3

xargs명령에 가능한 한 많은 입력 매개변수를 추가합니다. 단일 파일의 한계는 알 수 없습니다.ffprobe

ffprobe입력당 한 번 실행 하려면 다음을 사용하십시오.

 ... | xargs -l ffprobe 

또는

 ... |  xargs -L 1 ffprobe

이해하려면 이 두 명령의 출력을 비교해 보세요.

  seq 1 3 | xargs echo
  seq 1 3 | xargs -l echo

-output을 입력으로 사용하는 것은 ls여러 가지 이유로 권장되지 않습니다.

사용하는 것이 더 좋습니다 find- 단순화하려는 노력에도 불구하고 NULL특수 문자 문제를 피하기 위해 구분 기호를 사용하는 것이 더 좋습니다.

find -maxdepth 1 -name '*mp4' -print0 | xargs -0 ffprobe

ffprobe다음 질문은 - get Seconds only는 did의 출력과 같습니다.여기. 그런 다음 awk예를 들어 다음 을 사용하여 요약할 수 있습니다 .

관련 정보