Использование ffmpeg + MPDecimate для удаления точных дубликатов кадров (т.е. без потерь)

Вопрос или проблема

Согласно документации, mpdecimate будет “Удалять кадры, которые не сильно отличаются от предыдущего кадра, чтобы снизить частоту кадров.”

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

Есть ли советы о том, как использовать ffmpeg с mpdecimate для этого (или каким-то другим инструментом)?

Значения для hi и lo относятся к блокам 8×8 пикселей и представляют собой фактические различия значений пикселей, поэтому порог 64 соответствует 1 единице различия для каждого пикселя или тому же распределению, упакованному по-другому в блоке.

Кадр является кандидатом на удаление, если ни один из блоков 8×8 не отличается более чем на порог hi, и если не более frac блоков (1 означает целое изображение) не отличаются более чем на порог lo.

Значение по умолчанию для hi составляет 64 * 12, значение по умолчанию для lo составляет 64 * 5, а значение по умолчанию для frac составляет 0.33.

ffmpeg -i input.mkv -vf mpdecimate=hi=1:lo=1:frac=1:max=0 output.mkv

Должен удалять изображение только если все изображение не имеет более чем 1 различия в значениях пикселей с предыдущим.

Мой тест со статическим изображением, отрендеренным в видео h264 продолжительностью 5 секунд, показал, что на самом деле 3 кадра из 125 были удалены. Это, возможно, связано с артефактами сжатия.

При настройке значения high и low на 200

ffmpeg -i input.mkv -vf mpdecimate=hi=200:lo=200:frac=1:max=0 output.mkv

то сохраняется 21 кадр.

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

Если вы хотите действительно укоротить видео, полностью удалив кадры, а не просто не сохраняя кадры, сохранив длину видео прежней, то используйте:

ffmpeg -i input.mkv -vf mpdecimate=hi=200:lo=200:frac=1:max=0,setpts=N/FRAME_RATE/TB output.mkv

Ответ или решение

Для решения задачи по удалению точных дублирующих кадров из видео с помощью FFmpeg и фильтра mpdecimate, необходимо учитывать несколько ключевых аспектов и параметров. В этом ответе мы подробно рассмотрим настройку FFmpeg для достижения желаемого результата.

Зачем использовать mpdecimate?

Фильтр mpdecimate служит для снижения частоты кадров, удаляя те из них, которые не отличаются существенно от предыдущих кадров. В вашем случае требуется настроить фильтр таким образом, чтобы он удалял только точные дубли, что потребует тонкой настройки параметров hi, lo и frac.

Параметры фильтра mpdecimate

  • hi и lo определяют пороги различия между кадровыми блоками.

    • hi управляет допустимыми различиями между блоками изображения. Например, значение 64 соответствует минимальному изменению цветовой схемы на уровне единичного пикселя.
    • lo — это более строгий порог, который проверяет, может ли кадр остаться, если уж слишком много пикселей показывает разницу.
  • frac указывает, какую долю блоков можно оставить, чтобы кадр всё же считался похожим на предыдущий. Значение 0.33 означает, что около трети блоков может иметь отклонение, чтобы кадр был признан различающимся.

  • max устанавливает максимальное количество кадров, которые будут подвержены удалению.

Команда для удаления точных дубликатов

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

ffmpeg -i input.mkv -vf mpdecimate=hi=0:lo=0:frac=1:max=0,setpts=N/FRAME_RATE/TB output.mkv

Объяснение команды:

  • hi=0 и lo=0: Эти параметры установлены на 0, что означает отсутствие допустимой различимости между пикселями, то есть кадры должны быть абсолютно идентичными.
  • frac=1: Все блоки должны быть идентичны, чтобы кадр был расценён как дублирующий.
  • setpts=N/FRAME_RATE/TB: Этот параметр корректирует временные метки кадров, что позволяет устранить паузы, возникающие из-за удаления кадров и, следовательно, сохраняет общую продолжительность видео.

Проблемы, с которыми вы можете столкнуться

  1. Артефакты сжатия: Кодирование видео может приводить к малым артефактам при сжатии, что затрудняет удаление дубликатов, поскольку кадры могут выглядеть практически идентичными, но всё же иметь небольшие различия. В этом случае стоит немного увеличить пороговые значения, например, hi=1 или lo=1, чтобы пропускать подобные артефакты.

  2. Исходное качество видео: Если качество видео невысокое, стоит попробовать создать видео с более высоким разрешением или меньшим сжатием, чтобы минимизировать искажения.

Заключение

Подходящая настройка ffmpeg с использованием фильтра mpdecimate позволяет эффективно удалять точные дублирующие кадры из видеоизображений. Обязательно проверяйте результаты всесторонним образом, чтобы удостовериться, что удалены только те кадры, которые вам действительно не нужны. Настройка параметров фильтра может требовать практики и экспериментов с конкретным видео.

Оцените материал
Добавить комментарий

Капча загружается...