使用ffmpeg提取长视频中间的片段

使用ffmpeg提取长视频中间的片段

我需要从视频中间提取 30 秒的间隔,同时将其转换为 webm。ffmpeg 似乎是完美的一行代码:

ffmpeg -i long.mkv -vcodec libvpx -b:v 1M -ss 02:00:00 -t 00:00:30 -threads 4 out.webm

令我惊讶的是,它几乎立即吞噬了所有可用内存,并且开始交换内容,所以我杀死了它。在没有发现任何明显错误后 - 请记住我很少使用 ffmpeg - 我尝试了 avconv。它没有报告执行任何操作,并且内存使用量(缓慢)朝着同一方向增长。

经过几次测试:

 -ss 02:00:00 -t 00:00:01
 -ss 00:00:01 -t 00:00:01
 -ss 00:01:00 -t 00:00:01

ffmpeg 似乎正在将整个影片加载到-ss内存中,或类似情况。无论如何,它似乎不适合这种操作。我的问题是,我做错了什么,而 ffmpeg 实际上可以在合理的资源使用下执行此操作吗?如果 ffmpeg 不适合这样做,或者只是在如何执行此操作方面很愚蠢,那么是否有其他替代方法,而不需要将矩形拖放到时间轴中并使用小剪刀和滚动条?

debian@pc:~/ ffmpeg -version
ffmpeg version 0.8.16-6:0.8.16-1, Copyright (c) 2000-2014 the Libav developers
  built on Sep 16 2014 23:10:48 with gcc 4.7.2
The ffmpeg program is only provided for script compatibility and will be removed
in a future release. It has been deprecated in the Libav project to allow for
incompatible command line syntax improvements in its replacement called avconv
(see Changelog for details). Please use avconv instead.
ffmpeg 0.8.16-6:0.8.16-1
libavutil    51. 22. 2 / 51. 22. 2
libavcodec   53. 35. 0 / 53. 35. 0
libavformat  53. 21. 1 / 53. 21. 1
libavdevice  53.  2. 0 / 53.  2. 0
libavfilter   2. 15. 0 /  2. 15. 0
libswscale    2.  1. 0 /  2.  1. 0
libpostproc  52.  0. 0 / 52.  0.100

我也尝试了 ffmpeg 网站上的最新版本,结果与 avconv 相同——不会一下子占用我的内存,但似乎什么也没做:

frame=    0 fps=0.0 q=-1.0 size=       4kB time=00:00:00.00 bitrate=N/A    

并稳步增加内存使用量。对于一秒钟的剪辑,我认为它应该是瞬时的,几乎不占用任何内存。

答案1

使用-ss之后-i需要ffmpeg很长时间!

这是因为你正在寻找输出,而不是输入。根据ffmpeg寻求手册

输入搜索

-ss需要在之前的某处指定该参数-i

...输入将使用以下方式解析关键帧,即非常快...

相比之下:

寻求输出

-ss之后需要指定参数-i

...这将完成非常缓慢地, 一帧一帧...

在您的问题中,您指定了后者。如果您使用输入搜索反而:

ffmpeg -ss 02:00:00 -i long.mkv -vcodec libvpx -b:v 1M -t 00:00:30 -threads 4 out.webm

但如果你确实需要帧精确搜索,你可以将两者结合起来:

ffmpeg -ss 01:59:30 -i long.mkv -ss 30 -vcodec libvpx -b:v 1M -t 00:00:30 -threads 4 out.webm

(快速搜索至 01:59:30,然后逐帧搜索至 02:00:00,即 +30)

您可能已经知道了,但如果没有,这应该说明ffmpeg对选项和开关的位置很挑剔!

相关内容