2 feb 2016

Cómo ahorrar espacio en disco recomprimiendo los vídeos de nuestro smartphone


Hoy día todo el mundo tiene un móvil inteligente que usamos para grabar todo tipo de eventos. Sin embargo, esos vídeos ocupan mucho ya que los procesadores integrados no tienen la potencia suficiente para comprimirlos bien en tiempo real, ocupándonos Gigas y Gigas de valioso espacio, sobre todo si están en Alta Definición.

Veremos cómo reducir el tamaño de nuestras grabaciones de vídeo a 1/4 del tamaño original sin perder calidad, simplemente con hacer un click gracias a la capacidad de programas de código abierto (libres) como Avidemux, y utilizando el moderno códec de compresión H264 (utilizando la biblioteca libre x264), que, entre otras cosas, reduce el ruído y utiliza las más modernas técnicas de compresión de vídeo para comprimir sin que el ojo lo perciba.
Ya expliqué cómo hacerlo hace un tiempo, utilizando Avidemux para reprocesar automáticamente todos los vídeos de una carpeta (y subcarpetas), sin embargo, he comprobado que dichas indicaciones quedaron obsoletas; Avidemux evoluciona rápidamente y en las últimas versiones utiliza Python, con Tinypy.

1. Instalar Avidemux.

Para ello instalamos Avidemux en un ordenador con Windows o Linux y creamos un par de archivos siguiendo las indicaciones, y ya podremos comprimir todos los archivos que están en una carpeta (y sus subcarpetas), dejando a Avidemux que se encargue de hacer todo el trabajo sucio.
Recomiendo instalar la versión de 64 bits si nuestro S.O. es de 64 bits.

Hay que tener en cuenta que el códec x264 no todos los dispositivos lo aceptan, pero sí la mayoría de móviles Android, y cada vez es más popular.
Yo he conseguido reducir el espacio ocupado por los vídeos de los últimos años de 30 GB a 10 GB.

2. Archivos para el procesado por lotes.

Para los perezosos, he creado un zip con ambos archivos ya creados en Drive (pinchar enlace y descargar con el botón de flecha abajo); sólo tenemos que colocarlos en la carpeta raíz donde queramos comprimir los archivos, ejecutar el "x264_convert.bat" que nos creará otro archivo llamado "x264_Scriptmux.bat", con una línea por cada archivo a codificar con el siguiente aspecto:



y al ejecutar éste último, irá abriendo Avidemux con cada vídeo a comprimir, reprocesando cada vídeo mp4 añadiendo *_x264.mp4 al nombre, sin borrar ninguno de los originales.

Si nos gusta el resultado (no siempre resulta en archivos más pequeños), y comprobamos que podemos reproducirlos, podremos borrar entonces los originales, sólo tenemos que buscar por *.mp4; *.avi; *.mpg y borrar los anteriores (siempre que veamos que el archivo ha quedado bien).

Ahora explicaré cómo crearlos, para aquellos que quieran saber cómo pescar, y no sólo comer el pescado ya hecho ;).
Tenemos que crear dos archivos (usando Notepad++ preferiblemente), uno con este texto y de extensión .bat y sustituyendo "C:\Program Files\Avidemux 2.6 - 64 bits\Avidemux.exe" por la ruta que corresponda a nuestra instalación, y al guardarlo indicar formato de archivo UTF-8 para no tener problemas con los carácteres especiales en los nombres de los archivos (si os diera el error "TinyPy Exception: Can't get filesize", probad a quitar los caracteres especiales como tildes y ñ en la ruta de los archivos):
for /R %%x in (*.mp4) do (
   echo."C:\Program Files\Avidemux 2.6 - 64 bits\Avidemux.exe" --load "%%~dx%%~px%%~nx.*" --run "x264_convert.py" --save "%%~dx%%~px%%~nx_x264.mp4" --quit
) >> x264_ScriptMux.bat
exit
(Estas indicaciones sólo funcionan en Windows, en Linux cambian algunos detalles). Si queremos procesar sólo archivos .AVI y convertirlos a mp4 sólo tenemos que cambiar en el texto donde aparezca "mp4" por "avi" (sin las comillas), o bien agregar líneas para cada tipo de archivo como en el siguiente ejemplo:

for /R %%x in (*.mp4) do (
echo."C:\Program Files\Avidemux 2.6 - 64 bits\Avidemux.exe" --load "%%~dx%%~px%%~nx.mp4" --run "x264_convert.py" --save "%%~dx%%~px%%~nx_x264.mp4" --quit
) >> x264_ScriptMux.bat
for /R %%x in (*.mpg) do (echo."C:\Program Files\Avidemux 2.6 - 64 bits\Avidemux.exe" --load "%%~dx%%~px%%~nx.mpg" --run "x264_convert.py" --save "%%~dx%%~px%%~nx_x264.mp4" --quit
) >> x264_ScriptMux.bat
for /R %%x in (*.avi) do (
echo."C:\Program Files\Avidemux 2.6 - 64 bits\Avidemux.exe" --load "%%~dx%%~px%%~nx.avi" --run "x264_convert.py" --save "%%~dx%%~px%%~nx_x264.mp4" --quit
) >> x264_ScriptMux.bat
exit

