Banda Ancha EU

Comunidad de usuarios
de fibra, móvil y ADSL

Codificar con ffmpeg de HDR a SDR

BocaDePez
BocaDePez

Hola, buenas tardes.

Me he bajado un vídeo de Youtube de dimensiones 4k 10bit que posee el filtro HDR (High Dynamic Range). Este filtro posibilita la visión de un colorido más vivo y auténtico.

Mi idea es codificarlo reduciéndolo a 1080p con 8bit y sin HDR, es decir, en SDR. Pero al hacerlo los colores quedan muy apagados, como si la saturación de los colores se ajustara a la baja.

He probado con estas configuraciones:

ffmpeg -i video_entrada.webm -c:v libx264 -pix_fmt yuv420p -crf 18 -preset slow \
-vf scale=1920:-1 -tune film -maxrate 5000k -bufsize 1835k -an -sn video_salida.mkv

Solamente me ocurre con los vídeos que incorporen el filtro HDR.

¿Alguien consigue hacer este tipo de codificaciones de forma satisfactoria?

Un saludo.

BocaDePez
BocaDePez
1

Hola de nuevo.

Después de buscar mucho, finalmente he encontrado una forma de codificar de HDR a SDR, aunque debe ser con el FFmpeg de Windows en combinación con el codificador x264 (este sí puede ser nativo).

El inconveniente se encuentra en el filtro zscale, el cual parece estar operativo solamente en el FFmpeg de Windows (en GNU/Linux aparece como habilitado pero no consigo hacerlo funcionar).

Para conseguir la transformación hay que ejecutar una línea de comandos similar a la siguiente:

$ wine ffmpeg.exe -loglevel panic -i archivo_con_HDR.mkv -vf zscale=tin=smpte2084:min=bt2020nc:pin=bt2020:rin=tv:t=smpte2084:m=bt2020nc:p=bt2020:r=tv,zscale=t=linear:npl=100,format=gbrpf32le,zscale=p=bt709,tonemap=tonemap=hable:desat=0,zscale=t=bt709:m=bt709:r=tv,format=yuv42 -strict -1 -f yuv4mpegpipe - | x264 --stdin y4m -o archivo_de_destino_en_SDR.mkv -

Un saludo.

🗨️ 1
BocaDePez
BocaDePez
1

Me respondo a mí mismo.

El problema del filtro zscale parece que ocurre en algunos FFmpeg de 64 bits. En ese caso puede usarse un FFmpeg binario de 32 bits: johnvansickle.com/ffmpeg

Finalmente, la línea de comandos para codificar puede reducirse y quedarse así:

$ ffmpeg -i archivo_con_HDR.mkv -vf zscale=t=linear:npl=100,format=gbrpf32le,zscale=p=bt709,tonemap=tonemap=hable:desat=0,zscale=t=bt709:m=bt709:r=tv,format=yuv420p -c:v libx264 archivo_de_destino_en_SDR.mkv

Un saludo.