Черные рамки в начале видеофайла при вырезании файла
Я использую ffmpeg, чтобы вырезать видео файл. Формат, который я использую, таков:
ffmpeg -i input.avi -ss 00:06:30 -to 00:07:15 -c copy output.avi
К сожалению, это оставляет некоторые черные рамки в начале моего выходного видео, поэтому я теряю определенные части видео. В одном видео, которое я пробовал, это продолжалось одну секунду, в другом - черные кадры длились 4 секунды.
Самое смешное, что когда я использовал одну и ту же команду, для одного и того же видео существует абсолютно одинаковое количество черной рамки. Это означает, что независимо от того, сколько раз я делал это для моего второго видео, во всех выходных видео будет пустым в течение первых 4 секунд!
Звук работает отлично, хотя!
Вот некоторые другие форматы команд, которые я пробовал и НЕ работал:
ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy cut.mp4
ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy -copyts cut.mp4
Я нашел свое решение с помощью команды, которую использовал, но затем возникла эта проблема
РЕДАКТИРОВАТЬ: я понял, что если я не буду использовать -c copy
флаг, то у меня нет черных рамок:
ffmpeg -i input.avi -ss 00:06:30 -to 00:07:15 output.avi
Однако при использовании этого метода качество моего выходного видео значительно ниже, чем входного видео или выходного видео из предыдущих методов. Так что я вернулся на круги своя.
2 ответа
Убедитесь, что вы используете последнюю версию ffmpeg, загрузив, например, статическую сборку. Некоторое время назад произошли некоторые важные изменения, которые влияют на работу потоковой резки.
Вот важное различие между командами, которые вы выполнили:
При указании
-c copy
, ffmpeg обрежет видео без изменения фактического потока битов. Другими словами, он будет принимать кадры как есть и копировать их в выходной файл. В некоторых случаях (проще говоря, когда начальное время не соответствует I-кадру), ffmpeg необходимо включить еще несколько кадров, которые необходимы для правильного декодирования первого отображаемого кадра. Они получат отрицательную метку времени, поэтому они не должны отображаться.Когда вы уходите
-c copy
, ffmpeg перекодирует видео любым кодировщиком (mpeg4
,libx264
,...) по умолчанию для выбранного выходного формата (AVI или MP4 в вашем случае). Эти кодировщики могут иметь настройки качества или битрейта по умолчанию, из-за которых выходные данные выглядят плохо. Поэтому при перекодировании вы должны знать, какое целевое качество вы хотите установить.
Если обрезка с помощью потокового копирования не работает для вас, и если вам необходимо перекодировать видео, вы также можете использовать недавний и эффективный видеокодек (H.264) и контейнер (MP4), а также скопировать аудиопоток:
ffmpeg -ss 00:10:45 -i input.avi -c:v libx264 -crf 18 -to 00:11:45 -c:a copy output.mp4
Здесь опция CRF контролирует качество вывода. Значения между 18 и 28 являются "нормальными", более низкие значения лучше. -ss
опция может быть опцией ввода (т. е. та, которая появляется раньше -i
) который делает все быстрее.
Для получения дополнительной информации прочитайте руководство по поиску в FFmpeg Wiki.
Для тех, у кого была такая же проблема, мне наконец удалось решить ее следующим образом:
ffmpeg -i input.avi -qscale 0 -ss 00:10:45 -to 00:11:45 output.avi