Y el otro archivo que le indica qué hacer a Avidemux, al que llamaremos x264_convert.py (para que el anterior funcione), con este contenido pegándolo en el bloc de notas:
adm = Avidemux();
adm.videoCodec("x264")
adm.audioCodec(0, "LavAAC", "bitrate=128")
adm.audioSetResample(0, 44100)
adm.setContainer("MP4")
Estos comandos establecen el códec de vídeo a x264, con los parámetros por defecto, el códec de sonido (con un remuestreo del sonido a 44 Khz ya que AAC sólo acepta más de 22 Khz) y el contenedor del archivo.
Normalmente estos vídeos en HD se ven con mucho grano, sobre todo cuando hay poca luz; el códec x264 suaviza este ruído e imperfecciones artificiales causadas por la sensibilidad del sensor CMOS de las cámaras, sin perder calidad, por lo que es el estándar más recomendado de grabación.

Opciones más habituales de codificación:

Si preferimos utilizar otros códecs/contenedor, sólo tenemos que modificar las líneas correspondientes entre las múltiples combinaciones (verifica primero que son compatibles entre sí; algunos contenedores no aceptan algunos códecs; el contenedor más moderno, y utilizado por su versatilidad es el Matroska, pero no todos los reproductores lo aceptan).

Codec Video:
  • Para mantener el original, sin recomprimir: adm.videoCodec("Copy")
  • Mpeg 4 ASP (DivX): adm.videoCodec("xvid4")
  • Mpeg2 (ff): adm.videoCodec("ffMpeg2")
  • HEVC (x265): adm.videoCodec("x265")
  • Mjpeg Encoder: adm.videoCodec("Mjpeg")
  • FLV1 (flash): adm.videoCodec("ffFlv1")
Como hemos comentado, el que actualmente es más utilizado es el x264 por compatibilidad y calidad, aunque requiere equipos con buen procesador y en HD es posible que en algunos reproductores vaya a saltos; en ese caso podemos probar con el formato "Xvid4" y un filtro de ruído como el "Mplayer Denoise 3D HQ" activado en el Avidemux, para asegurarnos de reducir el tamaño (comprobar luego que no se pierde calidad).

Codec Audio:
  • Para mantener el original, sin recomprimir: adm.audioCodec("Copy")
  • AAC Faac: adm.audioCodec(0, "Faac", "bitrate=128")
  • AAC Lav: adm.audioCodec(0, "LavAAC", "bitrate=128")
  • Mp3 Lame: adm.audioCodec(0, "Lame", "bitrate=128")
  • AC3 Lav: adm.audioCodec(0, "LavAC3","bitrate=128")
  • mp2 (Twolame): adm.audioCodec(0, "Twolame","bitrate=128")
  • PCM: adm.audioCodec(0, "PCM")
El "bitrate" lo podemos cambiar dependiendo de la fuente de sonido; si es voz puede bastar con 80 o 96, pero si es música y queremos conservar la máxima calidad, podemos indicar entre los siguientes: 128, 160, 192, 224,  384, 448. PCM no tiene esa posibilidad. Se recomienda el códec LavAAC porque a igual bitrate, la calidad es superior a Mp3 (lame).

Contenedores:
  • Avi muxer: adm.setContainer("AVI")
  • MKV muxer: adm.setContainer("MKV")
  • Mp4 muxer: adm.setContainer("MP4")
  • Mp4v2 muxer: adm.setContainer("MP4V2")
  • Mpeg TS muxer (ff): adm.setContainer("ffTS")
  • FLV muxer: adm.setContainer("FLV")
El futuro lo marca el MKV muxer, un estándar en el mundo profesional, pero tanto el Mp4 como el Mp4v2 son mucho más compatibles con dispositivos reproductores (no recomiendo AVI).

Ésto en cuanto a formato de archivo, pero si queremos aprovechar toda la potencia de Avidemux, también podemos experimentar con los filtros que trae; como por ejemplo añadir o quitar un logo:




Y para averiguar qué comando corresponde a cada cosa, sólo tenemos que guardar el proyecto en la opción File -> Project script -> Save as project, 



y nos creará un archivo con todas las opciones que le hemos indicado similar a la siguiente imagen, y tendremos que identificar las líneas que nos interesan y agregar al archivo anterior, "x264_convert.py", y aplicará esas opciones a todos los vídeos que procese (importante eliminar las líneas "addsegment", "markerA" y "markerB" o nos cortará todos los vídeos a ese tamaño).

Ejemplo de proyecto salvado con x264, LavAAC y MP4 de contenedor.

Para cualquier duda, comenta abajo, y ¡feliz recodificación!

Referencias
X264: H264 en código abierto
Codec AAC: Mejor que mp3
Tutorial scripting en Avidemux (obsoleto)

3 comentarios:

  1. buscando como, recien leo esto.
    excelente el trabajo q hiciste. mucha inqietud, dedicacion, tiempo.
    felicitaciones.
    gracias x tu trabajo, x ayudarnos a entender.
    javo/2020
    //

    ResponderEliminar
  2. olvide incluir en la anterior, agradecerte x el respeto-opcion, de comentario 'anonimo'
    el poder elegir no dejar datos personales, logueos/registros/miertc. con el consecuente tiempo q esto conlleva y la eleccion (libre) de identificarse o no.
    tu respeto al no filtrado de 'qeres comentar? bueno, deja tus datos o no tenes opcion para comentar'
    mas q agradecido.
    un abrazo

    javo/2020
    //

    ResponderEliminar
    Respuestas
    1. Gracias a tí por dejar tu agradecimiento. Saludos, espero que te sirviera. Puede que los scripts hayan dejado de ser totalmente compatibles por cambios en el programa, pero como ves es bastante sencillo crearlos; yo lo uso muchísimo para comprimir mejor los vídeos de mi móvil... el espacio es oro!

      Eliminar

Puede dejar su comentario, que tratará de ser moderado en los días siguientes. En caso de ser algo importante/urgente, por favor utilicen el formulario de arriba a la derecha para contactar.