Я пытаюсь проверить количество информации, потерянной с некоторыми различными видеокодеками. У меня есть скрипт Python, который использует PyPNG для записи серии 8-битных изображений RGB. Затем я кодирую его с помощью avconv, например
avconv -r 1 -i ../frames/data%03d.png -c:v ffv1 -qscale:v 0 -r 1
outffv1.avi
Затем я декодирую это обратно в png, вот так
avconv -r 1 -i outffv1.avi -r 1 ./outffv1/frame%03d.png
Но когда я сравниваю изображения до и после сжатия видео, они различаются (средняя абсолютная ошибка ~~15%). Меня смущает то, что это верно (плюс-минус) независимо от кодека.
Например, я получаю аналогичные ответы для libtheora для диапазона значений qscale.
Кодировка png, то есть запись в png и немедленная загрузка обратно без этапа сжатия видео, выполняется без потерь.
ОБНОВЛЕНИЕ - более точный рабочий пример:
Один кадр ввода здесь: https://www.dropbox.com/s/2utk1xs2t8heai9/data001.png?dl=0 Закодировано в видео следующим образом: avconv -r 1 -i ./frames/data%03d.png -c:v ffv1 -qscale:v 0 -r 1 outffv1.avi
результирующее видео здесь: https://www.dropbox.com/s/g1babae2a41v914/outffv1.avi?dl=0 снова декодируется в png здесь: https://www.dropbox.com/s/8i8zg1qn7dxsgat/out001.png?dl=0 с помощью этой команды : avconv -r 1 -i outffv1.avi -qscale:v 31 -r 1 out%03d.png
и магия изображений различаются вот так compare out001.png ./frames/data001.png diff.png
, чтобы получить это (ненулевое) различие https://www.dropbox.com/s/vpouk54p0dieqif/diff.png?dl=0
ffmpeg
иffv1
не удалось мне из-за ограничений int, я должен посмотреть, что не так, так как я на x64. Кодирование предоставленного PNG, масштабированного до 2048x2048 доffv1
(без потерь) вAVI
, и извлечение кадров не выявило различий сcompare
от imagemagick. Теора с потерями, насколько я знаю. - person aergistal   schedule 15.12.2015