我正在将音频mp3文件加载到python io.BytesIO缓冲区中。
然后我想用pygame.mixer多次播放这个音频文件。
第一次工作正常,但似乎pygame.mixer.music.play删除了缓冲区。
以下是源代码:
import io
import time
import pygame
with open(path_to_my_mp3_file, 'rb') as in_file:
buffer = io.BytesIO(in_file.read())
pygame.mixer.init()
pygame.mixer.music.load(buffer)
pygame.mixer.music.play() # works fine !
time.sleep(1)
pygame.mixer.music.load(buffer) # the buffer seems to be cleared
pygame.mixer.music.play()
我收到此错误:
File "test.py", line 17, in <module>
pygame.mixer.music.load(buffer)
pygame.error: Couldn't read from RWops
有什么想法吗?
由于
PS:
我试过了:
with open(path_to_my_mp3_file, 'rb') as in_file:
buffer = in_file.read()
pygame.mixer.init()
pygame.mixer.music.load(io.BytesIO(buffer))
pygame.mixer.music.play()
time.sleep(1)
pygame.mixer.music.load(io.BytesIO(buffer))
pygame.mixer.music.play()
它有效,但我认为这段代码性能较差
答案 0 :(得分:1)
BytesIO是一个类似文件的对象;因此,与任何流文件一样,它具有一个位置,所有读写操作都在该位置发生。因为您只是从中读取数据,所以位置在尽头,进一步读取不会执行任何操作。您应该使用
倒带buffer.seek(0)
将其加载到音乐之间。 但是您不需要两次加载,因为pygame.mixer.music对象本身具有rewind()方法:
pygame.mixer.music.rewind() # to the beginning
但是这里也不是必需的,因为play()方法...将音乐倒带到开头!
pygame.mixer.music.load(buffer)
pygame.mixer.music.play() # works fine !
time.sleep(1)
pygame.mixer.music.play() # and play it again!
那很简单!