2013-02-15 3 views
3

Проблема: я не могу найти способ надежно получить текущий файл воспроизведения в плейлисте 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 & 

Я подозреваю, я пропускаю что-то очень очевидное здесь, так что любая помощь, идеи, точки в правильном направлении были бы весьма признательны.

кормовая

ответ

1

Ну, я сдалась на получение дорожки из самого MPlayer.

Мое «решение», вероятно, слишком хак, но работает для моих потребностей, так как я знаю, что моя машина будет только когда-либо один экземпляр MPlayer бега:

lsof -p $(pidof mplayer) | grep -o "/path/to/my/assets/.*" 

Если у кого есть лучший вариант, я, конечно, все еще заинтересованы в том, чтобы делать это правильно, я просто не мог заставить ни один из методов работать.

кормовая

+0

я использую немного другая версия, которая не требует знать путь к ресурсам заранее, печатает только имя файла: 'lsof -p $ (pidof -s mplayer) 2>/dev/null | grep -E "[0-9] + r. * REG" | grep -oE "[^ /] + $" '. Первый grep выбирает обычный файл (REG), открытый с разрешениями чтения ([0-9] + r) из вывода 'lsof', а второй извлекает имя файла из соответствующей строки. –

1

Вы можете использовать команду run.

Поместите это в ~/.mplayer/input.conf:

DEL run "echo ${filename} ${stream_pos} >> /home/knarf/out" 

Теперь, если нажать клавишу удаления во время воспроизведения файла, он будет делать то, что вы ожидаете, т.е. добавить текущий воспроизводимый файл и положение в потоке к файлу ~/out. Вы можете заменить echo на свою программу.

См. slave mod docs для получения дополнительной информации (Ctrl-F somevar).

2

Хорошо, тогда я отправлю тоже.

дать этому попытку (предполагая, что существует только один экземпляр работает, как на машине Кормовой в):

basename "$(readlink /proc/$(pidof mplayer)/fd/* | grep -v '\(/dev/\|pipe:\|socket:\)')" 

Это, вероятно, более безопасным способом, так как файловые дескрипторы не всегда могут быть в том же порядке на всех системах. Однако это может быть сокращен, с небольшим риском:

basename "$(readlink /proc/$(pidof mplayer)/fd/*)" | head -1 

Вы могли бы, вероятно, хотели, чтобы установить это, тоже: http://mplayer-tools.sourceforge.net/

0

О получении свойств от MPlayer

Я использовал не-изящное решение, но оно работает для меня.

stdbuf -oL mplayer --slave --input=file=$FIFO awesome_awesome.mp3 | 
{ 
while IFS= read -r line 
    do 
    if [[ "${line}" == ANS_* ]]; then 
     echo "${line#*=}" > ${line%=*} # echo property_value > property_name 
    fi 
    done 
} & 
mplayer_pid=&! 

read filename < ./ANS_FILENAME 
read timeLength < ./ANS_LENGTH 

echo ($timeLength) $filename 

и так далее ..

Он находится в другом proccess, поэтому я использовал файлы принести свойства

«stdbuf» для ничего не пропустить