Codificando vídeos para raspberry pi 3
La raspberry pi 3 tiene ciertas limitaciones a la hora de reproducir vídeos. Aunque es capaz de manejar bien archivos en resolución Full HD (1920x1080 pixels), el códec es determinante a la hora de la fluidez en la reproducción, porque tiene aceleración por hardware para el códec h264, pero no para h265 o superiores.
Por eso, a veces es necesario convertir los vídeos que no se pueden reproducir directamente y la forma más es utilizar ffmpeg.
El siguiente comando convierte el primer canal de vídeo y el primero de audio a h264 y aac, respectivamente, para alojarlos en un contenedor mp4, que está ampliamente soportado en dispositivos de reproducción, computadoras, teléfonos inteligentes y, por supuesto, la raspberry pi 3.
ffmpeg -i input-video -map 0:v:0 -crf 23 -preset medium \
-c:v libx264 -vf scale=1280:-2,flags=lanczos -format yuv420p \
-map 0:a:0 -c:a aac -b:a 196k output-video.mp4
Hay que tener en cuenta que no siempre será el primer canal de audio el que nos interese, en mi caso el audio en idioma español, ya que la fuente puede tener varias pistas con diferentes idiomas. Para estar seguros lo más sencillo es utilizar el comando ffprobe con el archivo fuente, lo que nos mostrará un listado de todos los flujos y canales, teniendo en cuenta que cuando se especifica -map 0:a:0, el segundo cero se refiere al primer canal de audio, es decir, se empieza a contar desde cero, aunque ffprobe lo indique como canal 1.
Analicemos los parámetros utilizados:
- c:v en este caso siempre va a ser libx264, que es el que está soportado por hardware en la raspberry pi3.
- crf controla la calidad de la imagen. Varía entre 0 y 50 aunque los límites más o menos útiles son entre 18 y 32, siendo la calidad mejor cuanto más bajo es el valor de crf. A mayor calidad, tamaño final más grande, por lo que hay que tenerlo en cuenta en caso de que tengamos restricciones por tamaño.
- preset controla la velocidad de procesado y afecta también al tamaño. Por defecto es
- map permite seleccionar los flujos de vídeo y de audio que se van a utilizar en la compresión
- vf permite especificar filtros como, por ejemplo, de escalado. En este caso, se escala el vídeo a resolución HD manteniendo las proporciones del vídeo original. Además, se aplica un filtro de escalado que utiliza el algoritmo lanczos
- format permite especificar los bits del color, o algo así, siendo el más sencillo y compatible el formato yuv420p, que tiene 8 bit.
- c:a determina el codec que se va a utilizar para comprimir el audio y, aunque mp3 es muy habitual, prefiero utilizar aac, que da mejor calidad con la misma tasa de bits.
- b:a especifica la tasa de bits para el flujo de audio.
Por supuesto, la conversión no la hago en las raspberry, sino en mi portátil, y no suele tardar demasiado ni los tamaños son excesivos, en función de la duración del vídeo, claro.
Un saludo.