3

Мне нужно извлечь 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 ответ1

6

Использование -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 требователен к размещению опций и переключателей!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .