ffmpeg 스크립트 - 비디오를 여러 조각으로 분할

ffmpeg 스크립트 - 비디오를 여러 조각으로 분할

현재 ffmpeg를 사용하여 비디오 파일을 슬라이스하고 있습니다. 이라는 스크립트를 통해 프로세스를 자동화했습니다 ffmpeg_split.sh. 스크립트를 보려면여기. 스크립트를 실행하면 parse_duration_info(). 발생한 오류는 다음과 같습니다.Bad input to parse_duration_info()

스크립트를 사용하여 비디오를 분할하는 구문은 다음과 같습니다.ffmpeg_split.sh -s test_vid.mp4 -o video-part%03d.mp4 -c 00:00:08

Flags: 
-s  Path to video source (string)

-o  Path to output file with format (string)
    Format must be printf-like, for example ./path/video-part-%03d.avi

-c  Chunk length in seconds (integer)

질문은 다음과 같습니다.이것은 완전한 스크립트입니다

function parse_duration_info() {
    if [[ $1 ]] && [[ $2 -gt 0 ]] && [[ $2 -lt 5 ]] ; then
        __OFFSET=$2
        __DURATION_PATTERN='\([0-9][0-9]\):\([0-9][0-9]\):\([0-9][0-9]\)\.\([0-9][0-9]\)'
        echo "$1" | sed "s/$__DURATION_PATTERN/\\$__OFFSET/"
    else
        echo "Bad input to parse_duration_info()"
        echo "Givven duration $1"
        echo "Givven offset $2"
        echo "Exiting..."
        exit 1
    fi
}

답변1

실패한 이유를 확인하려면 이 스크립트를 조금 분석해야 합니다. 이미 소스 코드가 있으므로 이는 어려운 작업이 아닙니다. 먼저 함수 구현의 명령이 get_video_duration_in_seconds_from_file()올바른지 확인하고 싶습니다. 특히, 내가 가지고 있는 몇 가지 파일에 대해 이 명령을 실행하면 .mp4아무것도 반환되지 않습니다.

__DURATION_HMS=$(ffmpeg -i "$__FILE" 2>&1 | grep Duration | \
    grep '\d\d:\d\d:\d\d.\d\d' -o)

노트:54번째 줄입니다.

따라서 그러한 값이 없으면 해당 값 이후에 함수를 호출하면 오류 메시지가 반환되는 parse_duration_info()이유가 됩니다.

원본 스크립트의 설명에 따르면 매개변수가 2개 있어야 합니다 parse_duration_info().

# arg1: duration in format 01:23:45.67
# arg2: offset for group 1 gives hours, 2 gives minutes, 
#       3 gives seconds, 4 gives milliseconds

추가 디버그 출력

또한 #!/bin/bashshebang( ) 뒤에 이 줄을 추가하면 이 스크립트에서 더 자세한 출력을 활성화할 수 있습니다.

set +x

전체 스크립트에 대해 전체 상세 정보 표시를 활성화하는 것이 너무 많은 경우 다음과 같이 특정 코드 블록 주위에서 선택적으로 활성화할 수 있습니다.

parse_duration_info() {
    set +x

    ... body of function ...

    set -x
}

답변2

이 시도:

__DURATION_HMS=$(ffmpeg -i "${FILE}" 2>&1 | grep Duration | \ grep -e '[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}' -o)

관련 정보