Bien, el proyecto va avanzando. Ya tenemos configuradas las carpetas y podemos actualizar la de la Raspberry a golpe de instrucción, ahora toca reproducir en loop y a pantalla completa todos los archivos que contenga.
Vamos a necesitar reproducir vídeos e imágenes fijas y los programas que usaremos serán OMXPlayer y FIM. En nuestro proyecto en concreto restringiremos las imágenes a archivos jpg, pero FIM es capaz de visualizar múltiples formatos de archivo, así que modificar el código para poder reproducir otros tipos es muy fácil.
Vídeos
Vamos a usar el reproductor OMXPlayer que funciona desde la línea de comandos.
Para reproducir los vídeos en bucle haremos lo siguiente: Usaremos un while para que mientras se cumpla la condición se ejecute de forma indefinida, y un for – in para recorrer los ficheros del directorio.
Para nuestros propósitos, vamos a crear una variable $a y le vamos a dar un valor, en este caso «si» o el que más os guste. ¿Por qué así y no un while true? Pues porque más adelante podremos cambiar el valor a esta variable, lo que provocará que salgamos del bucle y una vez fuera comparar su valor y hacer una cosa u otra, pero eso vendrá más adelante, así probamos que este sistema y su sintaxis nos funcionan.
Así que para probar vamos a crear un fichero, que podemos llamar «loop.sh» y lo dejamos de momento así:
Un pequeño paréntesis de aviso: Si usáis un editor en Windows para luego trasladar los scripts a la Raspberry (o a cualquier otro chisme bajo Linux), configurad y/o comprobad que los finales de línea correspondan al tipo Unix o provocarán los más variados y divertidos errores:
Probamos que nuestro fichero funciona con la siguiente instrucción:
bash loop.sh
Los vídeos que tengamos en la carpeta «Videos» de la Raspberry deberían de reproducirse uno tras otro y vuelta a empezar.
Las opciones usadas son las siguientes:
-b: Fondo negro
–aspect-mode letterbox: El vídeo ocupa toda la pantalla sin perder su relación de aspecto, dejando franjas negras horizontales o verticales si es preciso. En realidad, si no especificamos un tamaño de ventana esta es la opción por defecto, por lo que en teoría podríamos obviarla.
Aquí el loop estará ejecutándose hasta el fin de los tiempos, así que tocará salir a las bravas con ctrl-c o matando el proceso desde una sesión abierta desde otro equipo si no se pone un contador o algo que cambie el valor de $a tras un determinado número de iteraciones.
Y bueno, esto ya es de lógica, pero se recomienda usar vídeos de muy corta duración porque lo que interesa es ver si el código funciona. En Internet podemos encontrar páginas con samples que se pueden descargar libremente. No obstante, si alguien quiere probar con «Guerra y Paz», «Novecento» y «Cleopatra», por ejemplo, pues adelante con los faroles, por supuesto. En este caso se recomienda realizar varias iteraciones sin despegar la vista de la pantalla para asegurarnos de que el código funciona bien, pero bien, bien, requetebien.
Pantalla verde
Puede suceder que al reproducir algún vídeo la pantalla se ponga verde y no se vea absolutamente nada. Y lo sé por propia experiencia: en mi caso, una Raspberry estuvo funcionando en pruebas un tiempo con distintos archivos, pero un buen día al cargar un vídeo de más peso que los habituales, al reproducirlo por segunda vez aquello se ponía en modo pellejo de rana y se acabó.
La solución pasa por modificar, como root, el fichero config.txt que se encuentra en el directorio boot de la Raspberry, añadiendo al final del mismo la siguiente línea:
gpu_mem=128
Y con eso, se acabaron las pantallas verdes en OMXPlayer
Imágenes jpg
También es posible que deseemos proyectar imágenes fijas, de hecho en nuestro caso no es que lo deseemos, es que lo necesitamos. Para eso vamos a usar el programa «FIM».
FIM, tal como dicen en su web https://www.nongnu.org/fbi-improved/ es un fork de Fbi y lo mejora en muchos aspectos. En un principio intenté usar Fbi para el proyecto, pero a la hora de hacerlo funcionar desde un sh ejecutado en crontab daba problemas (ioctl vt_activate operation not permitted). Supongo que todo era cosa de permisos porque haciendo que lo ejecutara el root (sudo fbi) funcionaba, pero no me gustaba esa idea y pelearme con los permisos tampoco. Probé FIM y para mi sorpresa, aunque está basado en Fbi, funcionó a la primera.
y comenzamos instalándolo:
sudo apg-get install fim
Y vamos a probarlo. Para ello, de la ingente cantidad de opciones y configuraciones que tiene, no nos vamos a complicar mucho y sólo vamos a pedirle que nos muestre la imagen a pantalla completa, que lo haga sin mostrarnos ninguna información adicional y que mantenga la imagen durante unos segundos, que para probar vamos a poner 5. Comenzamos con la instrucción para mostrar un fichero de nombre «prueba.jpg»
fim prueba.jpg -a -c '{sleep 5;quit;};'
Las opciones usadas:
-
- -a: le dice a FIM que queremos que la imagen se muestre a pantalla completa sin perder la relación de aspecto.
- -c: le indica que a continuación viene unos comandos que ha de ejecutar, en este caso:
- -sleep 5: tiempo en segundos que permanecerá la imagen en pantalla
- -quit: salir de FIM
El resultado es el siguiente:

