2017-06-04 202 views
0

我在寫一個python應用程序。此應用程序應該在用戶按下按鈕時播放聲音或視頻。使用RAM緩存播放蟒蛇中的視頻和聲音

這總是和播放的聲音和視頻一樣。每個視頻和每個聲音可能會播放多次。

此應用程序將工作在樹莓派。

這裏是我做了什麼:

音頻:

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

評論:...有失蹤playmedia功能的「全球媒體」

沒有global要求,因爲是第一次讀media和therfore結合到本地命名空間def。但不傷害。

if not filename in media: 

評論:我不能這樣做兩倍的部分與pygame.mixer ...

嘗試添加seek。當music調用close()方法

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

緩衝被丟棄。 然後,檢查是否可以強制music不要關閉文件句柄。


這個例子扮演兩個媒體文件的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

第二個問題:我不能用pygame.mixer做兩倍的加載函數,似乎刪除了bytesio爭論 – Bob5421