martes, 7 de enero de 2020

Conversión de sonido TrueHD: la vieja confiable ffmpeg

En estos días de Navidad nos han dado muchas cosas, y entre ellas un fichero matroska de una de las películas que más me ha gustado en mi vida. Jamás había visto ninguna versión, original o copia, con esa calidad. Sin embargo, presentaba varías características que me hizo difícil verla como yo quería; primero, la pista del sonido en lengua original estaba en TrueHD 5.1; segundo, los subtítulos estaban en formato PGS (Presentation Graphic Stream subtitle format). Estos formatos no generan ningún problema en el ordenador, pero prefiero ver una película como esta con más calidad, con más tamaño y con un sonido mejor que el que puede generar un monitor de 24' con altavoces de 2W. Ninguna de las dos televisiones LG de las que dispongo pudo decodificar el sonido TrueHD ni los subtítulos PGS. Ya hemos explicado en una entrada anterior como se transforma un subtítulo PGS, que es una imagen, a un formato texto srt; sin embargo, como es un trabajo laborioso y como entre las muchas versiones de las que dispongo de esa película se incluye —incluía, por que ésta la ha sustituido—  una Versión Final con la misma duración con subtítulos srt extraje esos ficheros del mkv. Pero una cosa muy distinta es el sonido. El formato TrueHD ofrece un sonido sin pérdida de calidad en la compresión y no merecía la pena recurrir a un AC3 antiguo, con lo que el primer objetivo fue la transformación del TrueHD a un formato que mis dispositivos pudieran leer. La extracción siempre es sencilla utilizando mkvextract

mkvextract origen.mkv tracks x:salida.ingles.truehd

siendo x el número de pista que queremos extraer, y teniendo en cuenta que mkvextract empieza a contar sobre cero; es decir, si vídeo = 0, sonido español = 1, sonido inglés TrueHD = 2, PGS Español = 3...
La extracción fue la parte fácil. En general, cuando se trata de transformar un audio extraído de esa manera —en mi caso casi siempre para convertir FLAC a AAC—, utilizo soundkonverter, que es una máscara gráfica —GUI, de Graphical User Interface o a veces wrapper— de ffmpeg, software que lo convierte todo.


Sin embargo, soundkonverter no reconocía el fichero con sonido TrueHD, así que busqué alternativas en el mundo —en google—. Las opciones que aparecían eran:
- de truehd a flac con audiomuxer; es de windows y prefiero no pasar por flac (maneja 5.1?; la televisión más grande y gorda que tengo no lee flac...)
- popcorn mkvaudioconverter: y eto que é?
- eac3to

De todos ellos, incluso intenté usar eac3to en wine, pero faltaban codecs intermedios y no era capaz de construir adecuadamente el comando. Cuando todo falla, tendemos a recurrir a la vieja confiable, que nos soluciona todo; es decir, un simple comando de ffmpeg sin máscaras

ffmpeg -i sonido.in.truehd sonido.in.aac

y todo lo demás lo ajustó directamente ffmpeg. Vean al final de la entrada la salida en el terminal.
Además, al incorporar los subtítulos srt DESPUÉS de los PGS, las máquinas LG tampoco pudieron leerlos, así que finalmente eliminé los PGS. La pista TrueHD no la eliminé, simplemente añadí la aac después, por si algún otro dispositivo lo puede leer TrueHD en el futuro, o en alguna actualización de las LG tienen a bien incorporar este codec. Por cierto, el sonido TrueHD ocupa, para 1h58m 3,2GB, miestras que aac comprimido a máxima calidad —sí, con perdida, lo sé, pero FLAC no leen mis dispositivos y PCM ocupa hasta el infinito y más allá— ocupa la décima parte.

Qué no encuentras una solución nueva, ¡usa la de toda la vida!


Resultado del comando en el terminal
$ ffmpeg -i blader.in.truehd blader.in.aac
ffmpeg version 4.2.1 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 9 (GCC)
  configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --docdir=/usr/share/doc/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --optflags='-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' --extra-ldflags='-Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld ' --extra-cflags=' ' --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-amrwbenc --enable-version3 --enable-bzlib --disable-crystalhd --enable-fontconfig --enable-frei0r --enable-gcrypt --enable-gnutls --enable-ladspa --enable-libaom --enable-libdav1d --enable-libass --enable-libbluray --enable-libcdio --enable-libdrm --enable-libjack --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libmp3lame --enable-nvenc --enable-openal --enable-opencl --enable-opengl --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librsvg --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzvbi --enable-avfilter --enable-avresample --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-libmfx --enable-runtime-cpudetect
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
Input #0, truehd, from 'blader.in.truehd':
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0:0: Audio: truehd, 48000 Hz, 5.1(side), s32 (24 bit)
Stream mapping:
  Stream #0:0 -> #0:0 (truehd (native) -> aac (native))
Press [q] to stop, [?] for help
[aac @ 0x55ed8a510b80] Using a PCE to encode channel layout "5.1(side)"
Output #0, adts, to 'blader.in.aac':
  Metadata:
    encoder         : Lavf58.29.100
    Stream #0:0: Audio: aac (LC), 48000 Hz, 5.1(side), fltp (24 bit), 394 kb/s
    Metadata:
      encoder         : Lavc58.54.100 aac
size=  341245kB time=01:57:36.85 bitrate= 396.1kbits/s speed=17.8x    
video:0kB audio:338984kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.667078%
[aac @ 0x55ed8a510b80] Qavg: 418.332







1 comentario:

  1. Muchas gracias por tu ayuda: tenía el mismo problema ¡con el mismo archivo! (la nueva versión de BR)

    ResponderEliminar