2013-02-15 39 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完全凍結。

我也使用bash(代替灰)和管道輸出到類似下面的函數嘗試過,但得到了同樣的凍結問題:

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的本身獲得的軌道。

我的「解決方案」可能是太hackish的,但適合我的需要,因爲我知道我的機器僅會的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從'lsof'的輸出中選擇一個具有讀權限([0-9] + r)的常規文件(REG),第二個從匹配行中提取文件名。 – 2016-02-15 11:40:54

1

可以使用run命令。如果按Delete鍵在播放文件時,它會做你所期望的,即追加當前文件播放和流到~/out文件的位置

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

現在:

~/.mplayer/input.conf將這個。您可以用您的程序替換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」是不會錯過任何

相關問題