与RAM CACHE一起播放Python的视频和声音



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

这始终是播放的声音和视频。每个视频和每个声音都可以播放几次。

此应用程序将在Raspberry 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次。据您了解,我不能每次都在磁盘上加载文件。

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

谢谢

注释:...在PlayMedia函数中缺少"全局媒体"

不需要global,因为首先有一个读取media,然后绑定到def的本地名称空间。但不会伤害。

    if not filename in media:

注释:我不能用pygame.mixer进行两倍的部分...

尝试添加seek

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

music调用close()方法时,缓冲区被丢弃。 然后,检查music是否可以强制不关闭 fileHandle。


此示例播放两个媒体文件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)

最新更新