我正在编写一个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内存加载,播放和显示文件?
由于
答案 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)