cheap 4-channel videoplayer

for the dance piece ich(a) by zufit simon i constructed a system with four raspberry pi mini-computers and buttons to trigger playback of four video streams. as the videos didn't need to run in exact frame-by-frame sync, this was a very cheap way to get four channel high-quality video playback. total cost was about (rpi 28*4)+(sdcard 6*4)+(5v power 1*7) ≈ 141 euro. i chose the model A of the raspberry pi to keep the cost and power consumption down. the four computers share a 5v power supply of 2 amps and are powered over the gpio pins. video cables run 50 meters down to the stage and in to separate flat screen monitors. the monitors are built in to boxes that can be piled up or rolled around independently.

the videos are stored on the 4GB sd cards that also holds the linux operating system. i converted the videos from dvd to mp4 using ffmpeg with the following settings...

ffmpeg -i concat:"/Volumes/MONITOR01_may2012_DVD/VIDEO_TS/VTS_01_1.VOB|/Volumes/MONITOR01_may2012_DVD/VIDEO_TS/VTS_01_2.VOB" -an -vcodec libx264 -profile:v high -preset fast -crf 18 -b-pyramid none -f mp4 MONITOR01_may2012.mp4

that'll take two chapters and convert to a single mp4 and skip the sound track (-an flag).

the python program running on each computer is here below. it plays a video to the end and waits for a button trigger. if a button is pressed before the video is finished, it'll stop and jump to the next video - all in a cyclic fashion.

#f0videoplayer.py
#for a raspberry pi running raspbian
#this script will cycle through videos in sequence when a GPIO pin is grounded

#pinSwi (pulled up internally) - gnd this pin to switch to the next video
#pinOff (pulled up internally) - gnd this to shut down the system

#--settings
videos= ['/home/pi/ICHA1.mp4', '/home/pi/MONITOR01_may2012.mp4', '/home/pi/BLACK.mp4', '/home/pi/FLESH.mp4', '/home/pi/TESTBILDER.mp4']
delays= [0, 0, 0, 0, 0] #extra start delay time in seconds - one value for each video
pinSwi= 23
pinOff= 24

#--
import pexpect
from time import sleep
import RPi.GPIO as GPIO
import os
GPIO.setmode(GPIO.BCM)
GPIO.setup(pinSwi, GPIO.IN, pull_up_down= GPIO.PUD_UP)
GPIO.setup(pinOff, GPIO.IN, pull_up_down= GPIO.PUD_UP)

def main():
        os.system("clear && tput civis")        #clear and hide cursor
        index= 0        #keeps track of which video to play
        while True:
                sleep(delays[index])
                omx= pexpect.spawn('/usr/bin/omxplayer -rp '+videos[index])
                omx.expect('Video')     #play
                while(GPIO.input(pinSwi)==True):
                        sleep(0.1)
                        if GPIO.input(pinOff)==False:
                                omx.send('q')   #quit
                                os.system("tput cnorm && sudo halt")
                                exit()
                omx.send('q')   #quit
                sleep(0.5)              #safety
                while(GPIO.input(pinSwi)==False):
                        sleep(0.01)
                index= (index+1)%len(videos)

if __name__ == "__main__":
        main()

//----------------------------
//--instructions for installing (you'll need a model B to prepare a sd-card, but then move it over to the model A raspberry)

//--prepare the rpi
* use Pi Filler to transfer 2013-05-25-wheezy-raspbian.img to the sdcard
* put the sdcard in rpi model B
* select 'Expand Filesystem' in and enable SSH under advanced in config menu
* select 'Finish' and reboot
* log in with pi/raspberry
* sudo apt-get update
* sudo apt-get upgrade
* sudo apt-get install python-pexpect avahi-daemon

//--copy files from osx
* open a terminal window on main computer
* cd to folder with videos
* edit the file f0videoplayer.py and select which videos to use
* optionally add delaytimes if some videos should start later
* scp f0videoplayer.py MONITOR01_may2012.mp4 ICHA1.mp4 BLACK.mp4 FLESH.mp4 TESTBILDER.mp4 pi@raspberrypi.local:/home/pi/

//--back to model B
* sudo pico /etc/rc.local
* add the following before the exit line: (sleep 1; python /home/pi/f0videoplayer.py) & # autostart video player
* press ctrl+o to save and ctrl+x to exit
* sudo halt

//--start model A
* take out the sdcard from model B and put it in model A
* connect hdmi or composite video, gpio pins and apply power - the first video should start
* ground pin 23 to cycle through the videos
* ground pin 24 to turn off the computer

//----------------------------
//--useful commands (connect keyboard to rpi model A, type pi/raspberry to log in)
sudo pkill omxplayer.bin     #might need to write this without the terminal being visible

if you get "WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!"
ssh-keygen -R raspberrypi.local     #useful for resetting ssh/scp after changing sd cards

it's not pretty but it's working. some day i'll build it in to a real rackmount box.

//--references:
http://www.raspberrypi-spy.co.uk/2013/06/playing-videos-on-the-raspberry-pi-command-line
http://www.raspberrypi.org/phpBB3/viewtopic.php?f=38&t=47520