2014-01-29 2 views
26

Здесь нет особо нового вопроса, но я пробовал то, что было предложено там, без большой удачи. Итак, моя история:Как извлечь временные видео сегменты с помощью ffmpeg?

У меня есть кусок 15 секунд прямолинейного видеоролика, из которого я хочу извлечь конкретный фрагмент, который я могу определить по времени начала и времени остановки , в секундах. Я начал пытаться делать то, что я называю «экстракция копирования»: чтобы получить секунд 9 до 12,

ffmpeg -i test.mov -vcodec copy -acodec copy -ss 9 -to 12 test-copy.mov 

Это было не-плохое начало, но есть некоторые черные кадры в начале и в конце из клипа, который у меня не может быть - это должно быть чистое редактирование из оригинала. Итак, я попытался перекодировать оригинал в новый, обрезанного клипа:

ffmpeg -i test.mov -ss 00:00:09 -t 00:00:03 test-out.mov 

Это лучше, но не совсем: Есть больше никаких черных кадров нет в начале клипа, но они все еще там конец.

После некоторого просмотра и чтения я тогда подозревал, что проблема в том, что ffmpeg не может найти правильные точки из-за отсутствия ключевых кадров в исходном видео. Поэтому я перекодировал исходное видео (предположительно), добавляя ключевые кадры несколькими способами. Так как я хочу, чтобы иметь возможность выбрать видео на границах секунды («от 9 до 12 секунд»), я попробовал, копирование различных предложений по Сети,

ffmpeg -i test.mov -force_key_frames "expr:gte(t, n_forced)" test-forced.mp4 

и

ffmpeg -i test.mov -g 1 test-g-inserted.mp4 

(Я построил их как mp4 на основе некоторых комментариев о контейнере mp4, который необходим для поддержки поиска ключевого кадра, но я честно просто взламываю здесь.) Затем я попробовал извлечение, как и раньше, но на этих новых видео, которые предположительно теперь имеют ключевые кадры в них. Не повезло - оба кажутся примерно одинаковыми; начало в порядке, но в конце все еще есть черные кадры. (FWIW, как test-forced.mp4, так и test-g-insert.mp4 также имеют завершающие черные кадры.)

Итак: я все еще застрял и хотел бы не быть. Какие-нибудь идеи о том, что я делаю неправильно? Я чувствую, что я рядом, но мне действительно нужно избавиться от этих задних черных кадров ....

+0

Вы пробовали установить продолжительность выходного видеофайла? У меня была такая же проблема и я решил ее использовать с длительностью выходного видео: ./ffmpeg -ss 0: 1: 30.00 -i Abduls.mp4 -t 0: 0: 30.00 -filter_complex "[0: v] trim = duration = 30 [ b]; [b] scale = 720: trunc (ow/a/2) * 2 [a]; " -map [a] -map 0: a -c: copy -c: v libx264 -t 30 short3.mp4 –

ответ

27

Ok, в первую очередь, если вы знаете, начальную и конечную длительность; мы добавим ключевые кадры в эту продолжительность.

ffmpeg -i a.mp4 -force_key_frames 00:00:09,00:00:12 out.mp4 

Большую часть времени вы можете напрямую отрезать видео с совершенством, но в вашем случае это вам не поможет; поэтому мы позаботились об этом над командой. Здесь будьте осторожны, чтобы не добавлять слишком много ключевых кадров, поскольку это может быть проблемой при кодировании согласно Ffmpeg Docs.

Теперь вы можете снова попробовать отрезать видео с определенного времени.

ffmpeg -ss 00:00:09 -i out.mp4 -t 00:00:03 -vcodec copy -acodec copy -y final.mp4 

Это решит проблему, поскольку мы вручную добавили ключевые кадры в начальной и конечной точках разреза. Это сработало для меня.

Приветствие. :)

+2

