현재 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/bash
shebang( ) 뒤에 이 줄을 추가하면 이 스크립트에서 더 자세한 출력을 활성화할 수 있습니다.
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)