Я думаю, что проблема, вопрос и другие ответы возникают в том, что они используют -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]
)
Вы пробовали установить продолжительность выходного видеофайла? У меня была такая же проблема и я решил ее использовать с длительностью выходного видео: ./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 –