Тест кодирования x265: 12-битный файл имеет больший размер, чем 8-битный той же конфигурации?

Просто заинтересовался этим форматом x265 HEVC и попробовал его на потоковом видео BDMV 1920x1080i, одно закодированное с глубиной 8 бит, а другое — с глубиной 12 бит. В результате 8-битный выход был меньше. Оба выхода имеют разрешение 1280x720.

Интересно, почему это так.

Вот МедиаИнфо:

8 бит:

Частота кадров: 23,976 кадров в секунду

Цветовое пространство: ЮВ

Подвыборка цветности: 4:2:0

Битовая глубина: 8 бит

Библиотека записи: x265 1.9+54-291beccb6760:[Windows][GCC 5.3.0][64 бит] 8 бит+10 бит+12 бит

Настройки кодирования: wpp / ctu=64 / min-cu-size=8 / max-tu-size=32 / tu-intra-depth=2 / tu-inter-depth=2 / me=3 / subme=3 / merange =57 / rect / amp / max-merge = 3 /temporal-mvp / no-early-skip / rdpenalty=0 / no-tskip / no-tskip-fast / сильное внутреннее сглаживание / no-lossless / no-cu -без потерь/без ограничений-внутри/без-быстрого-внутри/открытая гоп/без временных слоев/чересстрочная развертка=0/keyint=250/min-keyint=23/scenecut=40/rc-lookahead=30/lookahead -slices=4/bframes=8/bframe-bias=0/b-adapt=2/ref=4/limit-refs=2/limit-modes/weightp/weightb/aq-mode=1/qg-size=32 / aq-strength=1.00 / cbqpoffs=0 / crqpoffs=0 / rd=6 / psy-rd=2.00 / rdoq-level=2 / psy-rdoq=1.00 / no-rd-refine / signhide / deblock / sao / no -sao-non-deblock / b-pyramid / cutree / no-intra-refresh / rc=crf / crf=18.0 / qcomp=0.60 / qpmin=0 / qpmax=51 / qpstep=4 / ipratio=1.40 / отношение = 1,30

12 бит: частота кадров: 23,976 кадров в секунду

Цветовое пространство: ЮВ

Подвыборка цветности: 4:2:0

Разрядность: 12 бит

Библиотека записи: x265 1.9+194-6d3849d648f0be5a:[Windows][GCC 5.3.0][64 bit] 12bit: KG7x [x265.ru]

Настройки кодирования: wpp / ctu=64 / min-cu-size=8 / max-tu-size=32 / tu-intra-depth=2 / tu-inter-depth=2 / me=3 / subme=3 / merange = 57 / rect / amp / max-merge = 3 /temporal-mvp / no-early-skip / recursion-skip / rdpenalty=0 / no-tskip / no-tskip-fast / сильное сглаживание внутри / без потерь / no-cu-lossless / no-constrained-intra / no-fast-intra / open-gop / no-temporal-layers / interlace=0 / keyint=250 / min-keyint=23 / scenecut=40 / rc-lookahead =30/lookahead-slices=4/bframes=8/bframe-bias=0/b-adapt=2/ref=4/limit-refs=2/limit-modes/weightp/weightb/aq-mode=1/qg -size=32 / aq-strength=1.00 / cbqpoffs=0 / crqpoffs=0 / rd=6 / psy-rd=2.00 / rdoq-level=2 / psy-rdoq=1.00 / no-rd-refine / signhide / deblock =0:0 / sao / no-sao-non-deblock / b-pyramid / cutree / no-intra-refresh / rc=crf / crf=18.0 / qcomp=0.60 / qpmin=0 / qpmax=51 / qpstep=4 / ipratio=1,40 / pbratio=1,30

Почему вы ожидаете, что 12-битный будет меньше? Более высокая битовая глубина = больше битов для хранения. Теперь для некоторых материалов, таких как анимация с плоскими цветами или плавными градиентами, вы можете лучше сжимать их, но это не применимо в целом.
Я также не вижу причин здесь, 8-битный содержит меньше информации, чем 12-битный, что делает 12-битный больше, даже простая математика может ответить на этот вопрос, не проходя весь процесс кодирования/сжатия.
Так что можно с уверенностью предположить, что сжатие работало бы лучше при более высоком CRF, и это зависит от примеров видео, поскольку некоторые могут иметь зернистость, некоторые могут иметь более высокое движение, чем другие, поэтому я не мог эффективно использовать алгоритмы сжатия и вместо этого просто скомпрометировал размер данных без очевидного усиления сжатия?
Да, вы ничего не выиграете от расширения 8-битного источника до 12-битного. Я бы предложил использовать этот источник, чтобы поиграть с кодировщиком: mango.blender.org
Просто хотел уточнить, что это верно только для 265. 264 выиграет от расширения бит. Смотрите обсуждение здесь
@AdamMannPro: такая простая математика не работает для кодеков с потерями, которые все равно квантуют перед подачей данных в энтропийный кодер. Смотрите мой ответ. Ответ на вопрос о размере файла полностью связан с поведением управления скоростью CRF x265 и очень мало связан с тем, является ли 12-битный x265 лучшим, равным или худшим качеством на битрейт при преобразовании обратно в 8-битный.

