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

Mik*_*aum 6 python video ffmpeg

在尝试执行的操作中,我需要删除视频文件的某些部分,然后从中创建一个新文件。

例如,从这样的视频文件中:

===================
Run Code Online (Sandbox Code Playgroud)

我切了两次

======||=====||||==
Run Code Online (Sandbox Code Playgroud)

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

=============
Run Code Online (Sandbox Code Playgroud)

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

如果我只想切割一部分,我会做:

ffmpeg -i video.mp4 -ss 00:00:03.500 -to 00:00:08.500 -async 1 cut.mp4 -y
Run Code Online (Sandbox Code Playgroud)

哪个完美。我也许可以这样做很多次,然后将所有片段合并在一起……但是对于较大的视频文件,这是非常低效的。

要进行两次切割,我正在查看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'
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我什至尝试使用ffmpeg-python https://github.com/kkroening/ffmpeg-python在Python中做到这一点,但我也无法获得音频。

谁能在这方面给我一些帮助?非常感谢你!!

Gya*_*yan 9

选择过滤器对此更好。

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
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么我们需要 setpts=N/FRAME_RATE/TB ? (2认同)
  • 对于平滑时间戳,即时间间隔相等的帧。 (2认同)