Проблема: я не могу найти способ надежно получить текущий файл воспроизведения в плейлисте MPlayer.Получить текущий файл воспроизведения в режиме ведомого устройства MPlayer
Вот как далеко я получил. Этот рабочий скрипт отслеживает текстовый файл с указанием пути к текущему списку воспроизведения. Когда я обновить файл, скрипт закрывает старый экземпляр MPlayer и открывает новый с нового списка воспроизведения:
# POLL PLAYLIST FILE FOR CHANGES
CURRENTPLAYLISTPATH=/home/tc/currentplaylist
INFIFO=/tmp/mplayer-in
CURRENTPLAYLIST="NEVERMATCHAPLAYLIST"
FIRSTRUN=1
while [ 1 ];
do
# CHECK FOR NEW PLAYLIST
NEWPLAYLIST=$(head -n 1 $CURRENTPLAYLISTPATH)
if [[ "$NEWPLAYLIST" != "$CURRENTPLAYLIST" ]]; then
if [ "$FIRSTRUN" == 0 ]; then
echo "quit" > "$INFIFO"
fi
# CREATE NAMED PIPE, IF NEEDED
trap "rm -f $INFIFO" EXIT
if [ ! -p $INFIFO ]; then
mkfifo $INFIFO
fi
# START MPLAYER
mplayer -fixed-vo -nolirc -vc ffmpeg12vdpau,ffh264vdpau, -playlist $NEWPLAYLIST -loop 0 -geometry 1696x954 -slave -idle -input file=$INFIFO -quiet -msglevel all=0 -identify | tee -a /home/tc/mplayer.log &
CURRENTPLAYLIST=$NEWPLAYLIST
FIRSTRUN=0
fi
sleep 5;
done
Мой первоначальный план был просто использовать «-identify» флаг и разбор файла журнала. Это действительно работает очень хорошо, пока мне не нужно обрезать файл журнала, чтобы он не становился слишком большим. Как только мой усечения запускается скрипт, MPlayer прекращает запись в файл журнала:
FILENAME=/home/tc/mplayer.log
MAXCOUNT=100
if [ -f "$FILENAME" ]; then
LINECOUNT=`wc -l "$FILENAME" | awk '{print $1}'`
if [ "$LINECOUNT" -gt "$MAXCOUNT" ]; then
REMOVECOUNT=`expr $LINECOUNT - $MAXCOUNT`
sed -i 1,"$REMOVECOUNT"d "$FILENAME"
fi
fi
Я искал и искал, но так и не смогли найти какой-либо другой способ получения текущего файла игры, который работает.
Я попытался подключить вывод к другому именованному каналу, а затем отслеживать его, но работает всего несколько секунд, затем MPlayer полностью замерзает.
Я также попытался с помощью Баш (вместо золы) и перенаправив вывод в функции, как в следующем, но получить такую же проблему замораживания:
function parseOutput()
{
while read LINE
do
echo "get_file_name" > /tmp/mplayer-in
if [[ "$LINE" == *ANS_FILENAME* ]]
then
echo ${LINE##ANS_FILENAME=} > "$CURRENTFILEPATH"
fi
sleep 1
done
}
# START MPLAYER
mplayer -fixed-vo -nolirc -vc ffmpeg12vdpau,ffh264vdpau, -playlist $NEWPLAYLIST -loop 0 -geometry 1696x954 -slave -idle -input file=/tmp/mplayer-in -quiet | parseOutput &
Я подозреваю, я пропускаю что-то очень очевидное здесь, так что любая помощь, идеи, точки в правильном направлении были бы весьма признательны.
кормовая
я использую немного другая версия, которая не требует знать путь к ресурсам заранее, печатает только имя файла: 'lsof -p $ (pidof -s mplayer) 2>/dev/null | grep -E "[0-9] + r. * REG" | grep -oE "[^ /] + $" '. Первый grep выбирает обычный файл (REG), открытый с разрешениями чтения ([0-9] + r) из вывода 'lsof', а второй извлекает имя файла из соответствующей строки. –