Черные рамки в начале видеофайла при вырезании файла

1271
user1584421

Я использую 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 

Однако при использовании этого метода качество моего выходного видео значительно ниже, чем входного видео или выходного видео из предыдущих методов. Так что я вернулся на круги своя.

0
«К сожалению, в начале моего выходного видео остаются некоторые черные рамки» - как вы пытаетесь просмотреть видео? Также, пожалуйста, покажите полный, неразрезанный вывод командной строки. slhck 6 лет назад 0

2 ответа на вопрос

2
slhck

Убедитесь, что вы используете последнюю версию ffmpeg, загрузив, например, статическую сборку . Некоторое время назад произошли некоторые важные изменения, которые влияют на работу потоковой резки.

Вот важное различие между командами, которые вы выполнили:

  • При указании -c copyffmpeg будет вырезать видео без изменения фактического потока битов. Другими словами, он будет принимать кадры как есть и копировать их в выходной файл. В некоторых случаях (проще говоря, когда начальное время не соответствует 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Опция может быть входным параметром, который делает все быстрее.

Для получения дополнительной информации прочитайте руководство по поиску в FFmpeg Wiki.

0
user1584421

Для тех, у кого возникла такая же проблема, мне наконец удалось решить ее следующим образом:

ffmpeg -i input.avi -qscale 0 -ss 00:10:45 -to 00:11:45 output.avi 
Хотя это действительно решает проблему, которую вы испытываете. ** не рекомендуется **. Здесь вы перекодируете видео и создаете ненужный большой выходной файл, делая это. slhck 6 лет назад 0