Vemos que todavía hay que afinar algo porque esa información que sale en el pie de pantalla está muy bien pero en nuestro caso nos molesta. Para eliminarla, como se muestra por defecto, hay que crear un pequeño fichero de configuración que se llamará .fimrc y que colocaremos en el home. El contenido del fichero será el siguiente:
_display_busy=0; _display_status=0;
Volvemos a probar y vemos el resultado:

Ya lo tenemos listo, ahora sólo falta probar la reproducción uno por uno de todos los ficheros jpg que tengamos en una carpeta, sustituyendo en nombre del fichero por una variable. Para ello vaciamos el directorio Videos, metemos dos o tres jpgs de prueba y adaptamos el código usado antes, esta vez sin el while que ya sabemos que funciona. Llamamos al script como queramos, en este caso «imagen.sh» y lo probamos.
Si todo ha ido bien deberían mostrarse los jpgs de la carpeta uno por uno, manteniéndose cada uno 5 segundos en pantalla.
Llegados a este punto ya tenemos los vídeos que se reproducen en bucle y las imágenes también. Toca ahora ir juntando todo e ir añadiendo funcionalidades, un cierto control sobre algo que queremos que sea lo más automático posible.
Muchas gracias por tomarte el tiempo de escribir este increible tutorial, quisiera comentarte que en el punto del FIM colocando el comando -a, la imagen se muestra en ventana y no en pantalla completa, sabes como puedo solucionarlo?
saludos
Hola Ismael
Gracias a ti por el comentario 🙂
La opción -a lo que hace es un autozoom. Imagino que estás lanzando FIM desde una ventana de terminal dentro del entorno gráfico, esto hace que salte otra ventana con la imagen a tamaño completo, pero de esa ventana.
He estado investigando un poquillo y creo que tengo la solución. En mi caso, con el asunto de las pantallas no tengo ese problema porque no cargo el entorno gráfico, así que la imagen se muestra siempre a toda pantalla, no hay ventana que valga.
Mira, en esta página tienes un montón de comandos y configuraciones:
https://www.nongnu.org/fbi-improved/
Si te fijas, casi al final encontramos esta línea:
bind «F11» «if(_device_string==’sdl’ && !_fullscreen){_old_sw=_screen_width;_old_sh=_screen_height;display ’reinit’ ’mW0:0’;_fullscreen=1;}else if(_device_string==’sdl’ && _old_sw*_old_sh*_fullscreen){display ’reinit’ ’rwm’._old_sw.’:’._old_sh;_fullscreen=0;}» «Toggles full screen. Will show mouse cursor in full screen.»;
Vamos, que lo que nos dice es que han programado en su fichero de configuración que al pulsar F11 se active el modo de pantalla completa, así que con F11 lo podemos hacer de forma manual. Pues bien, si lo queremos hacer de forma automática, si copiamos lo esencial y lo metemos en nuestro fichero propio de configuración, el .fimrc, cuando lo lancemos se nos mostrarán las imágenes a pantalla completa. Sólo hay que quitar el principio, el comentario del final y sustituir las comillas simples por dobles:
if(_device_string==»sdl» && !_fullscreen){_old_sw=_screen_width;_old_sh=_screen_height;display «reinit» «mW0:0″;_fullscreen=1;}else if(_device_string==»sdl» && _old_sw*_old_sh*_fullscreen){display «reinit» «rwm»._old_sw.»:»._old_sh;_fullscreen=0;};
Lo acabo de probar en un Ubuntu… ¡y parece que resulta! 🙂
Espero que te haya servido de ayuda.
Un cordial saludo.