В следующем сценарии:
У меня есть проект, в каталоге которого на данный момент около десяти тысяч видеофайлов, и их количество резко возрастет.
Однако многие из них - дубликаты. С каждым видеофайлом я связал семантическую и описательную информацию, и я хочу объединить дубликаты, чтобы добиться лучших результатов для каждого из них.
Теперь мне нужна какая-то процедура, в которой я индексирую метаданные в базе данных, и всякий раз, когда новое видео попадает в каталог, те же данные вычисляются и сопоставляются в базе данных.
Проблема в том, что видео не являются точными копиями. Они могут иметь разное качество, быть обрезанными, с водяными знаками или иметь продолжение / приквел. Или обрезаются в начале и / или в конце.
К сожалению, чем лучше сравнение, тем больше он потребляет ресурсов процессора и памяти, поэтому я планирую реализовать несколько уровней сравнения, которые начинаются с очень изящного, но быстрого сравнения (длина видео maby с допуском 10%) и заканчиваются окончательным сравнением. это решает, действительно ли это дубликат (это будет голосование сообщества).
Так как у меня есть сообщество, которое проверяет результаты, достаточно делать «хорошие предположения» с низким коэффициентом неудач.
Итак, теперь мой вопрос: какие слои вы можете придумать, ребята, или у вас есть лучший подход?
Меня не волнуют усилия по созданию метаданных, у меня достаточно рабов для этого. Просто сравнение должно быть быстрым. Так что, если это поможет, я могу также преобразовать видео 100 раз ...
Вот мои текущие идеи:
длина видео (секунды)
анализ изображения первого и последнего кадра
Я бы передискретил изображение к размеру эскиза и получить средние значения rgb, затем сериализовать пиксель за пикселем, если цвет в этом пикселе больше / меньше среднего, представленного 0 или 1. Итак, я получаю двоичную строку, которую могу сохранить в mysql, и выполняю логическое битовая сумма (поддерживается mysql внутри) и подсчитывает оставшиеся неравные биты (также поддерживаются внутренне, это тогда будет расстояние Левенштейна для двоичных строк)
Я бы перекодировал видео в видеофайл vbr с точно такими же настройками. тогда я бы посмотрел на битрейт в определенные моменты времени (процент просмотра видео или абсолютные секунды ... тогда мы проанализировали бы только часть видео). то же, что и на картинке. Если битрейт больше среднего, его 1, иначе 0. мы составляем двоичную строку и сохраняем ее в db, а затем вычисляем расстояние Левенштейна
анализ звука (изменение битрейта и децибел во времени, как и битрейт видео)
анализ ключевых кадров
Сравнение изображений точно так же, как первый и последний кадры, но с позициями ключевых кадров? Мы бы использовали те же исходные файлы, которые использовали для расчета битрейта, потому что ключевые кадры сильно зависят от кодека и настроек.
Возможно, давайте возьмем одну или несколько областей / пикселей внутри изображения и посмотрим, как они развиваются с течением времени. Также изменение abov / ниже среднего. Думаю, черного / белого будет достаточно.
Или я иду совершенно неверным путем? Я думаю, что не могу быть первым, у кого возникла эта проблема, но мне не удалось найти решения.
Отличный вопрос! Только тестирование покажет, какие из этих факторов будут лучшими индикаторами. Некоторые идеи: