Documentación básica explicada de x264

Índice

¿Qué es x264?

x264 es una librería libre de codificación de vídeo en H.264/MPEG-4 AVC (Advanced Video Codec), un códec de vídeo altamente compatible y de los más usados. Supone una gran mejora en calidad de vídeo y compresión frente a sus predecesores.

Preparación

El programa que necesitaremos será x264, del cual podemos encontrar la versión oficial aquí. También existen versiones modificadas, como kMod, tmod o aMod. Esta última es útil cuando se aplica filtrado con VapourSynth, pues no precisa de VSPipe.

Parámetros

Las recomendaciones realizadas son en parte relativas, ya que depende bastante del vídeo base. Lo mejor es experimentar y hacer pruebas para buscar la configuración ideal para cada vídeo (o serie).

Input depth

Establece la profundidad de bits del vídeo de entrada. Podemos averiguarlo fácilmente con MediaInfo o cualquier otro programa.

--input-depth 16

Output depth

La profundidad de bits de salida. En principio usaremos 10 bits. ¿Por qué? El uso de 10 bits supone una mejora en la compresión, pues evita que se tenga que guardar la información del dithering o tramado, una técnica para crear la ilusión de profundidad de color mediante la aproximación de los colores no disponibles por difusión dentro de la gama de colores disponibles, y de esta forma busca evitar artefactos, o artifacts, en el vídeo, como puede ser el banding, o bandeado (lo cual explicaré en VapourSynth).
¿Pero qué mejora tienen los 10 bits entonces? Pues, mientras que 8 bits contiene una gama de color de 256 colores por canal, en 10 bits tenemos 1024, y de esa manera, además de suponer una leve mejora en la imagen, puede ayudar en la compresión del vídeo. Aquí una explicación más a fondo.

--output-depth 10

Profile

El perfil que usaremos para la codificación será "high", el cual cuenta con las siguientes extensiones:

Perfil Formato
high YUV420P8
high10 YUV420P10
high422 YUV422P10
high444 YUV444P10

Usaremos principalmente high10, ya que estaremos usando 10 bits. Por otro lado, también tenemos high444, que si bien puede ser conveniente en algunos casos, las mejoras no son casi apreciables (salvo, como ya he dicho, en algunos casos).

--profile high10

Preset

Establece la velocidad. Cuanto más rápido sea, menor será la calidad.

Priorizaremos la calidad y, por tanto, nos quedaremos con algo entre slow y veryslow.

--preset veryslow

Tune

Optimización según el contenido.

Nos interesan film, animation o grain, dependiendo del contenido.

--tune animation

CRF

El CRF (Constant Rate Factor) es un modo de codificación de una pasada que intenta mantener una calidad constante por fotogramas. Es decir, tendrá en cuenta la calidad del vídeo, no el tamaño o el bitrate objetivo del archivo. Cuanto menor sea el valor, mayor será la calidad, siendo 0 lossless (sin pérdidas).

--crf 16.5

MB-tree

Controla la propagación de información entre bloques futuros y pasados en vectores de movimiento. Reducirá la calidad en la parte compleja de una escena, mientras que un fondo estático conservará una calidad alta. Al trabajar con animaciones con poco grano, será normal su uso. Igualmente, es recomendable comprobarlo por cuenta propia. Para deshabilitarlo:

--no-mbtree

partitions

El tamaño de análisis de macrobloques. Un valor mayor producirá un resultado de mayor calidad, pero reducirá la velocidad. Se recomienda el uso de all.

--partitions all

rc-lookahead

Establece cuántos fotogramas pueden buscar adelante MB-tree (macroblock tree). Es recomendable usar valores lo más altos posibles, ya que cuantos más fotogramas futuros tenga MB-tree de referencia, será más eficiente, dando un mejor resultado. Por otro lado, valores más altos consumen una gran cantidad de memoria y el tiempo de codificación será mayor. El valor máximo es 250 (o keyint).

