Как сравнить/показать разницу между двумя видео в ffmpeg?

Я новичок в кодировании. Я прочитал и попробовал x264 в режиме без потерь (-qp 0), однако я хотел бы убедиться, что в моем новом видео каждый пиксель содержит ту же информацию, что и исходный файл (который находится в YUV 420, поэтому потеря преобразования цвета можно избежать, насколько я знаю). Я хочу иметь возможность проверить это, потому что я не верю в это, если кто-то просто скажет, что это без потерь.

Я приветствую ответы, предлагающие другие кодеки для кодирования без потерь, мои единственные требования к кодекам - иметь один из лучших коэффициентов сжатия и позволить мне выбирать различные времена расчета (например, диапазон от плацебо до очень быстрого в x264), чтобы настроить уровень сжатия и рассчитать время для моих нужд. Но имейте в виду, что первоначальный вопрос о том, как я могу вычислить различия по кадрам двух видео и экспортировать их в третий файл, чтобы я мог смотреть его сам. Думаю, эти знания (если они возможны и не имеют серьезных ограничений) пригодятся мне и в будущем.


person polarka    schedule 10.09.2014    source источник


Ответы (1)


Сравнение декодированных данных с хешем MD5

Вы можете использовать мультиплексор FFmpeg MD5, чтобы показать, что результат декодирования точно такой же:

  1. Получите хеш MD5 видеопотока из исходного ввода:

    $ ffmpeg -loglevel error -i original.vid -map 0:v -f md5 -
      MD5=5ee3ae1ee5feaf30618938290225f682
    
  2. Преобразование в вывод без потерь:

    $ ffmpeg -i original.vid -c:v libx264 -qp 0 lossless.mkv
    
  3. Сравните хэш MD5 видео без потерь:

    $ ffmpeg -loglevel error -i lossless.mkv -map 0:v -f md5 -
      MD5=5ee3ae1ee5feaf30618938290225f682
    

Примечания:

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

  • Вы можете видеть, что хеш MD5 может измениться, если вы выводите в формат с потерями.

  • Другие кодировщики видео со сжатием без потерь, поддерживаемые FFmpeg, включают: ffv1, ffvhuff, huffyuv и utvideo.

  • См. мультиплексор framemd5, чтобы просмотреть хеш для каждого кадра.


Визуальное сравнение

Со смешанным фильтром

Просмотр разницы вывода с потерямиПросмотр разницы вывода с потерями.

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

Использование ffplay

ffplay -f lavfi \
"movie=original.mkv[org]; \
 movie=encoded.mkv[enc]; \
 [org][enc]blend=all_mode=difference"
  • blend работает медленно, и эта команда может не воспроизводиться в реальном времени в зависимости от вашего процессора и входных данных. В качестве альтернативы вы можете вывести видео с помощью ffmpeg, а затем просмотреть его, как показано ниже.

  • Существуют режимы, отличные от difference, которые могут соответствовать вашим потребностям. См. документацию.

Использование ffmpeg

ffmpeg -i original.mkv -i encoded.mkv \
-filter_complex "blend=all_mode=difference" \
-c:v libx264 -crf 18 -c:a copy output.mkv
  • Вам может понадобиться добавить ,format=yuv420p в конец вашей цепочки фильтров (сразу после difference), чтобы просмотреть вывод в проигрывателях, не основанных на FFmpeg.

С наложенным фильтром

См. раздел Отображение разницы в видео с помощью фильтра наложения ffmpeg.

person llogan    schedule 11.09.2014
comment
Спасибо, я принимаю это. Тем не менее, я хотел бы знать, возможно ли это и как создать видео путем вычитания каждой пары кадров. Моя идея была бы такой: преобразовать в необработанные изображения —> выполнить вычитание —> создать дифференциальное видео. - person polarka; 11.09.2014
comment
Спасибо за быстрый ответ. эта страница помогла мне понять метод наложения фильтра. - person polarka; 13.09.2014
comment
Я заметил некоторую рассинхронизацию в обоих результатах, похоже, что один из источников немного опережает. Я добавил setpts=PTS-STARTPTS к обоим методам, что определенно помогло подходу с оверлейным фильтром. Я не думаю, что это что-то изменило в смешивающем фильтре. - person polarka; 13.09.2014
comment
@polarka Если с ffplay что-то не так, возможно, он просто не справляется в реальном времени (в зависимости от ваших входных данных, процессора и т. д.). Я думаю, что blend сам по себе может быть медленным, поэтому вы можете попробовать вывести файл без потерь вместо этого с помощью ffmpeg, а затем посмотреть его. - person llogan; 13.09.2014
comment
Как увидеть разницу rgb между кадрами? Непонятно зелено-белый diff представляет. - person mrgloom; 24.01.2019
comment
@mrgloom Разница между последовательными кадрами из одного потока или разница между двумя входными потоками/файлами? - person llogan; 25.01.2019
comment
разница между двумя входными потоками/файлами - person mrgloom; 25.01.2019
comment
@mrgloom Не могу проверить или изучить это в данный момент, но вы можете попробовать добавить фильтр формата: -filter_complex "[0]format=gbrp[v0];[1]format=gbrp[v1];[v0][v1]blend=all_mode=difference,format=yuv420p". - person llogan; 26.01.2019