我正在尝试从pygame中的缓冲区播放声音。我正在使用Python 3。 我得到了未压缩的wav文件,sound.wav。
我可以这样玩它并且工作正常:
sound = pygame.mixer.Sound(file='/path/to/file/sound.wav')
sound.play()
根据pygame documentation缓冲区可以是Python 3字节对象,但如果我尝试:
f = open('/path/to/file/sound.wav', 'rb')
data = f.read()
sound = pygame.mixer.Sound(buffer=data)
sound.play()
此代码可以运行,但声音会变形。
那么,如何使用缓冲区?文档非常多余,我找不到任何示例。我无法从硬盘播放声音,因为我有很多原始音频块,我将其转换为wav,但将它们保存在硬盘上(然后读取它们)是缓慢而低效的方法(因为我已经将它们放在内存中) 。谢谢你的帮助。
编辑:
我忘了提到我还尝试播放没有标题的原始音频。幸运的是,感谢@Andris评论,我找出了缓冲区对pygame的意义。我使用pygame.mixer.init(frequency=22050, size=8, channels=1)
初始化混音器,所以我认为缓冲区应该采用这种格式。我把pygame.mixer.Sound(file='/path/to/file/sound.wav').get_raw()
返回的内容转储到磁盘上,经过检查我可以说它是原始音频,但频率= 44100,大小= -16。
答案 0 :(得分:0)
这是一个完整的例子,用于创建一个充满音频的内存缓冲区,然后使用pygame播放它:
import pygame
import subprocess
rawdata = subprocess.check_output([
'sox', '-n', '-b', '16', '-e', 'signed', '-r', '44100',
'-c', '1', '-t', 'raw', '-', 'synth', '0.1', 'sin', '700'])
pygame.mixer.pre_init(frequency=44100, size=-16, channels=1)
pygame.init()
beep = pygame.mixer.Sound(buffer=rawdata)
pygame.mixer.Sound.play(beep)
pygame.quit()
注意给予sox的原始音频选项(采样率44.1k,16位有符号,1个通道)与pygame混音器的相同。
玩得开心!