FFmpeg - 修剪开始和结束固定数量

Mat*_*kie 9 video ffmpeg video-conversion

这里的专业视频编辑器不擅长 FFmpeg,所以请耐心等待。我有大量视频,长度各不相同,我想在开始时将它们剪裁 10 秒,在结尾剪裁 10 秒。

我知道有一个“-sseof”命令可以根据视频的结尾查找时间码。但是,我只能得到它最后给我的部分,而不是指定时间之前的部分。例如,这只是给我最后 10 秒:

ffmpeg -sseof -10 -i test.mp4 outputB.mp4

我想要完全相反的,一切都到最后 10 秒。

而且我真的很想从一开始就将它与修剪结合起来。我的理想公式如下所示:

ffmpeg -i test.mp4 -ss 10 -to -sseof -10 output.mp4

但这不起作用。有什么建议?谢谢!

编辑:

Mulvya 建议的解决方案对我有用!这是我用来在整个文件夹上运行脚本的公式,从每个剪辑的开头剪下 4.25 秒,从每个剪辑的结尾剪掉 17.8 秒(这些值需要在几个地方更改,但它有效)。

for file in *.mp4; do ffmpeg -i $file -filter_complex "[0]split[s1][s2]; [s1]trim=4.25,setpts=PTS-STARTPTS,fifo[bv]; [s2]trim=4.25,setpts=(PTS-STARTPTS)+17.8/TB,fifo[v]; [bv][v]overlay=shortest=1,trim=17.8,setpts=PTS-STARTPTS[fv]; [0]volume=0[b];[0]adelay=17800|17800[a]; [b][a]amix=duration=first,volume=2,atrim=22.05,asetpts=PTS-STARTPTS[fa]" -map "[fv]" -map "[fa]" "${file%.mp4}-trimmed.mp4"; done

非常感谢!

Gya*_*yan 9

有一种理智的方法可以做到这一点,也有一种疯狂的方法。明智的方法是事先在单独的命令中探测持续时间,并使用该信息塑造您的实际修剪命令。

探测命令:

ffprobe -v 0 -show_entries format=duration -of compact=p=0:nk=1 in.mp4
Run Code Online (Sandbox Code Playgroud)

这将产生单行输出:

194.834000
Run Code Online (Sandbox Code Playgroud)

所以,你的命令现在是

ffmpeg -ss 10 -t 174.834 -i test.mp4 outputB.mp4
Run Code Online (Sandbox Code Playgroud)

在哪里 t = total duration - 20 sec


疯狂的方式更慢,但只有一个命令。

ffmpeg -i in.mp4 -filter_complex
       "[0]split[s1][s2];
        [s1]trim=10,setpts=PTS-STARTPTS,fifo[bv];
        [s2]trim=10,setpts=(PTS-STARTPTS)+10/TB,fifo[v];
        [bv][v]overlay=shortest=1,trim=10,setpts=PTS-STARTPTS[fv];
        [0]volume=0[b];[0]adelay=10000|10000[a];
        [b][a]amix=duration=first,volume=2,atrim=20,asetpts=PTS-STARTPTS[fa]"
-map "[fv]" -map "[fa]" trimmed.mp4
Run Code Online (Sandbox Code Playgroud)

  • +1 用于展示如何在不使用 grep 和 sed 的情况下获取长度 (2认同)