4

私はPythonでシンプルなフロントエンドを作成して、mplayer(サブプロセス内)を使用してインターネットラジオチャンネル(shoutcastなど)を再生および録音しています。ユーザーがステーションをクリックすると、次のコードが実行されます。


url = http://77.111.88.131:8010 # only an example
cmd = "mplayer %s" % url
p = subprocess.Popen(cmd.split(), shell=False)
wait = os.waitpid(p.pid, 1)
return int(p.pid)

これは完全に機能し、ストリームは正常に再生を開始します。どういうわけかストリームのタイトルを解析したいのですが。mplayerの出力からタイトルを取得する必要があるようです。これは、ターミナルでストリームを再生したときの出力です。

$ mplayer http://77.111.88.131:8010
MPlayer 1.0rc4-4.4.5(C)2000-2010MPlayerチーム
mplayer:ソケットに接続できませんでした
mplayer:そのようなファイルやディレクトリはありません
LIRCサポートを開くことができませんでした。リモコンは使用できなくなります。

http://77.111.88.131:8010を再生します。
AF_INET6の77.111.88.131を解決しています...
AF_INET6の名前を解決できませんでした:77.111.88.131
サーバーへの接続77.111.88.131[77.111.88.131]:8010 .. ..
名前:Justmusic.Fm
ジャンル:ハウス
ウェブサイト:http://www.justmusic.fm
公開:はい
ビットレート:192kbit / s
キャッシュサイズを320Kバイトに設定
キャッシュフィル:0.00%(0バイト)   
ICY情報:StreamTitle ='(JustMusic.FM)地下室-片頭痛のZajacはJustmusic2010-10-09に住んでいます';StreamUrl ='http://www.justmusic.fm';
キャッシュフィル:17.50%(57344バイト)   
音声のみのファイル形式が検出されました。

その後、停止するまで実行されます。だから問題は、どうすれば「(JustMusic.FM)地下室-Zajac、MigrenはJustmusic 2010-10-09に住んでいる」を取得し、それでもプロセスを実行させることができるかということです。subprocess()が実際に出力を保存しているとは思いませんが、間違っている可能性があります。どんな助けでも深く感謝します:)

4

2 に答える 2

5

stdout引数をに設定するPIPEと、コマンドの出力を聞くことができます。

p= subprocess.Popen(['mplayer', url], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout:
    if line.startswith('ICY Info:'):
        info = line.split(':', 1)[1].strip()
        attrs = dict(re.findall("(\w+)='([^']*)'", info))
        print 'Stream title: '+attrs.get('StreamTitle', '(none)')
于 2010-10-14T01:48:58.273 に答える
1
import re
import shlex
from subprocess import PIPE, Popen

URL = 'http://relay2.slayradio.org:8000/'

def get_exitcode_stdout_stderr(cmd):
    """
    Execute the external command and get its exitcode, stdout and stderr.
    """
    args = shlex.split(cmd)

    proc = Popen(args, stdout=PIPE, stderr=PIPE)
    out, err = proc.communicate()
    exitcode = proc.returncode
    #
    return exitcode, out, err

def get_title():
    cmd = "mplayer -endpos 1 -ao null {url}".format(url=URL)
    out = get_exitcode_stdout_stderr(cmd)[1]

    for line in out.split("\n"):
#        print(line)
        if line.startswith('ICY Info:'):
            match = re.search(r"StreamTitle='(.*)';StreamUrl=", line)
            title = match.group(1)
            return title

def main():
    print(get_title())

編集:ここで別の(より単純な)ソリューションが機能しなくなったため、ソリューションを更新しました。アイデア:mplayerは1秒後に停止します。(-endpos 1)。

于 2013-01-11T08:03:14.020 に答える