3

簡単な通知アプリをbashで書こうとしています。mplayerからの出力を読み取り、解析して、notify-sendで表示したいと思います。

これを使用して、mplayerから必要な情報を取得できます。

mplayer <url> | grep ICY

次に、sedを使用して解析します。

名前付きパイプを作成し、mplayerにそれを書き込むように指示してから、それから読み取ります。残念ながら、それは機能しません。これが私のスクリプトです:

$fifo=~/.rp/fifo
mkfifo $fifo

mplayer <url> 2>/dev/null | grep ICY 1> $fifo &

while read line < $fifo; do
    echo $line
done

wait

プログラムは$fifoからの入力を待ち続けます。このスクリプトの実行中に、他の端末でフォローしてみました。

  1. 走る

    echo "Test" > .rp/fifo
    

    スクリプトを実行している端末に「テスト」と表示される

  2. 走る

    echo "ICY" | grep ICY > .rp/fifo
    

    また動作します。

  3. 走る

    mplayer <url> | grep ICY > .rp/fifo
    

    そしてそれは動作しません

私は上で言った、mplayerの組み合わせ| grepは正常に動作します。grep>$fifoは正常に機能します。なぜmplayerがわからない| grep>$fifoは機能しません。

4

3 に答える 3

5

ストリームに対してCライブラリの完全バッファモードが発生している可能性があります。GNUユーザースペースを実行しているとは言いませんが、実行している場合はstdbuf(1)、バッファリングレジームを変更するために調べることができます。

grep次のように、の子として最初に実行してみてくださいstdbuf(1)

mplayer <url> | stdbuf -o L grep ICY > .rp/fifo

それがうまくいかない場合、うめき声​​はベッターです!

stdbuf -o 0 mplayer <url> | stdbuf -o L grep ICY > .rp/fifo

それでも機能しない場合は、mplayerstdoutに書き込みではなく、直接に書き込みを行っている可能性があり/dev/ttyます。その場合は、を読む必要がありますexpect(1)

于 2012-10-28T18:35:19.783 に答える
4

バッファリングされていないgrepは、次のコマンドで実行できます。

$ mplayer ...  2>&1 | grep --line-buffered "ICY"

以上:

$ mplayer ...  2>&1 | sed -une 's/^.*ICY[^:]*: //p'

または、なぜそうではありませんか(sedはgrepとフォーマットに非常に適しています)、これは行をgrepし、2番目のフィールドからaで区切られた30文字の長さの最初のフィールドをICY含む行を分割します。-:

$ mplayer ...  2>&1 |
    sed -une "
        /ICY/{
            s/^.*ICY[^:]*:.*'\([^']*\)';/\1/;
            s/^\(.*\) - /\1                              - /;
            s/^\(.\{30\}\) *- /\1: /;
            p;
    }"

次のようなものを与えることができます:

Artist name                  : Song title
Other artist                 : Other song
Unsplited line
Artist                       : Title
于 2012-10-29T00:27:15.403 に答える
1

FIFOファイルを使用して、mplayerをスレーブモードで起動します。

mkfifo /tmp/mpfifo

mplayer -slave -input file=/tmp/mpfifo video.mp4

別の端末からビデオプレーヤーを制御できます。

echo "pause" >> /tmp/mpfifo
echo "volume 50" > /tmp/mpfifo

値を取得したい(たとえば、ビデオを再生している現在の位置)。だから私は試しました:

echo "get_time_pos" > /tmp/mpfifo

しかし、値は返されません。何時間も検索しましたが、成功しませんでした。次に、mplayerの出力をファイルにリダイレクトすることを考えました。

mplayer -slave -input file=/tmp/mpfifo video.mp4 > /tmp/mpout.txt

その後、次のコマンドが実行されるようになります。

echo "get_time_pos" > /tmp/mpfifo
echo "get_property length" > /tmp/mpfifo

/tmp/mpout.txtの出力は次のようになりました。

.......
.......
ANS_TIME_POSITION=113.6
ANS_length=2534.602031

各コマンドの結果がコマンドラインに戻るとしたら、とてもいいでしょう。いくつかの作業が必要な場合でも、出力ファイルは解析できます。

于 2015-05-11T08:31:32.013 に答える