Para ver vídeo, reproducir música, ver imágenes, utilizo Kodi. Pero al contrario de lo que te puedas imaginar no lo tengo corriendo en la Raspberry Pi, sino que está en un pequeño dispositivo gobernado por Android, un NEO U1. Sin embargo, todos los archivos multimedia se encuentran en un NAS. Hace poco, se liberó una nueva versión de Kodi, en concreto la versión 17.4. El problema me ha surgido con que he dejado de ver correctamente los vídeos que venía codificados con H.264/MPEG-4. Veía los vídeos a saltos. Lo cual es realmente incómodo, como te puedes hacer una idea. Esto no es la primera vez que me sucede, que al cambiar de una versión de Kodi a otra dejo de ver bien los archivos multimedia. Así que me he decidido a dar una solución, y esta pasa por convertir archivos de vídeo de forma masiva a MPEG-2.
El tema, es que la conversión la quería hacer directamente en el NAS, que por supuesto corre Linux, para no tener que estar con mi ordenador en marcha. A continuación te indico los pasos que he seguido para conseguirlo.
Convertir archivos de vídeo de forma masiva
Antes de nada, indicar que no lo quiero dar tanta importancia al script utilizado para convertir archivos de vídeo, como al proceso. Se trata de un primer paso, al que le quiero añadir nuevas características, algunas de las cuales adelantaré al final del artículo.
Acceso mediante SSH
Evidentemente para acceder al NAS donde están todos los archivos multimedia, el procedimiento que utilizo de forma habitual es acceder mediante SSH. Puedes leer mas haciendo clic en el siguiente enlace sobre el acceso mediante SSH sin contraseña.
Un script para convertir archivos de vídeo
El script que estoy utilizando es el siguiente,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/usr/bin/env bash # trap the Control-C signal and break out of the loop trap break INT for i in *.mkv; do filename=$(basename "$i") extension="${filename##*.}" filename="${filename%.*}" echo "=========================" echo "Converting: \"$i\"" ffmpeg -y -i "$i" -b:v 5M -c:v mpeg2video -b:a 128k -c:a libmp3lame "$filename.avi" echo "Removing: \"$i\"" rm "$i" echo "" done |
Lo que hace es simplemente convertir cualquier archivo con extensión .mkv
a .avi
utilizando para ello el códec mpeg2
para vídeo, y mp3
para audio. Además he tenido en cuenta las siguientes consideraciones,
- La opción
-b:v 5M
establece el bitrate del vídeo, es decir, la tasa de flujo de datos a 5Mbps, que con las pruebas que he hecho, he visto que los resultados son mas que aceptables. - La opción
-b:a 128k
establece el bitrate del audio a 128kbps. Que para mi es mas que suficiente, pero que aquellos que tengan un oído mas sensible, pueden ponerlo a 1256kbps que es por defecto lo que venía en los CD. - El parámetro
-c:v mpeg2video
define el codec de vídeo que emplearemos, que en mi caso será MPEG2. - El parámetro
-c:a libmp3lame
define el codec de audio que utilizaremos. Como he comentado anteriormente, en mi caso pasaré el audio a MP3.
Por último, indicar que la primera línea trap break INT
permite que nuestro script responda a una seña de Ctrl+C
.
Creamos el script y le damos permisos
Este script tiene que estar en el escritorio donde vamos a convertir archivos de vídeo. Y por supuesto debemos darle permisos de ejecución. Podemos crear el script y darle permisos de ejecución, ejecutando la siguiente orden,
cat > convert.sh <<EOF #!/usr/bin/env bash # trap the Control-C signal and break out of the loop trap break INT for i in *.mkv; do filename=$(basename "$i") extension="${filename##*.}" filename="${filename%.*}" echo "=========================" echo "Converting: \"$i\"" ffmpeg -y -i "$i" -b:v 5M -c:v mpeg2video -b:a 128k -c:a libmp3lame "$filename.avi" echo "Removing: \"$i\"" rm "$i" echo "" done EOF chmod +x convert.sh
Lanzando el script
El script lo has creado en el directorio donde están todos los archivos multimedia que queremos convertir. Y por supuesto estamos allí porque hemos entrado vía ssh
. Ahora vamos a lanzar el script, pero de forma que cuando salgamos de la conexión este se quede en funcionamiento. Para ello ejecutaremos la siguiente orden,
nohup convert.sh & exit
Deteniendo el script
Puede suceder que por lo que fuera quieras detener el script, en este caso, debes entrar de nuevo al NAS (o donde tu tengas los archivos) y ejecutes la siguiente orden para determinar cual es el PID,
ps -ef | grep bash
Al hacerlo, en mi caso arroja lo siguiente,
Para detenerlo ejecutaremos lo siguiente,
kill -9 5097
Además tienes que matar la conversión actual. Para ello, tienes que hacer lo mismo, pero para ffmpeg
. Para ello, ejecuta la orden,
ps -ef | grep bash
Y procede de la misma manera que en el caso anterior.
Conclusiones
Como puedes ver se trata de algo relativamente sencillo, pero sobre todo, una solución completamente desatendida. Quiero decir que en ningún momento te tienes que preocupar de nada. Simplemente lanzas el script y dejas que el haga su marcha poco a poco.
El problema es que los parámetros que he definido, sobre todo en lo referente al bitrate de vídeo dependerán de la resolución. Suponiendo que el número de fotogramas por segundo es el mismo en todos los casos, no es lo mismo que la imagen esté a 1920×1080 que 640×480, en cuyo caso podríamos reducir sensiblemente el bitrate de vídeo consiguiendo un resultado similar. Por esta razón es conveniente en el script determinar estos parámetros y calcular el bitrate de acuerdo a la resolución de la imagen de vídeo.
Bueno…, lo cierto es que estaría bien que existiera algún medio para saber si cuantos se han convertido, o que el proceso de conversión está funcionando bien, o cual se acaba de convertir, o algo así. Además sería interesante que esto te llegara al móvil, o que te llegara a Telegram. Esta última es probablemente la mejor solución…
Tengo yo por ahí un script a medio hacer que coge un vídeo de tu ordenador, lo envía por SSH a un host, lo convierte en remoto y luego se lo trae. Está un poco abandonado, y tiene alguna que otra guarrada, pero bueno 🙂