Najpierw przyjrzałem się możliwościom napisania rozszerzenia VLC LUA i jest to bardzo możliwe.
Patrzyłem na to rozszerzenie: http://addons.videolan.org/CONTENT/content-files/140699-addsimilar.lua
Który ma wszystkie potrzebne funkcje. Tak więc ciężka modyfikacja działałaby poprawnie, ale wydawało się, że jest to zbyt dużo pracy dla tego projektu.
Więc przejrzałem trochę więcej i natknąłem się na tę stronę:
http://www.cenolan.com/2013/03/looping-video-playlist-omxplayer-raspberry-pi/
Okazuje się, że ten skrypt bash można łatwo zmodyfikować, aby używał VLC lub cvlc.
Tak zrobiłem, a wynik wygląda następująco:
#!/bin/sh
# get rid of the cursor so we don't see it when videos are running
setterm -cursor off
#Time
TIME=$(date +%H)
# set here the path to the directory containing your videos
VIDEOPATH="/home/user/videos"
# you can normally leave this alone
SERVICE="cvlc"
# now for our infinite loop!
while true; do
if ps ax | grep -v grep | grep $SERVICE > /dev/null
then
sleep 0;
else
for entry in $VIDEOPATH/* # You could add .mkv to the end of this or any other file extention, to only play specific extentions
do
cvlc --play-and-exit --no-video-title -f "$entry" > /dev/null
done
fi
done
Powodem, dla którego potrzebuję tej funkcji, jest ekran wideo w kiosku, taki jak projekt, w którym filmy są przesyłane i usuwane przez cały czas.
Jedną z wad tego rozwiązania jest to, że VLC nadal musi się otwierać i zamykać po odtworzeniu każdego filmu, co robi przy użyciu tego skryptu. Tak więc komputer z uruchomionym skryptem musi mieć pusty pulpit (usunięty GUI) i czarne tło. W ten sposób między każdym klipem wideo będzie widoczny tylko około 0,5 - 1 sekundowy czarny ekran.
Skrypt jest nadal w toku, ponieważ dodam do niego kilka dodatkowych funkcji, więc jeśli uznasz go za przydatny i chcesz mój ostatni skrypt, zostaw komentarz, a ja zaktualizuję odpowiedź.
Jeśli masz lepsze rozwiązanie, a nawet rozwiązanie LUA, opublikuj je - a ja zaakceptuję odpowiedź - ale na razie działa to w moim projekcie.
Twoje zdrowie
AKTUALIZACJA na żądanie TheFrost
Oto mój ostatni skrypt, krótko opiszę go poniżej:
play.sh
#!/bin/bash
xsetroot
# Set the path to the directory containing your videos
VIDEOPATH="/home/pi/vids/"
# Time & day
set_TIME() {
TIME=$(date +%H)
DAY=$(date +%u)
}
set_TIME
# Normally leave this alone
SERVICE="omxplayer"
# Get rid of the cursor so we don't see it when videos are running
setterm -cursor off
# # #
#
# Play files with omxplayer and close the player when the video is finished
#
# # #
play_files () {
for entry in $1*
do
set_TIME
# Dont try to play dirs
if [ ! -d "$entry" ]; then
omxplayer -p -o hdmi "$entry" > /dev/null
fi
done
}
# # #
#
# Check if its time to play files
# $1 = hour now, $2 = begin hour, $3 = End hour, $4 = folder with video files
#
# # #
check_if_time_to_play() {
# Make sure the arguments are interpreted as *decimal* integers
# by evaluating them in an arithmetic context (-i) with prefix '10#',
# indicating number base 10.
# (A leading '0' would cause intepretation as *octal*.)
local -i hourNow=10#$1 startHour=10#$2 endHour=10#$3 play
local dir=$4
# Make sure the folder is not empty.
if ! find "$dir" -mindepth 1 -print -quit | grep -q .; then
return # It's empty! Don't play the non-existing clips.
fi
# Determine if current hour is between begin and end time.
play=0
if (( startHour < endHour )); then
if (( hourNow >= startHour && hourNow < endHour )); then
play=1
fi
else # startHour > endHour: overnight hours
if (( hourNow >= startHour || hourNow < endHour )); then
play=1
fi
fi
if (( play )); then
# Play the clips
play_files "$dir"
else
: # Current hour is not in range, don't play the clips.
fi
}
# Now for our infinite loop!
while true; do
if ps ax | grep -v grep | grep $SERVICE > /dev/null
then
sleep 0;
else
# # #
#
# First we check the Video folder if it has any subfolders.
# If it doesn't, play the files in the folder.
# If subfolders exists, and follow the naming standard do as the commanded.
#
# A folder named: 18-22 means start at 18 o clock, end at 22, everyday.
# A folder named: 18-22-07 means start at 18 o clock, end at 22, only during Sunday.
#
# 01 = Monday, 02 = Tuesday and so on, thats why 07 is Sunday.
#
# Files in subfolders will be playd according to the folders name.
#
# If for some reason there is an empty folder or it doesn't follow the standard above, we ignore it.
#
# # #
cd $VIDEOPATH
shopt -s nullglob
FOLDERS=(*/)
shopt -u nullglob # Turn off nullglob to make sure it doesn't interfere with anything later
# Check if there is no subfolders
if (( !${#FOLDERS[@]} )); then
play_files "$VIDEOPATH"
else
play_files "$VIDEOPATH"
for entry in "${FOLDERS[@]}";
do
TEMPVAR=${entry::-1} # Remove trailing /
IFS='-' read -a PLAYTIME <<< "$TEMPVAR" # PLAYTIME array [0] = Begin time, [1] = End time, [2] = Day
if (( ${#PLAYTIME[@]} )); then
#check if day is not set
if (( !${#PLAYTIME[2]} )); then
check_if_time_to_play $TIME "${PLAYTIME[0]}" "${PLAYTIME[1]}" "$VIDEOPATH/$entry"
else # Day is set
if [ $DAY -eq "${PLAYTIME[2]}" ]; then
check_if_time_to_play $TIME "${PLAYTIME[0]}" "${PLAYTIME[1]}" "$VIDEOPATH/$entry"
else
continue # Not today..
fi
fi
fi
done;
fi
fi
done
Tak więc, jak stwierdzono w komentarzu, przełączyłem się na OMXplayer - ale VLC również będzie działać dobrze. Po prostu zmień to w SERVICE = i w play_files()
funkcji.
Skrypt odtwarza pliki znajdujące się w nim VIDEOPATH
i jeśli ta ścieżka zawiera podfoldery, sprawdzi, czy foldery korzystają z opracowanej w tym celu konwencji nazewnictwa. Przeczytaj komentarze w skrypcie - w zasadzie możesz utworzyć folder o nazwie StartTime-EndTime (fx. Nazwa folderu 22-23
), a klipy w tym folderze będą odtwarzane tylko od 22:00 do 23:00. A jeśli chcesz odtwarzać klipy tylko określonego dnia tygodnia, utwórz folder StartTime-EndTime-DayOfWeek (Fx. Folder o nazwie 22-23-01
) klipy w tym folderze będą odtwarzane tylko od 22:00 do 23:00 w poniedziałek. Czy to skończy się 02, będzie we wtorek, 03 środa i tak dalej.
Myślę, że resztę wyjaśniono w komentarzach do skryptu, w przeciwnym razie możesz zapytać, czy masz jakieś pytania. Proszę również podzielić się wszelkimi ulepszeniami :)
Mam ten skrypt działający na ponad 50 różnych Raspberry PI w różnych lokalizacjach. Działają 24/7 i działają bardzo stabilnie. Usunąłem wszystkie widoczne GUI z PI. Wszystkie uruchamiają cronjob, który co 15 minut rsyncs z głównym serwerem, skrypt My Sync wygląda następująco:
sync.sh
#!/bin/sh
#MountFTP
echo "RASPERRYPIROOTPASSWORD" | sudo umount /home/pi/ftp/
sleep 5
echo "RASPERRYPIROOTPASSWORD" | sudo curlftpfs www-data:MYPASSWORD@MYSERVER.COM /home/pi/ftp -o allow_other
#Sync Videos
rsync -avztr --delete /home/pi/ftp/data/files/CURRENTRASPBERRYPI/ /home/pi/vids/
#sync scripts (so we can remotely update the scripts)
rsync -avztr /home/pi/ftp/data/files/Scripts/syncscript/CURRENTRASPBERRYPI/sync.sh /home/pi #is this script
rsync -avztr /home/pi/ftp/data/files/Scripts/play.sh /home/pi #is they play videos script
chmod +x *.sh
#Write to log
IP="$(curl -s http://whatismyip.akamai.com/)"
DATE="$(date +%d-%m-%Y-%X)"
echo $DATE " - " $IP " - CURRENTRASPBERRYPI " >> /home/pi/CURRENTRASPBERRYPI.txt
cp /home/pi/CURRENTRASPBERRYPI.txt /home/pi/ftp/logs/
Wielkie litery w powyższym skrypcie ręcznie zmieniałem dla każdego komputera, na którym działa skrypt.
Na serwerze korzystałem z internetowego menedżera plików o nazwie AJAX explorer, zwanego teraz Pydio. Dzięki temu użytkownicy końcowi mogą łatwo przesyłać filmy wideo do każdego komputera / wybranej lokalizacji (/ ftp / data / files / CURRENTRASPBERRYPI /).