Zapytała się mnie wczoraj koleżanka, czy znam jakieś rozwiązanie, co mogłoby usprawnić zarządzanie materiałami wyświetlanymi na telewizorach w salonie. Nic skomplikowanego, chodzi tylko o to by można było zdalnie zarządzać wyświetlaną treścią (odtwarzanie, zmiana filmu), bo obecnie pracownik włącza telewizor, i ręcznie uruchamia z podłączonego napędu flash materiał. Działa to relatywnie dobrze, ale gdy trzeba zmienić materiał, to zaczyna się „ręczna robota”.

Wyświetlanie materiałów promocyjnych na telewizorze

Rozwiązań, dzięki którym można wyświetlać materiał promocyjny na telewizorach (monitorach) w salonach/oddziałach jest sporo, wszystko zależy od dodatkowych wymagań, możliwości technicznych, i… finansowych.

Kilka lat temu, gdy jeszcze pracowałem na etacie w jednym z największych (jeśli nie największym) sklepów internetowych w Polsce, w salonach też mieliśmy telewizory, które wyświetlały wybrany przez nas materiał. Obraz był wyświetlany prosto z dedykowanego do tego celu komputera – mała i cicha jednostka, z odpowiednią liczbą portów DVI (tak, wtedy HDMI jeszcze nie był aż tak popularny).

Oczywiście w skrajnej sytuacji można wykorzystać do tego celu np. komputer w recepcji, na którym pracuje recepcjonistka – wystarczy telewizor podłączyć do komputera i ustawić tryb pracy na „rozszerz te ekrany”. Dzięki temu mamy jakby dwie przestrzenie robocze – na podstawowym monitorze normalnie można pracować, a to co chcemy wyświetlić na drugim monitorze (telewizorze) wystarczy przenieść „w prawo”, na drugi ekran.

Jest to rozwiązanie teoretycznie najprostsze, ale nie jestem jego zwolennikiem – nie dość, że tak naprawdę nigdy nie wiadomo co nam wyskoczy, i tym samym pojawi się na drugim ekranie, to jeszcze obraz jest zależny od działania komputera, na którym ktoś wykonuje normalną pracę. Można, ale…

Stąd wariant z dodatkowym, niezależnym urządzeniem jest jednak wariantem, na który ja bym się zdecydował (gdybym miał kilka salonów… w których chciałbym coś wyświetlać na ekranach ;-)). I o ile wariant z dodatkowym komputerem wydaje się najprostszy, to na potrzeby tego wpisu jest to rozwiązanie… za proste. No bo co to za filozofia uruchomić program do odtwarzania filmów na komputerze? ;-)

Raspberry Pi i OMXPlayer

I tu wkracza Raspberry Pi, czyli mikrokomputer za 35 $, który w aktualnej odsłonie (Raspberry Pi 3) ma wystarczająca moc by sprostać temu zadaniu. Mamy tu pełnoprawny system operacyjny (np. Raspbian bazujący na Debianie), dodatkowo WiFi, czyli internet bezprzewodowy, a całość może być zasilana z ładowarki od telefonu, czy też portu USB w telewizorze. Wręcz idealnie.

Tu również mamy przynajmniej kilka możliwych rozwiązań do wdrożenia, ale na potrzeby demonstracji postanowiłem skorzystać z programu OMXPlayer, którym można sterować bezpośrednio z konsoli (skrypty!):

OMXPlayer is a commandline OMX player for the Raspberry Pi. It was developed as a testbed for the XBMC Raspberry PI implementation and is quite handy to use standalone.

Podstawowe polecenie by odtworzyć film wygląda tak:

sudo omxplayer /home/patryk/film.mp4

Ale skoro ma to być film odtwarzany bez przerwy, to dodamy pętle (–loop), wymusimy wyjście obrazu na port HDMI (-o hdmi), wyłączymy – prewencyjnie – sterowanie z klawiatury (–no-keys), oraz wyczernimy ekran nad i pod filmem (-b), i na deser dołożymy jeszcze odświeżanie parametrów filmu (-r):

sudo omxplayer /home/patryk/film.mp4 -b -r --loop -o hdmi --no-keys

Można też do polecenia dodać kilka innych parametrów, związanych z napisami (plik z napisami, rozmiar znaków, wyrównanie i liczba linii):

sudo omxplayer /home/patryk/film.mp4 -b -r --loop -o hdmi --no-keys --subtitles /home/patryk/film.srt --font-size 50 --align center --lines 3

Ale by móc w konsoli wykonywać w tym czasie również inne operacje możemy całość uruchomić „w tle”, w ramach wirtualnej konsoli, korzystając z programu Screen:

screen -dmS omx sudo omxplayer /home/patryk/film.mp4 -b -r --loop -o hdmi --no-keys

W jakieś wyszukane zatrzymywanie odtwarzania nie będziemy się bawić, a potraktujemy całość z grubej rury:

sudo killall -s 9 omxplayer

I jeśli chodzi o podstawy, to właściwie tyle…

Skrypt zarządzający

I choć przedstawione rozwiązanie będzie działać, to od razu pomyślałem o tym, by ubrać je w jakiś skrypt, który wspomógłby zarządzanie odtwarzaniem, a przy okazji od razu wstawiłbym tam fragment odpowiedzialny za pobieranie nowej wersji pliku z internetu (ręcznie, lub za pomocą CRONa).

I tak powstał prosty skrypt, który automatyzuje wyświetlanie filmów telewizorze z wykorzystaniem Raspberry Pi (nie mylić z miniDLNA, które wprawdzie również służy do wyświetlania m.in. filmów na telewizorze, ale trochę w innym kontekście ;-)):

