【问题标题】:Play video and sound in python, with RAM cache在 python 中播放视频和声音,带有 RAM 缓存
【发布时间】:2017-06-04 20:10:42
【问题描述】:

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

播放的总是相同的声音和视频。每个视频和每个声音都可以播放多次。

此应用程序将在树莓派上运行。

这是我所做的:

音频:

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

视频:

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

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

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

我只有 5 个视频或音频文件,但用户会点击按钮 100 次。如您所知,我无法每次都将文件加载到磁盘上。

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

谢谢

【问题讨论】:

    标签: python raspberry-pi


    【解决方案1】:

    评论:...... 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)
    

    【讨论】:

    • 你不觉得 playmedia 功能缺少“全球媒体”吗?
    • 第二个问题:我不能用 pygame.mixer 做两次加载功能似乎删除了 bytesio 争论
    猜你喜欢
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多