Mostrando entradas con la etiqueta Subtítulos. Mostrar todas las entradas
Mostrando entradas con la etiqueta Subtítulos. Mostrar todas las entradas

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







martes, 11 de octubre de 2016

Subtitulos PGS en matroska. Conversión a srt

Tengo unos ficheros interesantes de una serie antigua con doblaje español, pero el doblaje original era muy famoso y pude conseguirlo en un montaje de peor calidad de visión. La solución es simplemente extraer el sonido original e incorporarlo a la versión española. Eso añade la necesidad de unos subtítulos para entender mejor la lengua de Shakespeare. Los subtítulos tienen formato PGS (Presentation Graphic Stream subtitle format) que no se ven en muchos lectores de vídeo. La razón es que los subtítulos PGS, al igual que los VOBSUB, no son texto, son imágenes de bits que contienen los subtítulos en pixeles, no un texto con sus letras, fuentes etc. La solución pasa por:

1. Extracción del subtítulo PGS. Seguiremos los pasos del terminal indicados en esta entrada de hace tiempo

mkvextract tracks fichero.mkv 2:subtitulo.sup


2. Conversión del formato bitmap (nombrado sup al extraerlo) a texto mediante OCR ("Optical Character Recognition"). Para eso usamos suprip. Este programa permite hacer el OCR sobre el sup extraído. Es un programa para Windows; aunque puede ser utilizado en Linux con Wine, no lo recomiendo si el subtítulo tiene mas de 20 o 30 líneas. La razón es que el programa va creando su diccionario de reconocimiento y a los 5 minutos ya casi es autónomo, pero bajo wine no continúa hasta que encuentra un caracter no reconocido, sino que para en cada línea, y se hace interminable. Conservar el diccionario de reconocimiento (temp.font que guarda en /home/usuario/.wine/drive_c/users/usiario/Application Data/Suprip bajo wine o el correspondiente en Windows, si bien es cierto que luego lo puedes localizar en el directorio de suprip).
Cuando acaba, exportar el resultado a srt.

3. Revisar, por que nunca queda perfecto.

Una vez conseguidos los subtítulos, ya solo queda montar con mkvtoolnix-gui el doblaje original y los subtítulos srt que leen todos los lectores.

Todo esto, si los audios están ya sincronizados. Si no es así, habrá que sincronizar audios y subtítulos, pero esa es otra batallita.