Cambiar el formato de archivos de vídeo o películas en GNU/Linux

Publicado por pico.dev el .
blog-stack gnu-linux planeta-linux software-libre
Comentarios

FFmpeg
Linux

En el artículo anterior comentaba como cambiar el formato de archivos de música o audio, por ejemplo de wav a mp3, de wav a ogg o de mp3 a ogg de archivos individuales, de forma masiva los de un directorio o de forma recursiva de toda una biblioteca de música organizada en múltiples directorios. Para hacer la conversión usaba la herramienta FFmpeg, esta misma herramienta sirve también para hacer conversiones en el formato de archivos de vídeo o películas. Las conversiones de los archivos de música nos puede interesar para reducir su tamaño, un mp3 ocupa mucho menos que un wav y un archivo ogg es un formato libre de patentes no así el formato mp3. En el caso de los vídeos también nos puede interesar hacer una conversión, reducir su tamaño, extraer solo el audio, extraer solo el vídeo u obtener un trozo del vídeo entre varias cosas más que podemos realizar con FFmpeg.

Formatos de vídeo hay bastantes, en el futuro surgirán más y por tanto los reproductores no son capaces de manejar correctamente todos o solo los más comunes, si el reproductor es algo antiguo seguramente los nuevos formatos no sea capaz de reproducirlos, el reproductor puede ser un aparato específico o una Smart TV que pasado un tiempo quedan en parte obsoletos si no pueden actualizarse para soportar nuevos y mejores formatos de vídeo o audio. Por otro lado la calidad de los vídeos varía según el tamaño pudiendo ser menor de lo considerado como alta definición, HD (720 líneas), Full HD (1080 líneas) o 4K (2160 líneas). Según sea la resolución de la televisión o pantalla donde vayamos a visualizar el vídeo no se va a ver mejor aunque el vídeo tenga más resolución que la pantalla por lo que cambiar la resolución del vídeo si es mayor que la resolución de la pantalla haremos que el vídeo ocupe mucho menos sin perder apenas o ninguna calidad de forma perceptible.

Para entender los formatos de archivos de vídeo hay que distinguir tres conceptos que explican bastante bien en una página de la wiki de Arch Linux relativa a la codificación de vídeo: el contenedor, el codificador de vídeo y el codificador de audio. El contenedor determina la estructura en la que son almacenados los bits en el archivo de vídeo, mantiene la sincronicación entre el vídeo y el audio o permite que haya mútiples pistas de vídeo, audio en diferentes idiomas, subtítulos o un menú similar a los presentes en los DVD de los reproductores de salón. El codificador de vídeo aplica su algoritmo de compresión reduciendo considerablemente el tamaño de cada fotograma y el codificador de audio igualmente aplica un algoritmo de compresión que también reduce considerablemente el tamaño del audio. Las dimensiones del vídeo en ancho y alto en pixeles y la tasa de bits por segundo tanto del audio y vídeo determinan la calidad del vídeo, a más resolución y tasa de bits el vídeo tendrá más calidad y se verá mejor siempre que la pantalla donde se visualice lo permita, pero a mayor calidad mayor tamaño del archivo de vídeo.

Contenedores de vídeo son MKV (Matroska), AVI, MP4, WebM, WMV, o FLV siendo MKV, MP4 y AVI los más comunes en el momento de escribir este artículo. Con el siguiente comando obtenemos la lista de codificadores y decodificadores que es capaz de utilizar FFmpeg:

Algunos de los codificadores (encoders) y decodificadores (decoders) más comunes son:

  • Vídeo: h264, mpeg4, libxvid, vp8, vp9, …
  • Audio: mp3, ac3, libvorbis, …

Si antes de reproducirlos en el reproductor multimedia o Smart TV pruebas en vídeo convertido con el reproductor multimedia VLC has de tener en cuenta que VLC es capaz de reproducir casi todo lo que se le eche, por tanto que funcione con VLC no quiere decir que vaya a funcionar con el reproductor que usemos.

