Python 在pygame中从缓冲区播放声音

Python 在pygame中从缓冲区播放声音,python,audio,pygame,Python,Audio,Pygame,我试图在pygame中播放缓冲区中的声音。我正在使用Python3。 我得到了未压缩的wav文件,sound.wav 我可以这样玩,效果很好: sound = pygame.mixer.Sound(file='/path/to/file/sound.wav') sound.play() 根据缓冲区可以是Python 3字节对象,但如果我尝试: f = open('/path/to/file/sound.wav', 'rb') data = f.read() sound = pygame.mix

我试图在pygame中播放缓冲区中的声音。我正在使用Python3。 我得到了未压缩的wav文件,sound.wav

我可以这样玩,效果很好:

sound = pygame.mixer.Sound(file='/path/to/file/sound.wav')
sound.play()
根据缓冲区可以是Python 3字节对象,但如果我尝试:

f = open('/path/to/file/sound.wav', 'rb')
data = f.read()
sound = pygame.mixer.Sound(buffer=data)
sound.play()
此代码可以运行,但声音变形

那么,如何使用缓冲区呢?文档确实是多余的,我找不到任何例子。我不能从硬盘播放声音,因为我有很多原始音频块,我将它们转换成wav,但将它们保存在硬盘上(然后读取它们)是一种缓慢而低效的方法(因为我已经在内存中存储了它们)。谢谢你的帮助

编辑:
我忘了提到,我还试图播放没有标题的原始音频。幸运的是,感谢大家的评论,我理解了pygame中缓冲区的含义。我用pygame.mixer.init初始化mixer(频率=22050,大小=8,通道=1)所以我认为缓冲区应该是这种格式。我把pygame.mixer.Sound(file='/path/to/file/Sound.wav').get_raw()返回的内容转储到磁盘上,经过检查,我可以说这是原始音频,但频率为44100,大小为-16。

这里是一个完整的示例,从创建一个充满音频的内存缓冲区,然后使用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混音器的原始音频选项相同


玩得开心

您可能需要使用而不是普通的文件读取,否则,例如,wav文件头也将被播放。@Andris:get_raw()在Python 3中返回一个bytes对象。您知道如何在pygame中将其转换回声音对象吗?@Peihui:将您的rawdata用作声音(rawdata)或声音(buffer=rawdata)-请参阅有关可能的构造函数参数的文档。奇怪的是,我只从文档开始工作,因为我有get_buffer().raw only和not get_raw()。(可能版本不匹配。)您的原始音频格式是什么(位宽、通道计数、采样率)?混音器可以启动到该格式吗?我保存原始数据的尝试是成功的-混音器将10秒44KHz 32位立体声的采样频率从1.76MB wav调低到220500字节的原始音频,正如预期的那样。我没有听到使用它的声音:
python3--version
python3.8.5
pygame
version:1.9.6在
Ubuntu 20.04.1 LTS