使用 FFMpeg 将视频剪辑成 2 分钟的片段

使用 FFMpeg 将视频剪辑成 2 分钟的片段

我有一个 10 分钟的视频,我想将其剪辑成五个 2 分钟的片段。

我可以使用 ffmpeg 将视频剪切到特定时间,如下所示:

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

我是否必须先获取视频的长度,然后重复上述命令,或者有没有更简单的方法来做到这一点?

答案1

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 大小 - 这需要您知道视频的帧速率。如果您的视频的帧速率为 25 fps,那么 120*25=3000 的 GOP 每两分钟将获得一个关键帧;显然,这太少了!将其减少到 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)。

答案2

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

相关内容