Partiendo de un vídeo en un contenedor MKV, vídeo codificado con H.264 y audio codificado con mp3 estos son los comandos que me han servidor para recodificarlo y reproducirlo corretamente en un reproductor multimedia iomega ScreenPlay TV Link que tendrá ya más de 7 años. De MKV/H.264/MP3 a MPG/MPEG2/MP3, a MPG/MPEG1/MP3, a MP4/H.264/AC3 y en el caso de DivX AVI/XViD/MP el vídeo se reproducía con unos molestos frecuentes pequeños parones en la imagen. Con el parámetro -c:v indicamos el codificador de vídeo, con -c:a el codificador de audio y con la extensión del archivo de salida el contenedor.

Si no se indica la tasa de bits como indican en la documentación de FFmpeg el codificador seleccionará por defecto una tasa de bits muy baja resultando en una calidad muy pobre por lo que deberemos indicar una similar a la original. Para ver ver la calidad de un vídeo y del audio usamos el parámetro -i:

Con la información de la calidad el vídeo y audio original lo indicamos en la conversión con los parámetros -b:v y -b:a para el vídeo y audio de los como se ha usado en los ejemplos anteriores. Si queremos cambiar la resolución del vídeo lo indicamos con el parámetro -vf, reduciremos también la tasa de bits dedicados si el tamaño del vídeo de salida es menor.

Con FFmpeg también nos es posible extraer el audio de un vídeo a un archivo de sonido mp3 o ogg o quitar el audio del vídeo, para ello con el parámetro -vn omitiremos el vídeo y con -an omitiremos el audio:

Los vídeos pueden tener múltiples pistas de audio y subtítulos en varios idiomas, para reducir el tamaño del archivo podemos eliminar las pistas de los idiomas que no queramos. Por ejemplo, el siguiente vídeo contiene tres pistas de subtítulos en los idiomas español, inglés y francés y cuatro pistas de audio en japonés, español, francés y español latinoamericano, el siguiente comando nos da información de las pistas o streams en la parte final.

Para hacer la eliminación de las pistas usamos el siguiente comando donde los parámetros -map son las pistas o streams que queremos copiar y conservar del original en el nuevo archivo, en este caso solo la pista del vídeo y la pista de audio en español. Dependiendo del número de pistas para otros idiomas que tenga el archivo y de la duración del vídeo el ahorro de espacio que conseguiremos será más o menos notable. Haciendo un cálculo suponiendo algunas cifras habituales un audio a 320kb/s para una película de 120 minutos el audio ocupa alrededor de 281 MiB que ya es una cifra notable ((320 kilobits/segundo / 8 bits/byte) * 60 segundos/minuto * 120 minutos / 1024 kilobytes/megabyte = 281,25 megabytes) y a lo que hay que multiplicar cada pista de audio que eliminemos del original.

Si no tenemos instalado un reproductor de vídeo con el comando ffplay podemos reproducirlo, quizá en algún caso nos sirva aunque esté destinado principalmente para pruebas ya que no ofrece controles para pausar o detener la reproducción.

Al igual que comentaba en el artículo de convertir archivos de audio todas estas operaciones son realizables de forma masiva en un directorio o recursiva en múltiples directorios con los siguientes comandos.

Otras opciones útiles disponibles en los comandos de FFmpeg son:

  • -t: para limitar la operación hasta el tiempo en segundos indicado.
  • -ss: para empezar desde desde un punto posterior relativo al inicio.
  • _-sseof: como -ss pero desde el final.

Si preferimos realizar la conversión mediante una interfaz gráfica podemos usar VLC que también nos servirá para hacer la conversión tanto en Windows como en Mac OS además de GNU/Linux. Primeramente en el menu Archivo > Convertir añadimos el archivo a convertir a la lista y pulsamos botón Convertir. En el siguiente diálogo seleccionaremos el perfil de salida y el nombre del archivo de salida, editando el perfil tendremos opción de modificar la tasa de bits del vídeo y audio, además de la resolución y la posibilidad de aplicar algunos filtros.

Yo apoyo al software libre