#!/bin/bash
### BEGIN INIT INFO
# Provides: omxplayer-demo
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: Enable service provided by daemon.
### END INIT INFO

# Nazwa skryptu:
NAME=omxplayer-demo
SCRIPTNAME=/etc/init.d/$NAME

# Dostępne parametry:
COMMANDS="{start|stop|restart|update|enable|disable|install|uninstall}"

# Instalacja
f_install()
{
	sudo cp -r $0 /etc/init.d/$NAME
	sudo insserv $NAME
	sudo ln -s /etc/init.d/$NAME /usr/local/bin/$NAME
	sudo /etc/init.d/$NAME start
	exit 0
}

# Dezinstalacja
f_uninstall()
{
	sudo /etc/init.d/$NAME stop
	sudo update-rc.d $NAME remove
	sudo rm /etc/init.d/$NAME
	sudo rm /bin/$NAME
	exit 0
}

# Start
f_start()
{ 
	# ON HDMI (opcjonalnie, odkomentuj):
	#sudo tvservice --explicit="CEA 16"
	# ON screen/konsola (opcjonalnie, odkomentuj):
	#sudo vcgencmd display_power 1

	# Odtwarzanie:
	screen -dmS omx sudo omxplayer /home/patryk/film.mp4 -b -r --loop -o hdmi --no-keys
	# Wersja z dodatkowymi parametrami do obsługi napisów (alternatywa):
	#sudo omxplayer /home/patryk/film.mp4 -b -r --loop -o hdmi --no-keys --subtitles /home/patryk/film.srt --font-size 50 --align center --lines 3
}

# Stop
f_stop()
{
	# OFF:
	sudo killall -s 9 omxplayer

	# OFF HDMI (opcjonalnie, odkomentuj):
	#sudo tvservice --off
	# OFF screen/konsola (opcjonalnie, odkomentuj):
	#sudo vcgencmd display_power 0
}


# Aktywacja automatycznego uruchamiania z systemem 
f_enable()
{ 
	sudo systemctl enable $NAME
}

# Dezaktywacja automatycznego uruchamiania z systemem 
f_disable()
{
	sudo systemctl disable $NAME
} 

# Pobieranie pliku z serwera
f_download()
{
	sudo wget -O /home/patryk/film.mp4 "https://adres.serwera/film.mp4"
}

case "$1" in
 start)
 f_start
 ;;
 stop)
 f_stop
 ;;
 restart)
 f_stop
 f_start
 ;;
 update)
 f_download
 f_stop
 f_start
 ;;
 enable)
 f_enable
 ;;
 disable)
 f_disable
 ;;
 install)
 f_install
 ;;
 uninstall)
 f_uninstall
 ;;
 *)
 echo "Use: "$SCRIPTNAME $COMMANDS
 exit
 ;;
esac

exit 0

Na początek instalujemy skrypt za pomocą polecenia:

sudo ./omxplayer-demo install

Co spowoduje skopiowanie skryptu do katalogu „/etc/init.d”, dodanie linku symbolicznego w „/usr/local/bin” dla wygodniejszej dalszej obsługi, oraz ustawienie startu skryptu wraz z systemem (w tle). Później, zamiast „install” możecie dać „uninstall” by odinstalować skrypt.

Pamiętajcie tylko, by na początku nadać utworzonemu skryptowi atrybut wykonywalności:

sudo chmod +x omxplayer-demo

W skrypcie ważne są 2 lokalizacje – z filmem do odtwarzania:

/home/patryk/film.mp4

Oraz adres serwera by pobierać nowe wersje filmu (możecie pominąć, jeśli nie planujecie zdalnej aktualizacji):

https://adres.serwera/film.mp4

Więc tu musicie zmienić ścieżki wedle własnych potrzeb.

Dalsza obsługa jest banalna – skrypt uruchomi odtwarzanie filmu po każdym uruchomieniu Raspberry Pi. Możecie tym zarządzać za pomocą poleceń:

sudo omxplayer enable
sudo omxplayer disable

W każdej chwili można też ręcznie zatrzymać lub rozpocząć odtwarzanie:

sudo omxplayer start
sudo omxplayer stop
sudo omxplayer restart

Ostatnim poleceniem jest aktualizacja filmu do odtwarzania:

sudo omxplayer update

W tym momencie skrypt połączy się ze wskazanym adresem i pobierze znajdujący się tam film, który zastąpi dotychczas odtwarzany.

Możecie też to zautomatyzować, np. za pomocą CRONa ustawiając automatyczne pobieranie nowej wersji filmu np. codziennie, o 3 w nocy:

0 3 * * * root /usr/local/bin/omxplayer-demo update >/dev/null 2>&1
W skrypcie znajdziecie jeszcze kilka komend (w funkcjach odpowiedzialnych za start i stop odtwarzania)  przydatnych w sytuacji, gdyby z wyświetlanym obrazem działy się jakieś cuda. Polecenia te domyślnie są zakomentowane (znak # przed), czyli nieaktywne. Wybór czy z nich korzystać czy nie zostawiam Wam, ja zazwyczaj korzystam.

Oczywiście jest to dość prosty przykład na zastosowanie Raspberry Pi jako urządzenia zarządzającego automatycznym odtwarzaniem materiałów wideo na podłączonych ekranach (monitory lub telewizory), i wersja produkcyjna jest trochę bardziej rozbudowana, zgodnie z dodatkowymi wymaganiami (dodatkowe mechanizmy autoryzujące, powiadomienia na e-mail, sterowanie z połączonego pilota Bluetooth…).

(!) Zgłoś błąd na stronie | Lub postaw nam kawę :-)
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej
Patryk