在pygame中从缓冲区播放声音

时间:2014-02-28 12:27:07

标签: python audio pygame

我正在尝试从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。

1 个答案:

答案 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混音器的相同。

玩得开心!