Спасибо за указатели! Казалось, что это хорошо работает с точки зрения времени, хотя для этого требуется перекод, который я бы хотел избежать, и я все еще получаю черные кадры в конце обрезанного видео. Еще несколько экспериментов показали, что моя первая неудачная попытка «копирования» немного меньше времени от этого, и, хотя она оставляет меня с черными кадрами в начале, получается, что то, что я делаю с обрезанным видео (длинный рассказ опущен) игнорировать эти рамки - может быть, это артефакт игрока? Итак, еще раз спасибо, даже если я останусь с копией. –

+0

Followup: Я одобрю это как ответ, но если у кого-нибудь еще есть идеи о том, как избежать этих черных фреймов, было бы полезно ... –

+0

@JimMiller, пожалуйста, дайте ссылку на ваше видео ..I проверит это с ним. – BlueSword

0

Я хотел бы также знать. До сих пор я конвертирован мое видео без потерь, извлеченного сегмент и повторно кодированных им их после редактирования:

ffmpeg -i input -ss 9.48 -t 3.52 -c:v libx264 -crf 0 -g 1 -c:a copy TempIframe.mp4 

Но это отнимает много времени и с потерями процесса ...

Я попытался следующий без успеха:

ffmpeg -i source.mp4 -ss 1 -c:v copy -seek2any 1 -avoid_negative_ts 1 -safe 1 -c:a copy segment.mp4 
+0

Единственный способ сделать это быстро - использовать c: v copy. Транскодирование всегда занимает много времени. – Konstantin

9

Я думаю, что проблема, вопрос и другие ответы возникают в том, что они используют -ss в качестве опции на выходной файл, а не на входной файл. Большинство параметров ffmpeg не являются глобальными, а применяются только к файлу, которому они предшествуют. Часто бывает неясно, куда должен идти вариант, поэтому иногда требуются проб и ошибок.

Использовано правильно, перед входным файлом, к которому они предназначены, -ss и -t отлично справились со мной. При включении звука на выходе мне пришлось использовать -shortest в качестве опции для выходного файла, или я бы получил 2 минуты аудио с 2 секундами видео.

FFmpeg версия N-67413-g2a88c74 (в основном мерзавец источника от 14 декабря 2014 года)

Вот командная строка, я использовал, чтобы сделать клип в последнее время. (На самом деле переделан, чтобы быть лучшим примером, так как я оставил в аудио для этого, и не замедленного движения его.)

ffmpeg -ss 120.2 -t 0.75 -i ../mcdeint.60p.lossless264.slow.mkv -c:a libopus -shortest -aspect 16:9 -preset veryslow -x264-params nr=250:ref=6 -crf 22 -movflags +faststart clip2.mkv

С -c:a copy (источником имеет AC3 аудио), воспроизведение начинается до шаткого с MPlayer. Вероятно, он захватывает звук с начала звукового фрейма, содержащего начало, а затем должен использовать смещение a/v в контейнере. При запуске требуется часть секунды для звука, чтобы опередить видео с помощью этого смещения, и до тех пор воспроизведение видео происходит с очень низким FPS. Поэтому я закодировал аудио. Ни opus, ни pcm_s16le могут идти в mp4, поэтому я использовал контейнер mkv для этого примера.

Исходный код без потерь x264 (-qp 0) с выхода очень медленного yadif = 3: 1, mcdeint = 3: 1: 10 (на некотором BFF чересстрочном видео с NTSC DVD, возможно, с камеры DV). Это НЕ все I кадров, это P кадров с нормальным интервалом ключевого кадра.

Регулировка -ss на 0,2 секунды сделала именно то, что я надеялся, поэтому ffmpeg должен обрабатывать декодирование до требуемой точки. Это было не просто совпадение I-кадра, где я его хотел. Может быть, -accurate_seek по умолчанию? Я также получаю тот же результат (байт-байтовый идентичный выход gif), как при использовании источника без потерь ffvhuff в качестве входных данных. (но он работает быстрее, так как он не должен декодировать до запрошенной точки.)

