Я использую это, чтобы вырезать часть из файла MP4:
ffmpeg -i input.mp4 -vcodec copy -acodec copy -ss 00:36:18 -to 00:39:50 output.mp4
Работает хорошо, но видеоизображение всегда замирает в начале на 1 секунду.
Неважно, из какого видеофайла я пытаюсь вырезать часть, до начала видео проходит около 1 секунды.
Вот примертого, что я вижу.
решение1
Проблема может быть в том, что видео пытается обрезаться исключительно на основе ключевых кадров, а не промежуточных кадров, и ваше начальное время 00:36:18
опережает ключевой кадр на несколько секунд. Решением должно быть использование-copyinkf
опциикоторый описан в руководстве как:
При потоковом копировании копируйте также неключевые кадры, находящиеся в начале.
Итак, ваша команда выглядит так:
ffmpeg -i input.mp4 -vcodec copy -acodec copy -ss 00:36:18 -to 00:39:50 output.mp4
Затем его нужно будет отрегулировать, чтобы он выглядел следующим образом, -copyinkf
добавив:
ffmpeg -i input.mp4 -vcodec copy -acodec copy -copyinkf -ss 00:36:18 -to 00:39:50 output.mp4
решение2
Временная метка, из которой вы копируете, находится между ключевыми кадрами, использование -vcodec copy всегда приведет к такому поведению, если копируется межкадровый кодек, а ваш ввод не начинается с ключевого кадра.
Ваши варианты - либо выполнить полное кодирование (т.е. без копирования -vcodec), либо выбрать другую временную метку для поиска. Вы можете найти местоположение всех ключевых кадров, используя ffprobe, например.
ffprobe -select_streams v -show_frames -print_format csv -show_entries frame=key_frame,pkt_dts_time input.mp4 | grep "frame,1"
третий столбец содержит временные метки (в секундах) всех ключевых кадров. Вам нужен тот, который ближе всего к целевой временной метке, но не позже ее.
решение3
У меня тоже была эта проблема, я понятия не имею, почему это произошло и как я это исправил. Просто знайте, что этот код исправил это для меня:
ffmpeg -ss 00:00:00 -to 00:00:10 -i input.mp4 -c:v copy -c:a copy output.mp4