답변:
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
또는 -g
GOP 크기를 설정하는 데 사용할 수 있습니다. 이를 위해서는 비디오의 프레임 속도를 알아야합니다. 비디오의 프레임 속도가 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이 없을 것입니다).
i=-120
infile=<inputfile>
while [[ "$?" == "0" ]]; do \
((i+=120)) \
ffmpeg -ss $i -t 120 -i $infile ${infile/.mpg/.$((i/120)).mpg} \
done
.mpg
, 이름이 다음과 같은 출력 파일을 생성해야합니다.infile.0.mpg infile.1.mpg infile.2.mpg ...
ffmpeg
것을 알 $?
조건이 있기 때문에 어쨌든 명중하지 않을 ffmpeg
경우 상관하지 않는다 -ss
범위를 벗어났습니다. 비디오의 길이를 찾거나 출력 파일이 비어 있지 않은 것을 기반으로 종료 조건을 변경하는 것은 독자의 연습으로 남아 있습니다.
ffmpeg -i ${1} 2>&1 | grep "Duration" | cut -d ' ' -f 4 | sed s/,// | cut -d ":" -f 2
${infile/.mpg/.$((i/120)).mpg}
?