2017-06-04 8 views
0

私はPythonアプリケーションを作成しています。このアプリケーションは、ユーザーがボタンを押したときにサウンドまたはビデオを再生する必要があります。ビデオとサウンドをRAMキャッシュ付きのPythonで再生する

これは常に再生されるサウンドと同じです。各ビデオと各サウンドは複数回再生することができます。

このアプリケーションは、ラズベリーPiで動作します。

オーディオ用:ここ

は私がやっていることであるビデオのための

pygame.mixer.init() 
pygame.init() 
pygame.mixer.music.load("myfile.mp3") 
pygame.mixer.music.play() 

:それは素晴らしい作品が、ビデオがすぐに表示されていない

p = Popen(['omxplayer', 'myvideo.mp4']) 

。システムはmp4ファイルをディスクにロードし、外部プレーヤーを起動する必要があるため、これは正常です。

私がやりたいことは、すべてのオーディオとビデオファイルをRAMメモリにロードし、ユーザーがボタンを押すとすぐに再生することです。

私は5つのビデオまたはオーディオファイルしか持っていませんが、ユーザーはボタンを100回タップします。あなたが理解できるように、毎回ディスクにファイルをロードできません。

私の質問は次のとおりです:どのように読み込み、再生、ファイルをRAMメモリからPythonで表示できますか?

おかげ

答えて

0

コメント:最初mediaを読み、therforeがにバインドがあるので...そこplaymedia機能の「グローバルメディアを」行方不明は

、必要な一切globalありませんローカルネームスペースdefしかし、害はありません。

if not filename in media: 

コメント:私はpygame.mixerで二回セクションを行うことができない... seekを追加

してみてください。

media[filename].seek(0) 
    pygame.mixer.music.load(... 

musicclose()メソッドを呼び出したときにバッファが破棄されます。 次に、musicが強制的に実行できるかどうかを確認します。ファイルハンドルをに閉じないでください。


この例では、2つのメディアファイル3回を果たしているが、一旦メモリにロードファイル:

import io, subprocess, time 
media = {} 
def playMedia(filename): 
    if not filename in media: 
     with open(filename, 'rb') as in_file: 
      media[filename] = io.BytesIO(in_file.read()) 

    p = subprocess.Popen(['./mplayer', '-cache 8192'], stdin=subprocess.PIPE) 
    p.stdin.write(media[filename].getbuffer()) 
    p.stdin.close() 

    time.sleep(5) 
    p.terminate() 

if __name__ == '__main__': 
    for n in range(3): 
     for m in ["mp.mp3", 'mp.mp4']: 
      playMedia(m) 
+0

あなたはplaymedia機能の「グローバルメディアを」行方不明そこだと思いませんか? – Bob5421

+0

2番目の質問:私は、pygame.mixerでセクションを2回実行することはできません。ロード関数がbytesio引数を削除するようです – Bob5421

関連する問題