--rc-lookahead 125

Deblock

Lo que hace este parámetro es mejorar la calidad del vídeo suavizando los bordes nítidos que pueden formarse entre macrobloques. Con valores negativos, más de estos bordes se considerarán detalles, y al usar valores positivos serán menos. Consta de dos parámetros, alpha:beta, ambos actuando como umbrales aplicando una compensación a la cuantización (QP).

--deblock 0:0

B-frames

Establece el número máximo de B-frames a usar. Los B-frames resultan una mayor ayuda en la compresión. Para consultar más acerca de los distintos tipos de fotogramas: Tipos de frames (compresión de vídeo).

--bframes 16

B-adapt

El algoritmo para la decisión en la colocación de B-frames.

--b-adapt 2

Frametype quantizer ratio

Para contenido con más grano, valores más bajos ayudarán, mientras que con vídeos más planos, un ratio mayor resultará en un mejor resultado. Se recomienda guardar una diferencia de 0.10 entre ambos valores, aunque como generalmente usaremos MB-tree, el pbratio no tendrá ningún efecto.

--ipratio 1.40 --pbratio 1.30

psy-rd

Cuenta con dos valores:

--psy-rd 0.85:0.0

Motion estimation

--me umh --merange 32 --subme 10 --direct auto --trellis 2

ref

El número de fotogramas previos que puede emplear uno de tipo P como referencia. Las animaciones se ven altamente beneficiadas por el uso de valores mayores, mientras que el cine real no tanto y no se recomienda subir de 5.
El valor máximo es 16.

--ref 16

Adaptive quantization

Distribuye bits a bloques planos.

--aq-mode 3 --aq-strength 0.85

Quantizer

--qcomp 0.75 --qpmin 0 --qpmax 32 --chroma-qp-offset 0

keyint

--keyint 250 --min-keyint 23

scenecut

La sensibilidad para la detección de cambios de escena en los que insertar fotogramas de tipo I.

--scenecut 40

no-fast-pskip

Deshabilita fast-pskip, que provoca una ligera pérdida de calidad.

--no-fast-pskip

weightp

Ayuda en la compresión de fotogramas de tipo P. Cuenta con tres modos:

--weightp 2

threads

--threads 12 --lookahead-threads 3

Ejemplo

Para comprimir un vídeo, crearemos un archivo .bat y tendremos algo parecido a lo siguiente:

            set name=Ejemplo
set num=01
set tag=Ejemplo
@ECHO OFF
setLocal EnableDelayedExpansion
echo "%name%" - Encode
echo.
set out=G:\Encode\.vscode\Scripts\Encoded\%name%\[%tag%] %name% - %num% [RAW].mkv
set params=--input-depth 16 --output-depth 10 --profile high10 --preset veryslow --tune animation --crf 13 --deblock 0:0 --keyint 250 --min-keyint 23 --bframes 16 --scenecut 40 --chroma-qp-offset 0 --rc-lookahead 150 --merange 32 --subme 10 --psy-rd 0.90.0.00 --no-fast-pskip  --ref 16  --me umh --direct auto --qpmin 0:0:0 --qpmax 32:32:32 --aq-strength 0.95 --aq-sensitivity 10 --qcomp 0.75 --aq-mode 3 --partitions all --trellis 2 --weightp 2 --threads 12 --lookahead-threads 3
"G:\Encode\.vscode\Scripts\bin\x264_x64.exe" %params% -o "%out%" "[video_de_entrada]"
pause       
        

set name: el nombre de la serie o lo que corresponda.
set num: el número de episodio o de lo que sea.
set tag: una etiqueta que dar al nombre del archivo.
set out: el archivo de salida.
set params: los parámetros.
Al final, llamo a x264 mediante la ruta en la que se encuentra e introduzco primero los parámetros, luego marco la salida con -o y la variable de la ruta de salida (entre comillas, por si hay espacios) y por último la ruta al vídeo de entrada.

Referencias