Возможно, еще один вариант, который подходит -seek2any, но он говорит: «Ищите не-ключевой кадр на уровне демультиплексирования», что звучит так позволит вам искать способы, которые приведут к искажению результатов. (т. е. начать декодирование без фактического генерации ссылок, которые требуется текущему кадру, просто используйте all-grey?)

Я не пробовал использовать -c:v copy, так как я вырезаю очень короткий клип в петлю, поэтому я знаю там не будет I кадров, в которых они мне нужны.

Это командная строка, которую я фактически использовал, чтобы сделать короткий клип slo-mo без звука.

ffmpeg -ss 120.2 -t 0.75 -i ../vid.yadif3.1,mcdeint3.1.10.ffvhuff.mkv -an -shortest -aspect 16:9 -c:v libx264 -preset veryslow -x264-params nr=250:ref=6 -crf 22 -filter:v "setpts=3.0*PTS" -movflags +faststart -r 20 clip.mp4

Обратите внимание, что -r 20 важно, потому что в отличие от мкВ, выход MP4 FFmpeg является постоянной частотой кадров только (редактирование: потому что -vsync vfr не по умолчанию с mp4 мультиплексором). Не говоря о другом, он установил бы выход FPS = ввод FPS и дублировал бы фреймы, когда это было необходимо, чтобы это произошло. x264 и анимированный gif (с прозрачностью) могут очень эффективно кодировать повторяющиеся фреймы, но это все равно глупо.

Прежде чем приготовить это в качестве примера, я сделал это в 2 этапа, один из которых вывел на mkv, затем ffmpeg -i clip.mkv -c:v copy -movflags +faststart -r 20 clip.mp4 в remux. BTW, можно изменить fps видео при ремуксировании без xcoding, просто не с ffmpeg. https://superuser.com/questions/740196/reducing-video-size-with-avconv-why-does-the-size-increase. Но в любом случае ffmpeg отправил только 45 кадров в libx264 при создании mkv, хотя он думал, что делает 2,2-секундное видео со скоростью 60 кадров в секунду. Не используйте ffmpeg с mp4 для работы с переменным материалом FPS.

Редактировать: отображается ffmpeg по умолчанию -vsync vfr для вывода mkv, но не для mp4. С помощью -vsync vfr ffmpeg может записывать VFR в mp4-выход просто отлично.

И снова для вывода GIF, в случае, если я решу не поставить его с HTML5 видео (<video controls autoplay loop> <source src="clip.mp4" type="video/mp4"> </video>)

ffmpeg -ss 120.2 -t 0.75 -i ../vid.yadif3.1,mcdeint3.1.10.ffvhuff.mkv -an -shortest -aspect 16:9 -filter:v "setpts=3.0*PTS,scale=854x480" -r 20 clip.gif

мне пришлось использовать scale=, поскольку контейнер GIF не сохраняет пропорции , поэтому он не может автоматически масштабироваться при воспроизведении. (мое видео с разрешением 720x480 пикселей 16: 9 становится масштабированным до 854x480 при воспроизведении. На самом деле должно быть 853,333, но это округляется, а затем ffmpeg хранит 853x480 в контейнере mkv, поэтому все время используется -спектр 16: 9, поэтому мой mp4 будет сохраните правильное соотношение сторон [SAR 32:27 DAR 16:9], вместо [SAR 186:157 DAR 279:157])

+0

edit: '-vsync vfr' не является значением по умолчанию для mp4, но это для mkv. (Значение по умолчанию выбрано мультиплеером, но mp4 mp4 ffmpeg DOES поддерживает VFR.) –

+0

wheres your blog yo – jiggunjer

5

Нет необходимости добавлять ключевые кадры; как говорит Питер, это просто вопрос получения вариантов в правильном порядке. Однако см. https://trac.ffmpeg.org/wiki/Seeking для окончательного официального руководства о том, как это сделать правильно.

+0

Кому бы ни было downvoted это: будьте любезны и объясните, почему в комментарии, поэтому я могу обратиться к вашей жалобе. –

 Смежные вопросы

  • Нет связанных вопросов^_^