5

Контекст:

Скажем, у меня есть два видеофайла - рипы с DVD или DV ленты. Они оба имеют формат MKV или AVI, какой-то стандартный контейнер или другой, но были разорваны по отдельности, с разными кодерами, разными битрейтами и разными разрешениями. Видео имеют разные кадры, но есть сегмент видеоряда, который объединяет оба трека (сегмент с одинаковым точным исходным материалом, хотя, как я уже говорил, кодировщик / разрешение / битрейт различны для каждого файла).

Например: Файл 1 содержит сегмент с 00:10 до 00:20, который содержит тот же исходный материал, что и сегмент с 10:00 до 10:10 в файле 2.

Эта проблема:

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

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

Ответ на этот вопрос вполне может быть «невозможно без тонны работы», но я решил, что все равно спрошу.

1 ответ1

2

Интересно. Я думаю, что это может быть вполне приемлемо, если размер видео не слишком велик (или у вас все в порядке, если вы делаете это несколькими порциями).

Вот что я думаю:

  • То, что вы действительно хотите в конце, это параллельный diff, почти как sdiff

  • Но вместо номеров строк вам нужен индекс времени.

  • И вместо строки текста вам нужен видеокадр, который вы можете сравнить с определенным уровнем уверенности относительно другого

Я собираюсь принять стандартные инструменты Unix, если не указано иное. Они доступны для любой ОС, включая Windows.

Так как насчет этого:

  1. Извлеките каждый кадр каждого видео в PNG.

    Вы можете сделать это с помощью ffmpeg , см. Этот пост суперпользователя. Вы получите каталог, полный пронумерованных JPG.

  2. Убедитесь, что у каждого одинаковое соотношение сторон. Для этого примера, скажем, это 450x320. ImageMagick может помочь вам, если у вас его нет.

  3. Теперь сложная часть. Мы пытаемся сравнить кадры из совершенно разных источников, и мы хотим попытаться обойтись без чего-либо вычислительно дорогого, такого как компьютерное зрение или нейронная сеть.

    Вот моя идея: уменьшить каждое изображение до крошечного 1/10 размера черно-белого PNG.

    Так что, если у вас была эта фотография cat.jpg:

    фотография кота из интернета

    С небольшим ImageMagick: convert cat.jpg -type grayscale -resize 45x32 -depth 1 x.png становится: (увеличено, чтобы вы получили картинку, без каламбура):

    Теперь это достаточно уникально, чтобы быть подписью кадра, но не настолько уникально (я думаю), что мы не можем получить стабильную контрольную сумму

  4. Повторите для каждого кадра. Запустите такой скрипт дважды для каждого набора фреймов.

    #!/bin/sh
    for f in `ls -1` do:
        convert $f -type grayscale -resize 45x32 -depth 1 - | cksum >> 1.txt
    done
    

    Таким образом, вы получите 2.txt для другого файла.

  5. Номер каждого файла. Вы могли бы придумать и сделать это метками времени видеокодера, но мы просто будем использовать nl:

    $ nl -ba 1.txt > 1n.txt
    $ nl -ba 2.txt > 2n.txt
    
  6. Гранд финал. Использование высоко-недооценить Unix инструмент comm , чтобы показать вам , что то же самое между 1 и 2:

    $ comm -12 1n.txt 2n.txt
    

Попытайся! Могу поспорить, это будет работать! :-)

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