Первая секунда вырезанной части видео зависает, когда FFmpeg вырезает часть видео

Первая секунда вырезанной части видео зависает, когда FFmpeg вырезает часть видео

Я использую это, чтобы вырезать часть из файла 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

Связанный контент