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

Doc*_*iki 5 ffmpeg

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

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

ffmpeg -sameq -ss [start_seconds] -t [duration_seconds] -i [input_file] [outputfile]
Run Code Online (Sandbox Code Playgroud)

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

evi*_*oup 9

ffmpeg -i input.mp4 -map 0 -c copy -f segment -segment_time 120 -reset_timestamps 1 out%02d.mp4
Run Code Online (Sandbox Code Playgroud)

...将沿着'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
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用-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
Run Code Online (Sandbox Code Playgroud)

您的 ffmpeg 版本支持的特定编解码器可能与我的不同(除非您从源代码编译,否则您将没有 libfdk_aac)。


bla*_*lah 1

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