Ответы (1)

crf=18rate-control создает файлы большего размера в 12-битном режиме. Если вы пытаетесь найти некоторые настройки кодирования, которые хорошо работают для некоторого контента, вы не должны предполагать, что один и тот же CRF с разной битовой глубиной будет одинаковым. (Либо один и тот же SSIM, либо одно и то же воспринимаемое визуальное качество).

Вы ничего не сказали о качестве или качестве в зависимости от размера файла. Предположительно, большие файлы также выглядят немного лучше, поскольку 12-битный x265 имеет примерно такое же качество на битрейт, как и 8-битный x265. (Я тестировал с 10 против 8, но не с 12).

CRF не является точной настройкой целевого качества. Поэтому, если вы хотите сравнить настройки, используйте 2pass с одинаковым битрейтом для обоих и посмотрите на качество. Используйте либо SSIM, либо, что предпочтительнее, визуальный осмотр человеком. (Некоторым людям нравится приостанавливать/масштабировать, но не делайте этого просто так. Некоторые виды артефактов/искажений заметны при воспроизведении видео, но многие гораздо менее заметны. Пауза/масштабирование помогает при проверке вашего визуального впечатления от " резкость» / «больше деталей», поэтому выясните, что произвело на вас такое впечатление, и, возможно, также другие вещи, на которые нужно обратить внимание, чтобы увидеть, можете ли вы все еще замечать их во время воспроизведения видео.)

Для реального кодирования, как только вы найдете настройки, которые вам нравятся, CRF великолепен, но он не годится для сравнения качества на битрейт различных настроек кодирования.


8-бит против 10/12-бит

Для x265 все еще может быть некоторый выигрыш в эффективности сжатия, но он определенно меньше, если вообще существует. 10 или 12-битные могут выглядеть даже немного хуже. См. обсуждение doom9 , ссылка на которое предоставлена ​​Майклом в комментарии. Я не следил за последними обсуждениями, поэтому я не уверен, каков текущий консенсус в отношении 10-битного x265 для 8-битного видео. Даже если есть небольшой выигрыш, он может не стоить потери скорости.

Это определенно далеко не коэффициент 12/8, как предлагают некоторые комментаторы, основываясь на «простой математике». Видеокодек с потерями, такой как h.265, не очень похож на простое сжатие без потерь, такое как ZIP.

x264 в целом выигрывает от работы в 10-битном режиме, даже если исходный источник 8-битный, как и конечный дисплей (но опять же, вы не должны ожидать, что один и тот же CRF будет давать тот же битрейт или то же качество при разная глубина). 8-битный h.265 имеет более точные векторы движения, чем 8-битный h.264, поэтому часть рассуждений не применима к x265.

Помните, что и h.264, и h.265 хранят информацию в видео в виде квантованных коэффициентов частотной области. С решеткой / rdoq он даже настраивает квантование, чтобы хорошо сжимать его с помощью конечного энтропийного кодера (например, CABAC в h.264), поэтому одно и то же количество битов может представлять один и тот же объем информации, независимо от того, имел ли энтропийный кодер 8- битовый или 12-битный ввод. 8-бит в каком-то смысле просто спидхак.

Больше битов означает, что вы можете приблизиться (меньшая ошибка), но при этом иметь некоторую ошибку. Таким образом, у кодировщика больше возможностей выбора между искажениями и битрейтом. Отчасти это может быть причиной того, что 10-битный x264 меньше страдает от артефактов «полосатости» в градиентах: у него больше выбора для представления коэффициента постоянного тока или небольших значений коэффициентов переменного тока.


Чем выше входная битовая глубина (для заданного выходного битрейта), тем больше битов кодер должен отбросить. Многие из этих дополнительных битов равны нулю, если исходное видео было 8-битным. (Кодирование с потерями уже отбрасывает много битов, например, от 12 бит на кадр на кадр (для субдискретизации цветности YUV 4: 2: 0 с 8-битными компонентами) до 0,15 бит / пиксель / кадр, и все еще выглядит довольно близко к визуально прозрачным, особенно при высоком разрешении, когда типичное видео содержит информацию, распределенную по большему количеству пикселей.)

Если вы собираетесь изменять масштаб, предположительно, переход на 10 или 12 бит перед масштабированием позволит масштабировать смешанные пиксели с меньшей потерей информации. (например, 10-битное значение может точно хранить среднее значение четырех 8-битных значений.)