Можно ли объединить копирование и кодирование в одну операцию, чтобы получить точный и быстрый результат?

Можно ли объединить копирование и кодирование в одну операцию, чтобы получить точный и быстрый результат?

Я перепробовал много видеорезаков на базе ffmpeg, и у всех них одна и та же проблема: быстрая нарезка не точна без перекодирования. Я перепробовал много решений в своем собственном приложении, но ни одно не работает так, как мне нужно. Итак, у меня есть идея, как исправить эту проблему: предположим, я хочу создать новое видео, которое не содержит отрезок, начинающийся с t1 по t2. Я хочу, чтобы ffmpeg сделал это, чтобы разделить сегмент (t1, t2) на 3 части:

  1. часть (t1-x, t1+y), которая представляет собой полный закодированный блок, который необходимо перекодировать, чтобы иметь возможность точно скопировать часть (t1, y).
  2. часть (t2-z, t3+w), которая представляет собой полный закодированный блок, который следует перекодировать, чтобы иметь возможность точно скопировать часть (z, t2).
  3. средняя часть (y, z), которая содержит полные закодированные блоки, куда ее можно скопировать как есть.

Затем соедините 3 части, полученные в результате вышеуказанных шагов. Обратите внимание, что первые две части, как ожидается, будут небольшими (и одна из них или обе могут иметь нулевую длину), поэтому процесс перекодирования будет быстрым. Это позволит нам иметь точные разрезы с немного более медленной работой, но все равно очень быстрыми, чем перекодирование полного видео. Это может быть даже быстрее, если мы сможем сделать несколько разрезов одной командой, поэтому мы пройдемся по кадрам один раз.

Итак, могу ли я сделать это сегодня с помощью ffmpeg? Или ffmpeg сможет поддерживать это в ближайшее время? Я надеюсь, что кто-то сможет применить это и рассказать нам, как, или упомянуть кого-то из команды ffmpeg, или предоставить им это в любом случае.

решение1

Ffmpeg поддерживает обрезку ключевых кадров с помощью ssпараметра, но его положение имеет решающее значение.

Пример поиска по ключевому кадру:

ffmpeg -ss 30 -i input_vid.mp4 -t 60 -c copy output_clip.mp4

Пример поиска по всем кадрам:

ffmpeg -i input_vid.mp4 -ss 30 -t 60 -c copy output_clip.mp4

Параметр -copyздесь важен, так как он вызывает Потоковая копия. В некоторых случаях вам может потребоваться добавить параметр -noaccurate_seek.

Более подробную информацию см. здесь:


Большинство видео используют кодеки, которые выполняют временное сжатие, поэтому указанная точка среза может полагаться на кадры до (и после) этой точки среза для корректного декодирования. Таким образом, когда вы используете ffmpeg для обрезки видео с этим copyрежимом, ffmpeg должен включить все кадры до и после обрезанного сегмента, которые необходимы для корректного декодирования сегмента. Это может привести к началу черного сегмента.

Чтобы по-прежнему использовать режим копирования, но избежать черного сегмента, необходимо установить переключатель -avoid_negative_ts.

Связанный контент