Как уже упоминалось в разделе комментариев. Вы пытаетесь обрезать видео, не кодируя его. Вы звоните -c:v copy
, это означает, что вы хотите скопировать видеопоток. Проблема в том, что он будет искать предыдущий ключевой кадр, поэтому вы видите черные кадры в начале.
Другой вариант - выяснить, где находятся ключевые кадры, и передать время ключевого кадра, наиболее близкое ко времени, которое вы хотите обрезать.
Я бы предложил удалить -c:v copy
.
Редактировать :
Вы можете использовать ffprobe, чтобы получить кадр ключа / I, ближайший к данному времени, как показано ниже:
Заданное время равно 2: 30 минут - 150 секунд.
ffprobe -select_streams v -show_frames -show_entries frame=pkt_pts_time,pict_type -v quiet in.mp4 | awk -F= ' /pict_type=/ { if (index($2, "I")) { i=1; } else { i=0; } } /pkt_pts_time/ { if (i && ($2 >= 150)) print $2; } ' | head -n 1
Кредит Этот ответ.
Или, как указано в разделе комментариев ниже (быстрее, чем выше) Кредит это ответ:
ffprobe -loglevel error -select_streams v:0 -show_entries packet=pts_time,flags -of csv=print_section=0 input.mp4 | awk -F',' '/K/ {print $1}