我有一个持续 10 分钟的视频,我想将其切成五个 2 分钟的片段。
我可以使用 ffmpeg 将视频剪切到特定时间,如下所示:
ffmpeg -sameq -ss [start_seconds] -t [duration_seconds] -i [input_file] [outputfile]
Run Code Online (Sandbox Code Playgroud)
我是否首先必须获得视频的长度,然后重复上述命令,还是有更简单的方法来做到这一点?
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)。
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)
| 归档时间: |
|
| 查看次数: |
13476 次 |
| 最近记录: |