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

Escrito por picodotdev el , actualizado el .
gnu-linux software-libre
Enlace permanente 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 archivos de vídeo, contenedor y codificador de vídeo y audio

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últiples 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.

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

  • Codecs de vídeo: h264, mpeg4, libxvid, vp8, vp9, …
  • Codecs de audio: mp3, ac3, libvorbis, …

Obtener codecs soportados por FFmpeg

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.

Con el siguiente comando obtenemos la lista de codificadores y decodificadores que es capaz de utilizar FFmpeg:

1
2
$ ffmpeg -encoders
$ ffmpeg -decoders
ffmpeg-codecs.sh

Obtener información de un archivo de vídeo

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:

Por otro lado, 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.

1
2
$ ffmpeg -i video.mkv

ffmpeg-info.sh

Información de un vídeo

Operaciones comunes con archivos de vídeo

Convertir un archivo de vídeo entre formatos

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 correctamente 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, los tres parámetros forman el formato del archivo de vídeo.

1
2
3
4
5
6
7
8
$ ffmpeg -i input.mkv -c:v mpeg2video -c:a libmp3lame -b:v 3500K -b:a 192K output.mpg
$ ffmpeg -i input.mkv -c:v mpeg1video -c:a libmp3lame -b:v 3500K -b:a 192K output.mpg
$ ffmpeg -i input.mkv -c:v mpeg4 -c:a libmp3lame -b:v 3500k -b:a 192k output.avi
$ ffmpeg -i input.mkv -c:v libx264 -c:a ac3 -b:v 3500k -b:a 192k output.mp4
$ ffmpeg -i input.mkv -f avi -tag:v DIVX -c:v libxvid -b:v 1800k -c:a libmp3lame -b:a 192k -vf scale=720x406,setdar=16:9 output.avi
$ ffmpeg -i input.mkv -c:v libvpx -c:a libvorbis -b:v 3500K -b:a 192K output.webm
$ # Cambiar únicamente de contenedor
$ ffmpeg -i input.mkv -c:v copy -c:a copy -b:v 3500K -b:a 192K output.mpg
ffmpeg-convert.sh

Salida conversión de MKV a MPG

Cambiar la resolución del vídeo

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.

1
2
$ ffmpeg -i input.mkv -c:v mpeg2video -c:a libmp3lame -b:v 2500K -b:a 192K -vf scale=720x406,setdar=16:9 output.mpg

ffmpeg-scale.sh

Extraer el audio de un vídeo

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.

1
2
$ ffmpeg -i input.mkv -vn -acodec libmp3lame -b:a 128K output.mp3
$ ffmpeg -i input.mkv -vn -acodec libvorbis -b:a 128K output.ogg
ffmpeg-extract.sh

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.

1
2
$ ffmpeg -i video.mkv -map 0:0 -map 0:2 -acodec copy -vcodec copy newvideo.mkv

ffmpeg-map.sh

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.

1
2
$ ffplay -i video.mkv

ffplay.sh

FFplay

Extraer una imagen de un vídeo

Otra operación es extraer una imagen o fotograma de un archivo de vídeo indicando el tiempo específico del vídeo de la que se quiere la imagen. El parámetro -ss indica el tiempo específico en segundos desde el inicio del fotograma y el parámetro -frames:v indica que solo se desea un fotograma, el parámetro -i especifica el vídeo de entrada y image.jpg es el archivo de salida con el formato de imagen según la extensión indicada.

1
2
$ ffmpeg -ss 15 -i video.mp4 -qscale:v 4 -frames:v 1 image.jpg

ffmpeg-image.sh

Esta operación de obtener un fotograma de una película o vídeo se puede combinar con la herramienta j2pa para convertir una imagen a arte de caracteres ASCII.

Realizar conversiones de forma masiva

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.
1
2
3
4
5
$ # conversión masiva
$ for f in *.mkv; do ffmpeg -i "$f" -c:v mpeg2video -c:a libmp3lame -b:v 2500K -b:a 192K -vf scale=720x406,setdar=16:9 "${f%.mkv}.mpg"; done;

$ # conversión masiva y recursiva en árbol de carpetas
$ find ./ -name "*.mkv" -exec ffmpeg -i {} -c:v mpeg2video -c:a libmp3lame -b:v 2500K -b:a 192K -vf scale=720x406,setdar=16:9 "${f%.mkv}.mpg"; -exec rename .mkv.mpg .mpg "{}.mpg" \;
ffmpeg-masive.sh

Herramientas gráficas para convertir formatos y editar vídeos

Si preferimos realizar la conversión mediante una interfaz gráfica podemos se pueden utilizar varias herramientas, una de ellas es HandBrake específica para realizar conversiones con multitud de opciones con la que es posible hacer las mismas operaciones que con FFmpeg e incluye preconfiguraciones para producir resultados compatibles y eficientes para dispositivos y páginas como YouTube o compartirlos en redes sociales. Tiene la opción de realizar encolar tareas de conversión a aplicar a varios archivos.

Otra herramienta de conversión pero también de edición son Pitivi o OpenShot, como herramientas de edición permiten crear vídeos con fragmentos de varios vídeos, cambiar o añadir el audio, definir la resolución y formato de salida.

Herramientas para archivos multimedia

Hay muchas otras operaciones y herramientas para archivos multimedia de vídeo o audio en formato de línea de comandos o con interfaz gráfica. En esta página lista de aplicaciones multimedia de la wiki de Arch Linux.

Comparte el artículo: