Prueba de codificación x265: ¿12 bits dan como resultado un tamaño de archivo mayor que 8 bits de la misma configuración?

Acabo de sentir curiosidad por este formato HEVC x265 y lo probé en un flujo de video BDMV de 1920x1080i, uno codificado con una profundidad de 8 bits y luego otro codificado con una profundidad de 12 bits. Los resultados son que la salida de 8 bits fue más pequeña. Ambas salidas son 1280x720.

Me pregunto por qué es esto así.

Aquí están los MediaInfo:

8 bits:

Velocidad de cuadro: 23.976 fps

Espacio de color: YUV

Submuestreo de croma: 4:2:0

Profundidad de bits: 8 bits

Biblioteca de escritura: x265 1.9+54-291beccb6760:[Windows][GCC 5.3.0][64 bit] 8bit+10bit+12bit

Configuración de codificación: 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 / strong-intra-smoothing / no-lossless / no-cu -lossless / no-restringido-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 / 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 bits: velocidad de fotogramas: 23,976 fps

Espacio de color: YUV

Submuestreo de croma: 4:2:0

Profundidad de bits: 12 bits

Biblioteca de escritura: x265 1.9+194-6d3849d648f0be5a:[Windows][GCC 5.3.0][64 bit] 12bit: KG7x [x265.ru]

Configuración de codificación: 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 / strong-intra-smoothing / no-lossless / no-cu-lossless / no-restringido-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

¿Por qué esperarías que el de 12 bits fuera más pequeño? Mayor profundidad de bits = más bits para almacenar. Ahora, para ciertos materiales como animación con colores planos o degradados suaves, puede comprimirlo mejor, pero no se aplica en general.
Tampoco veo el razonamiento aquí, 8 bits tiene menos información que 12 bits, lo que hace que 12 bits sean más grandes, incluso las matemáticas simples pueden responder esto sin tener que pasar por todo el proceso de codificación/compresión
Entonces, ¿es seguro asumir que la compresión habría funcionado mejor en un CRF más alto, y depende de los videos de muestra, ya que algunos pueden tener grano, algunos pueden tener más movimiento que otros, por lo tanto, no pude utilizar los algoritmos de compresión de manera eficiente y en su lugar solo comprometió el tamaño de los datos sin ganancias aparentes de compresión?
Sí, no está ganando nada al expandir una fuente de 8 bits a 12 bits. Sugeriría usar esta fuente para jugar con el codificador: mango.blender.org
Solo quería aclarar que esto es cierto solo para 265. El video 264 se beneficiará de la expansión de bits. Ver discusión aquí
@AdamMannPro: ese tipo de matemática simple no funciona para códecs con pérdida que cuantifican de todos modos antes de enviar datos a un codificador de entropía. Mira mi respuesta. La respuesta a la pregunta sobre el tamaño del archivo tiene mucho que ver con el comportamiento de control de tasa de CRF de x265, y muy poco con si x265 de 12 bits es de mejor, igual o peor calidad por tasa de bits cuando se vuelve a convertir a 8 bits.

Respuestas (1)

crf=18rate-control produce archivos más grandes en modo de 12 bits. Si está tratando de encontrar algunas configuraciones de codificación que funcionen bien para algún contenido, no debe asumir que el mismo CRF en diferentes profundidades de bits será el mismo. (O el mismo SSIM o la misma calidad visual perceptiva).

No ha dicho nada sobre la calidad o la calidad por tamaño de archivo. Presumiblemente, los archivos más grandes también se ven un poco mejor, ya que el x265 de 12 bits tiene aproximadamente la misma calidad por tasa de bits que el x265 de 8 bits. (He probado con 10 vs. 8, pero no con 12).

CRF no es una configuración de calidad objetivo exacta. Entonces, si desea comparar configuraciones, use 2 pases con la misma tasa de bits para ambos y observe la calidad. Use SSIM o preferiblemente inspección visual humana. (A algunas personas les gusta pausar/acercar, pero no se limiten a hacer eso. Algunos tipos de artefactos/distorsiones se notan cuando se reproduce el video, pero muchos son mucho menos perceptibles. Pausa/acercamiento ayuda cuando verifica su impresión visual de " nitidez"/"más detalle", así que descubra qué le estaba dando esa impresión, y tal vez también otras cosas que debe buscar para ver si aún puede notarlo mientras reproduce el video).

Para codificaciones reales, una vez que encuentra la configuración que le gusta, CRF es excelente, pero no es bueno para comparar la calidad por tasa de bits de diferentes configuraciones de codificación.


8 bits frente a 10/12 bits

Todavía puede haber algunas ganancias en la eficiencia de compresión para x265, pero definitivamente son más pequeñas, si es que existen. 10 o 12 bits incluso podrían verse un poco peor. Vea la discusión sobre doom9 , vinculada por Michael en un comentario. No he seguido las últimas discusiones, así que no estoy seguro de cuál es el consenso actual sobre x265 de 10 bits para video de 8 bits. Incluso si hay una pequeña ganancia, puede que no valga la pena la penalización de velocidad.

Definitivamente no está cerca de un factor de 12/8 como sugieren algunos comentaristas en base a "matemáticas simples". Un códec de video con pérdida como h.265 no es muy similar a una compresión simple sin pérdida como ZIP.

x264 se beneficia en general de ejecutarse en modo de 10 bits, incluso cuando la fuente original es de 8 bits, al igual que la pantalla final (pero nuevamente, no debe esperar que el mismo CRF proporcione la misma tasa de bits o la misma calidad en diferentes profundidades). H.265 de 8 bits tiene vectores de movimiento de mayor precisión que h.264 de 8 bits, por lo que parte del razonamiento no se aplica a x265.

Recuerde que tanto h.264 como h.265 almacenan la información en el video como coeficientes de dominio de frecuencia cuantificados. Con trellis / rdoq, incluso modifica la cuantificación para comprimir bien con el codificador de entropía final (por ejemplo, CABAC en h.264), por lo que la misma cantidad de bits puede representar la misma cantidad de información, si el codificador de entropía tenía 8- entrada de bits o de 12 bits. De alguna manera, 8 bits es solo un truco de velocidad.

Más bits significa que puede acercarse (menor error) sin dejar de tener algún error. Por lo tanto, el codificador tiene más opciones cuando intercambia distorsión frente a tasa de bits. Esta puede ser en parte la razón por la que x264 de 10 bits sufre menos de artefactos de "bandas" en gradientes: tiene más opciones para representar el coeficiente de CC o para tener valores pequeños en los coeficientes de CA.


Cuanto mayor sea la profundidad de bits de entrada (para una tasa de bits de salida determinada), más bits tendrá que desechar el codificador. Muchos de esos bits adicionales son ceros si su video original era de 8 bits. (La codificación con pérdida ya desecha una gran cantidad de bits, como desde 12 bpp por fotograma (para el submuestreo de croma YUV 4:2:0 con componentes de 8 bits) hasta 0,15 bits/píxel/fotograma y todavía se parece bastante a visualmente transparente, especialmente en resoluciones altas donde el video típico tiene su contenido de información distribuido en más píxeles).

Si va a cambiar la escala, es de suponer que pasar a 10 o 12 bits antes de cambiar la escala permitirá que la nueva escala mezcle píxeles con menos pérdida de información. (por ejemplo, un valor de 10 bits puede almacenar exactamente el promedio de cuatro valores de 8 bits).