如何使用ffmpeg连接同一视频的片段


15

我有一个长长的视频,其中有不同的场景。我想使用ffmpeg 2.1.4从视频中提取并连接2个场景(这些场景不是从I帧开始的)。

为了争辩,说我要从01:00和02:00起5秒。

我可以做这个:

ffmpeg -ss 01:00 -i in.mkv -ss 02:00 -i in.mkv -filter_complex "
  [0:v]select='lt(t,5)'[v0];
  [0:a]aselect='lt(t,5)'[a0];
  [v0][a0][1:v][1:a]concat=n=2:v=1:a=1
" -c:a libvorbis -t 10 out.mkv

那给了我我想要的电影,但是选择实际上迫使ffmpeg解码电影的其余部分。那么,我如何告诉它截断第一部电影而不是对其进行解码?

如果可能的话,我宁愿使用ffmpeg复杂过滤器进行此操作。我知道我只能-t先对单独的电影进行重新编码,但是对于我来说,额外的编码步骤非常慢,并且此视频的质量也相当可观。

我似乎找不到能截断蒸汽长度的过滤器。是否存在与-t-ss参数相对应的过滤器节点?

Answers:


16

concat过滤器

如果您需要执行其他过滤,则最好使用此方法:

使用trimatrimsetptsasetpts,和concat过滤器:

ffmpeg -i input -filter_complex \
"[0:v]trim=60:65,setpts=PTS-STARTPTS[v0]; \
 [0:a]atrim=60:65,asetpts=PTS-STARTPTS[a0]; \
 [0:v]trim=120:125,setpts=PTS-STARTPTS[v1];
 [0:a]atrim=120:125,asetpts=PTS-STARTPTS[a1]; \
 [v0][a0][v1][a1]concat=n=2:v=1:a=1[out]" \
-map "[out]" output.mkv
  • setptsasetpts可以防止由于演示时间戳问题而产生的抖动。

  • 确保使用最新版本。请参阅FFmpeg下载页面,以获取指向Windows,OS X和Linux的内部版本的链接。


康卡特解复用器

另一种方法是单独创建段并进行流复制,而不是重新编码(以节省时间和质量),然后将其与concat demuxer结合在一起。

$ ffmpeg -ss 60 -i input -t 5 -codec copy clip1.mkv
$ ffmpeg -ss 120 -i input -t 5 -codec copy clip2.mkv
$ echo "file 'clip1.mkv'" > concat.txt
$ echo "file 'clip2.mkv'" >> concat.txt
$ ffmpeg -f concat -i concat.txt -codec copy output.mkv

2
嗯谢谢 修剪是我所缺少的。但是,要花很长时间才能达到我指定的时间偏移,就好像解码所有内容一样。此外,部分输出缺少音频。要修复,我用-ss多次指定了相同的输入,然后使用trim截断视频。在这种情况下,您不需要setpts,因为ss将pts设置为0。这似乎可行,并且在编码过程中没有奇怪的随机暂停。至于复制流,我之前曾尝试过。它从上一个I帧开始,因此您获得的影片部分与您想要的不同。
2014年

您能回答我的问题吗?它类似于这一问题。video.stackexchange.com/questions/18247/…–
Eftekhari

有趣的是-filter_complex作品有效,但concat文件却没有-即第一个视频看起来不错,但是第二个的质量却很糟糕。注意,我完全复制了这两个命令(输入文件除外)。
bobmarksie

7

这应该工作更快...

ffmpeg -ss 1:00 -t 5 -i in.mkv -ss 2:00 -t 5 -i in.mkv \
  -filter_complex "[0][1]concat=n=2:v=1:a=1" \ 
  out.mkv

无需在输出中指定-t。无需在连接前拆分音频和视频。


1
这使用了concat过滤器,这将需要重新编码。用户可能会或可能不会希望这样做。
llogan 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.