使用ffmpeg提取长视频中段

Ale*_*lex 4 ffmpeg libav

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

ffmpeg -i long.mkv -vcodec libvpx -b:v 1M -ss 02:00:00 -t 00:00:30 -threads 4 out.webm
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,它几乎立即吞噬了所有可用内存,并且开始交换内容,因此我将其杀死。在没有发现任何明显错误之后——而且我很少使用 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
Run Code Online (Sandbox Code Playgroud)

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

我还尝试了 ffmpeg 网站上的最新版本,结果与 avconv 的相同——不会一下子吞噬我的记忆,但似乎没有做任何事情:

frame=    0 fps=0.0 q=-1.0 size=       4kB time=00:00:00.00 bitrate=N/A    
Run Code Online (Sandbox Code Playgroud)

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

ber*_*ieb 7

使用-ss后,-iffmpeg需要年龄!

这是因为您正在寻找输出中的一个点,而不是输入。根据ffmpeg寻求手册

输入搜索

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

...输入将使用keyframes解析,这非常快...

与:

输出寻求

-ss后面指定参数的需求-i

......这将非常缓慢地进行,一帧一帧......

在您的问题中,您指定了后者。如果您改用输入搜索,速度会快得多:

ffmpeg -ss 02:00:00 -i long.mkv -vcodec libvpx -b:v 1M -t 00:00:30 -threads 4 out.webm
Run Code Online (Sandbox Code Playgroud)

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

ffmpeg -ss 01:59:30 -i long.mkv -ss 30 -vcodec libvpx -b:v 1M -t 00:00:30 -threads 4 out.webm
Run Code Online (Sandbox Code Playgroud)

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

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