使用 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 剪切视频的多个部分的主要内容,如果未能解决你的问题,请参考以下文章