3

Я использую это, чтобы вырезать часть из файла MP4:

ffmpeg -i input.mp4 -vcodec copy -acodec copy -ss 00:36:18 -to 00:39:50 output.mp4

Это работает хорошо, но видео изображение всегда останавливается в начале на 1 секунду.

Неважно, из какого видеофайла я пытаюсь вырезать часть, это занимает около 1 секунды до начала видео.

Вот пример того, что я вижу.

2 ответа2

3

Проблема может заключаться в том, что видео пытается обрезать только на основе ключевых кадров, а не промежуточных кадров, и ваше начальное время 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
1

Временная метка, с которой вы копируете, находится между ключевыми кадрами, использование -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"

третий столбец содержит временные метки (в секундах) всех ключевых кадров, вы хотите, чтобы один из них был ближайшим, но не после вашей целевой временной метки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .