問題: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 &
私はここで非常に明白な何かを見逃しているのではないかと思うので、正しい方向への助け、アイデア、ポイントをいただければ幸いです。
飼料