使用 ffmpeg 剪切视频的多个部分

Posted

技术标签:

【中文标题】使用 ffmpeg 剪切视频的多个部分【英文标题】:Cut multiple parts of a video with ffmpeg 【发布时间】:2018-11-08 16:51:49 【问题描述】:

在我正在尝试做的事情中,我需要删除视频文件的某些部分,然后从中创建一个新部分。

例如,来自这样的视频文件:

===================

我做了两个切割

======||=====||||==

并生成一个新的更小的视频文件:

=============

当我说 2 时,我的意思是任意数量的单独剪辑,具体取决于视频文件。

如果我只想剪一部分,我会这样做:

ffmpeg -i video.mp4 -ss 00:00:03.500 -to 00:00:08.500 -async 1 cut.mp4 -y

效果很好。我也许可以这样做很多次,然后将所有剪辑拼接在一起......但这对于较大的视频文件来说效率非常低。

为了制作两个剪辑,我查看了 filter_complex。我已经尝试了好几个小时,但似乎无法正常工作:/

如果我做这样的事情,我会得到一个没有音频的视频:

command='ffmpeg -i video.mp4
                -filter_complex "[0]trim=start_frame=10:end_frame=20[v0];
                                 [0]trim=start_frame=30:end_frame=40[v1];
                                 [v0][v1]concat=n=2[v5]"
                -map [v5] -async 1 output.mp4'

如果我尝试这样做,事情就会一团糟:

ffmpeg -y -i video.mp4 
       -filter_complex "[0:v]trim=start_frame=10:end_frame=20[v0];
                        [0:a]atrim=start=10:end=20[a0];
                        [0:v]trim=start_frame=30:end_frame=40[v1];
                        [0:a]atrim=start=30:end=40[a1];
                        [v0][a0][v1][a1]concat=2:v=1:a=1[v5][a]" \
       -map [v5] -map [a] -async 1 output.mp4

我什至尝试在 Python 中使用 ffmpeg-python https://github.com/kkroening/ffmpeg-python 进行此操作,但我也无法让音频正常工作。

谁能帮我解决这个问题? 非常感谢!!

【问题讨论】:

附带说明,当在-i 选项之前使用-ss 时,ffmpeg 会尝试寻找该位置,而无需费心将每一帧解压缩到该点。 【参考方案1】:

选择过滤器更适合这个。

ffmpeg -i video \
       -vf "select='between(t,4,6.5)+between(t,17,26)+between(t,74,91)',
            setpts=N/FRAME_RATE/TB" \
       -af "aselect='between(t,4,6.5)+between(t,17,26)+between(t,74,91)',
            asetpts=N/SR/TB" out.mp4

select 及其对应的过滤器分别应用于视频和音频。选择的时间段是 4 到 6.5 秒、17 到 26 秒,最后是 74 到 91 秒。时间戳与 setpts 及其对应过滤器连续。

【讨论】:

非常感谢!正是我一直在寻找的!谢谢! 相关:给定两个相等长度的文件输入文件-i a.mp4 -i b.mp4,选择第一个文件几秒钟(视频5到8秒之间)-filter_complex "sendcmd='5-8 [enter] streamselect map 0, [leave] streamselect map 1',streamselect=map=1"你可以放一个@987654325 @ 之后,如果它们的分辨率不同。例如同一场景的多个角度,切到另一个角度然后切回。 (我没有使用astreamselect,所以它不会切换音频流,只切换视频。)docs 为什么我们需要 setpts=N/FRAME_RATE/TB ? 用于平滑时间戳,即时间间隔相等的帧。 是否有可能以任何方式改变它以使搜索工作尽快-ss...-to?使用 -ss 从长文件中剪切单个部分非常快。

以上是关于使用 ffmpeg 剪切视频的多个部分的主要内容,如果未能解决你的问题,请参考以下文章

在关键帧之间剪切视频而不使用ffmpeg重新编码完整视频?

ffmpeg - 视频部分的无缝交叉淡入淡出循环

视频精准剪切总结

三种方法使用FFmpeg截取视频片断

使用 FFMPEG 以最少的重新编码添加覆盖

ffmpeg视频剪切时长不正确