Demux y remux de videos con ffmpeg

Como pirata que soy recientemente deseaba ver la trilogía de Batman de Christopher Nolan así que la termine descargando de un sitio aleatorio en la vasta red. El archivo de video para mi sorpresa traía varios idiomas, subtítulos y un índice de capítulos. Sin embargo al añadirlo a mi biblioteca de Plex, no era reconocido, por lo que decidí simplificar un poco el archivo y dejar solo la pista de video, el audio en español y en inglés y los subtítulos en español y dejar de lado todo lo demás.

Como el archivo ya se encontraba en el servidor Plex, y solo tengo acceso a él vía SSH. Me tocó manipular por completo el archivo vía línea de comandos. Lo primero será listar los streams que contiene el contenedor mkv.

$ ffprobe -v error -show_entries stream=index,codec_name,codec_type original.mkv

Este comando producirá una salida similar a esto:

[STREAM]
index=0
codec_name=h264
codec_type=video
[/STREAM]
[STREAM]
index=1
codec_name=ac3
codec_type=audio
[/STREAM]
[STREAM]
index=2
codec_name=ac3
codec_type=audio
[/STREAM]
[STREAM]
index=3
codec_name=ac3
codec_type=audio
[/STREAM]
[STREAM]
index=4
codec_name=subrip
codec_type=subtitle
[/STREAM]
[STREAM]
index=5
codec_name=subrip
codec_type=subtitle
[/STREAM]
[STREAM]
index=6
codec_name=subrip
codec_type=subtitle
[/STREAM]

Ahora extraeré los streams que necesito para armar el nuevo video. En este punto, si deseamos podemos extraer todas las pistas y escucharlas con ffplay para poder saber el contenido de cada una o el idioma.

$ ffmpeg -i original.mkv -map 0:0 -c copy video.mkv -map 0:1 -c copy audio1.ac3 -map 0:2 -c copy audio2.ac3

El proceso de extracción de los streams del contenedor mkv original es lo que se conoce como demuxar. Al usar la opción -c copy extrae el contenido en el mismo formato que se encuentra en el contenedor.

Lo siguiente será volver a unir los archivos extraídos en un solo contenedor mkv, este es el proceso de remux. Podemos añadir también en este punto una etiqueta al stream de audio para identificar el idioma, solo tenemos que añadir el código de 3 letras del idioma en formato ISO 639-2.

$ ffmpeg -i video.mkv -i audio1.ac3 -i audio2.ac3 -map 0:0 -map 1:0 -map 2:0 -metadata:s:a:0 language=spa -metadata:s:a:1 language=eng -vcodec copy -acodec copy -acodec copy 'video_editado_final.mkv'

Con esto ya tendremos nuestro archivo de video listo para consumo y reconocido por Plex, una vez lo nombremos con el sistema de Plex.

avatar
Médico de atención primaria, fotógrafo aficionado, apasionado de las tecnologías relacionadas con el EdTech y el eHealth y diseñador/desarrollador de sitios web de salud.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.