3

問題:MPlayerプレイリストで現在再生中のファイルを確実に取得する方法が見つかりません。

これが私がどこまで到達したかです。この動作するashスクリプトは、現在のプレイリストへのパスを含むテキストファイルを監視します。ファイルを更新すると、スクリプトは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が完全にフリーズします。

また、(ashの代わりに)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 &

私はここで非常に明白な何かを見逃しているのではないかと思うので、正しい方向への助け、アイデア、ポイントをいただければ幸いです。

飼料

4

5 に答える 5

2

よし、それでは私も投稿してみよう。

これを試してみてください (飼料のマシンのように、実行中のインスタンスが 1 つだけであると仮定します):

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

ファイル記述子はすべてのシステムで常に同じ順序であるとは限らないため、これはおそらくより安全な方法です。ただし、これは短縮できますが、少しリスクがあります。

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

おそらくこれもインストールしたいと思うかもしれません: http://mplayer-tools.sourceforge.net/

于 2014-09-08T22:17:30.133 に答える
1

MPlayer自体からトラックを取得することをあきらめました。

私の「解決策」はおそらくあまりにもハックですが、私のマシンでは MPlayer のインスタンスが 1 つしか実行されないことがわかっているため、私のニーズには合っています。

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

誰かがより良いオプションを持っている場合、私は確かにこれを正しい方法で行うことにまだ興味がありますが、どの方法も機能させることができませんでした.

飼料

于 2013-02-20T20:51:31.603 に答える