2016-12-30 12 views
0

У меня есть FLV видео и хотим сбросить скажем 3s длину видео после первого ключевого кадра PICT_TYPE_I встречается после 00:39. Я готов к document из ffmpeg seeking и цитаты здесьFFmpeg свалка определенной длиной видео после того, как ищет PICT_TYPE_I ключевой кадр

ffmpeg -ss 00:23:00 -i Mononoke.Hime.mkv -frames:v 1 out1.jpg

Этот пример будет производить один кадр изображения (out1.jpg) на двадцать третьей минуте от начала фильма. Вход будет проанализирован с использованием ключевых кадров, что очень быстро. Начиная с FFmpeg 2.1, когда транскодирование с помощью ffmpeg (т. Е. Не только копирование потока), то -ss теперь также «с точностью до кадра» даже при использовании в качестве опции ввода. Предыдущее поведение (поиск только ближайшего предшествующего ключевого кадра, даже если не точно точно) можно восстановить с помощью опции -noaccurate_seek.

Так что я думаю, что если я использую эту команду (поместить -ss до того -i)

ffmpeg -noaccurate_seek -ss 00:39 -i input.flv -r 10 -s 720x400 -t 3.12 dump.flv 

И это должно вывести видео, которое длиться 3.12s и начать с первого keyframe после 00:39 правильно? в конце концов, это то, что мне нужно.

Но результат dump.flv не начинается с keyframe, то есть PICT_TYPE_I.

Я знаю, что я могу найти все keyframe время начала с ffprobe и пересчитать -ss, ищут время, чтобы достигнуть этого. Но есть ли лучший способ?

+0

У вас есть аудио? – Mulvya

+0

нет, аудио не касается – armnotstrong

ответ

0

Если звук не касается, вы можете использовать

ffmpeg -ss 39.00 -i in.flv -vf select='if(eq(pict_type,I),st(1,t),gt(t,ld(1)))',setpts=N/FRAME_RATE/TB -an -t 3.12 out.flv 

Здесь выберите фильтр отбрасывает все кадры до первого ключевого кадра, который после точки поиска. Значение t контролирует выбранную общую продолжительность.

Обратите внимание, что продолжительность видео квантуется, то есть 25 кадров в секунду может иметь продолжительность с шагом 0,04 с.