FFMpeg를 사용하여 비디오를 2 분 클립으로 자르기


5

10 분 동안 지속되는 비디오가 있는데 5 분짜리 세그먼트 5 개로 잘라 내고 싶습니다.

ffmpeg를 사용하여 다음과 같이 특정 시간으로 비디오를자를 수 있습니다.

ffmpeg -sameq -ss [start_seconds] -t [duration_seconds] -i [input_file] [outputfile]

먼저 비디오 길이를 구한 다음 위의 명령을 반복해야합니까, 아니면 더 간단한 방법이 있습니까?

답변:


8
ffmpeg -i input.mp4 -map 0 -c copy -f segment -segment_time 120 -reset_timestamps 1 out%02d.mp4

... 'out01.mp4'out02.mp4 '줄을 따라 파일을 생성합니다. 각 파일은 지속 시간이 120 초입니다 (마지막 파일은 더 짧을 수 있음). 키 프레임에서 파일을 분할해야하므로 100 % 정확한 분할을 얻을 수 없습니다. 세그먼트 설명서를 참조하십시오 .

다시 인코딩하려는 경우을 사용하여 정확한 분할을 얻을 수 있습니다 -force_key_frames. 120 초마다 키 프레임을 강제 실행하고 세그먼트를 사용하여 분할하려면 :

ffmpeg -i input.mp4 -map 0 -c:v libx264 -preset veryfast -crf 22 -c:a libfdk_aac -vbr 3 \
-force_key_frames expr:gte(t,n_forced*120) -f segment -segment_time 120 -reset_timestamps 1 out%02d.mp4

또는 -gGOP 크기를 설정하는 데 사용할 수 있습니다. 이를 위해서는 비디오의 프레임 속도를 알아야합니다. 비디오의 프레임 속도가 25fps 인 경우 GOP 120 * 25 = 3000은 2 분마다 하나의 키 프레임을 갖습니다. 분명히 이것은 너무 적습니다! 300으로 줄이면 더 합리적이며 필요한 곳에 키 프레임이 제공됩니다.

ffmpeg -i input.mp4 -map 0 -c:v libx264 -preset veryfast -crf 22 -c:a libfdk_aac -vbr 3 \
-g 300 -f segment -segment_time 120 -reset_timestamps 1 out%02d.mp4

ffmpeg가 지원하는 특정 코덱은 내 버전과 다를 수 있습니다 (소스에서 컴파일하지 않으면 libfdk_aac이 없을 것입니다).


1
i=-120
infile=<inputfile>
while [[ "$?" == "0" ]]; do \
    ((i+=120)) \
    ffmpeg -ss $i -t 120 -i $infile ${infile/.mpg/.$((i/120)).mpg} \
done

감사. 이것에 대한 설명 : ${infile/.mpg/.$((i/120)).mpg}?
DocWiki

infile의 확장자가이라고 가정하면 .mpg, 이름이 다음과 같은 출력 파일을 생성해야합니다.infile.0.mpg infile.1.mpg infile.2.mpg ...
blahdiblah

일부 검사는 ffmpeg것을 알 $?조건이 있기 때문에 어쨌든 명중하지 않을 ffmpeg경우 상관하지 않는다 -ss범위를 벗어났습니다. 비디오의 길이를 찾거나 출력 파일이 비어 있지 않은 것을 기반으로 종료 조건을 변경하는 것은 독자의 연습으로 남아 있습니다.
blahdiblah

좋은 운동! MIN =ffmpeg -i ${1} 2>&1 | grep "Duration" | cut -d ' ' -f 4 | sed s/,// | cut -d ":" -f 2
DocWiki

내 코드는 다음과 같습니다. stackoverflow.com/questions/6631971/… 일부 오류를 수정할 수 없습니다.
DocWiki
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.