Я использую 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 ответа2

4

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

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

  • При указании -c copy , ffmpeg будет вырезать видео без изменения фактического потока битов. Другими словами, он будет принимать кадры как есть и копировать их в выходной файл. В некоторых случаях (проще говоря, когда начальное время не соответствует I-кадру), ffmpeg необходимо включить еще несколько кадров, которые необходимы для правильного декодирования первого отображаемого кадра. Они получат отрицательную метку времени, поэтому они не должны отображаться.

  • Когда вы оставляете out -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.

0

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

ffmpeg -i input.avi -qscale 0 -ss 00:10:45 -to 00:11:45 output.avi

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