2017-06-04 79 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