Проблемы с файлом, созданным с использованием FFMPEG - PullRequest
0 голосов
/ 31 марта 2020

Я новичок ie в ffmpeg, но в настоящее время использую его Powershell для вырезания видеоклипов из файла mp4. То, что я хочу сделать, это вырезать сегмент из видео и создать новый файл mp4 с таким. Я запускаю следующую команду, см. Следующий пример для одного созданного клипа. Выполните это несколько раз с разными временами начала и продолжительности в исходном файле:

-ss 00:02:42.9060000 -i "C:\Users\User\Desktop\MySourceVideo.mp4" -t 00:00:07.2800000 -c:v copy "C:\Users\User\Desktop\MyClip.mp4" -y -v quiet

Исходный файл - mp4, с видеокодом H264 c, AA C видеокод c.

Пока он создает клипы, я запускаю его в разное время в исходном видео, создавая несколько обрезанных MP4-видео. Когда я смотрю, чтобы воспроизвести недавно созданные файлы mp4, для некоторых клипов я нахожу некоторые несоответствия, такие как:

  • Воспроизведение файла в течение первых нескольких секунд просто имеет черный крик
  • Воспроизведение файл в течение первых нескольких секунд имеет очень быстрое и быстрое воспроизведение видео

Некоторые ролики идеальны, другие имеют вышеуказанные проблемы. Я был бы признателен, если бы моя команда могла быть проверена в случае, если я пропустил параметр, или можно было бы дать какую-либо дополнительную информацию?

1 Ответ

1 голос
/ 31 марта 2020

Как уже упоминалось в разделе комментариев. Вы пытаетесь обрезать видео, не кодируя его. Вы звоните -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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...