I recently upgraded my office by moving to a great new location. As part of the move I added a ton of new space to accommodate our rapid growth and even added a “play area” for the staff so they can burn off some of the frustrations of the “daily grind” with a bit of Ping Pong and, very soon, Xbox. I also added a very nice reception area with a TV where I could run a continuous loop of some of our marketing videos.
I decided to go with a Raspberry Pi to run the movies since it’s low cost, low power and very easy to hide behind the TV. I installed Raspbian and since there’s no GUI player that I could find to queue up the movies to run in a loop, I wrote a simple bash script to run a loop using omxplayer.
1234567891011121314#!/bin/bash
# the path to the directory containing my videos
VIDEOPATH=
"/home/pi/Desktop/videos/"
SERVICE=
"omxplayer"
# the infinite loop!
while
true
;
do
for
entry
in
$VIDEOPATH/*
do
omxplayer $entry >
/dev/null
sleep
1;
done
done
This script seemed to work just fine but not long after I started it up, I ran into issues. The first problem was the gap in playback; it wasn’t seamless. While not a big issue, it looked ugly because I could see the desktop and the console window in the gap. To fix this I maximized the console and modified my script to turn off the cursor and set my text to black so all I could see was a black screen during the gap. Not the best solution, but I could live with it.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546#!/bin/bash
cleanup()
# cleanup function
{
setterm -cursor on
setterm -foreground white -
clear
return
$?
}
control_c()
# run if user hits control-c
{
echo
-en
"\n*** Exiting! ***\n"
cleanup
exit
$?
}
# trap keyboard interrupt (control-c)
trap
control_c SIGINT
# main() loop
# get rid of the cursor so we don't see it when videos are running
setterm -cursor off
setterm -foreground black
setterm -
clear
# the path to the directory containing my videos
VIDEOPATH=
"/home/pi/Desktop/videos/"
SERVICE=
"omxplayer"
# the infinite loop!
while
true
;
do
if
ps
ax |
grep
-
v
grep
|
grep
$SERVICE >
/dev/null
then
pkill omxplayer
sleep
1;
else
for
entry
in
$VIDEOPATH/*
do
clear
omxplayer $entry >
/dev/null
sleep
1;
done
fi
done
Again, this seemed to work just fine but then I ran into my second issue. This time it was the screen going to sleep. A quick Google search reveals that this is a common problem and there are lots of suggestions for fixing it. I experimented with a few options and what worked for me was to modify the Light Display Manager configuration.
1sudo
nano
/etc/lightdm/lightdm
.conf
Now look for [SeatDefault] and insert this line below:
1xserver-
command
=X -s 0 dpms
This modification absolutely resolved the sleep issue but then I ran into my third problem. For some reason the omxplayer process seems to hang. I see the desktop on the TV but no movie. When I look at my processes I see omxplayer running. There’s probably a more elegant fix, but I decided to take a brute force approach to resolving the issue. Rather than just play every video in my videos folder, this time I explicitly start each movie and use bash’s built-in control operator to fork processes. Doing this means my script keeps running even if the omxplayer process hangs. Then I sleep for the same duration as the video and issue a pkill command to nuke the omxplayer process just in case it’s hung.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546#!/bin/bash
cleanup()
# example cleanup function
{
setterm -cursor on
setterm -foreground white -
clear
return
$?
}
control_c()
# run if user hits control-c
{
echo
-en
"\n*** Exiting! ***\n"
cleanup
exit
$?
}
# trap keyboard interrupt (control-c)
trap
control_c SIGINT
# main() loop
# get rid of the cursor so we don't see it when videos are running
setterm -cursor off
setterm -foreground black
setterm -
clear
# the path to the directory containing my videos
VIDEOPATH=
"/home/pi/Desktop/videos/"
SERVICE=
"omxplayer.bin"
# the infinite loop!
while
true
;
do
if
ps
ax |
grep
-
v
grep
|
grep
$SERVICE >
/dev/null
then
pkill $SERVICE
sleep
2;
else
omxplayer ${VIDEOPATH}movie1.mp4 >
/dev/null
&
sleep
100;
pkill $SERVICE >
/dev/null
>2&1
omxplayer ${VIDEOPATH}movie2.mp4 >
/dev/null
&
sleep
67
pkill $SERVICE >
/dev/null
>2&1
fi
done
My final version of the script has been working beautifully and has proven to be a solid solution for running movies in a continuous loop on the Raspberry Pi platform.
Until next time – GEEK OUT!
~GT~