使用RAM缓存在python中播放视频和声音

时间:2017-06-04 20:10:43

标签: python raspberry-pi

我正在编写一个python应用程序。当用户按下按钮时,此应用程序应播放声音或视频。

这总是与播放的声音和视频相同。每个视频和每个声音可以播放几次。

此应用程序适用于树莓派。

这就是我所做的:

for audio:

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

视频:

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

效果很好,但视频并未立即显示。这是正常的,因为系统应该在磁盘上加载mp4文件并启动外部播放器。

我想要做的是将所有音频和视频文件加载到ram内存中,并在用户按下按钮时立即播放。

我只有5个视频或音频文件,但用户会在按钮上点按100次。您可以理解,我每次都无法在磁盘上加载文件。

所以我的问题是:如何在python中从ram内存加载,播放和显示文件?

由于

1 个答案:

答案 0 :(得分:0)

  

评论:...在playmedia功能中缺少“全球媒体”

     

不需要global,因为首先有一个读取media并且因此绑定到def的本地命名空间。但是没有伤害。

    if not filename in media:
     

评论:我不能用pygame.mixer做两倍的部分......

     

尝试添加seek

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

music调用close()方法时,将丢弃缓冲区。   然后,检查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)