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
非常感谢!
有一种理智的方法可以做到这一点,也有一种疯狂的方法。明智的方法是事先在单独的命令中探测持续时间,并使用该信息塑造您的实际修剪命令。
探测命令:
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)
| 归档时间: |
|
| 查看次数: |
9416 次 |
| 最近记录: |