我正在编写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)