首页 > 解决方案 > 有没有办法使用 pygame 播放原始 8 位 PCM 数据?

问题描述

我正在尝试使用 Python 和 Pygame 创建一个 amiga MOD 播放器。我已经成功地从 MOD 文件中提取了原始样本数据,但我似乎无法将其输入 pygame 的混音器。我改变了频率和大小(-16、16、-8、8),但音频输出只是噪音。

这就是我将数据输入 pygame 的混音器的方式

sound1 = pygame.mixer.Sound(buffer=raw_audio_data)

这是使用 base64 编码的原始音频,因此您可以使用它。

RAW_8BIT_AUDIO = b'AAD///8APnxWQjwy78eCrVOEgYKPlbDD3edhO19jf1tzeGBSL0YtFtXaFfbw5t6X8NLd0MWV3LSTgICHg4OJmKzT3u0KITM8RlRXYmlwanR/XHl7f39/fX52ZmNROyYVA+3u1MnGqqyyspeKp4yRgYKBkIOCgoKRobm/1+vvBVQXK3lMMyZLfGFzMlR/3n8qPl8IXDEsDwnz2MmqxOPJtMGSj7m8oq6ckK+H2f28v4vOx8nb+PoEOwgjbEIuakB9QmN8ZB54Nmd/d+0qaCvfdSzmOhz4AvvBBcOwwu6m1Z61rbCd69+G8B2zrOyz1RH8uMVN1nriAGTu8B0HRBfraWlMOyh0LmhsSUw8YCsWXuQbJkkWwPcCxYow6eq825QL5Y7cobnW16DExN3B2s/bGRD8/O790yZJJyzUKxERXRcOOz9lAAZ6MR/9KkIh+bsBAt8i1/7Z5eYGwM+4wuWUAsDstge0s60XyfzK4bjjuhnl7yPDFA7nHHAvEDM3aA4P+18nyzFtGQpIHjoaISPLJmX4B+8R3vv+++HO8cvwDOm5uejZv+et7OfUzOLL4r/YDvggGwMQ70r5DS0l+DYOJ3E4E/VAFFMATA0GDjrnyFf27g8DFO21+sXJAfnDxukABdWywOT7Ae4VBdni5VLCNwLwIRMW//oLFiP+ADkx6eIk3CgWE+AU1wIDJwHSJx/o9ynS8gQt5vAd8uUp9PUb/AMGKO8VEecZ+s0d+8XrHtwA/+QCAfDt3v7v3QT3F/odA0sGLRklFQQxAiv0/xH7KCkXAwP+DzLp8P/+DwbqB8v39fr7DekL8fjq7vL19v3n9c73Ehbz6ukABQgX2gIHAAAX+/4i8CIP/R0B/h37LQwr6RbwExEA/voJEPb0F/AO9/MIBtgO9PD2BufM+frl++7sBuru+Anx++3zAeIA/ADx7RoX+QcYBgwTBREHChj/8BQCGwUM+fn6Cwj3BRDvBxX7+Q7y7vsB9PfrBhH1/un+BN3xAff05QruAwD45gkACPoBAPoR+//6AQAGAf//AgAAAAA='

要对其进行解码,请使用:

import base64
data = base64.b64decode(RAW_8BIT_AUDIO)

任何建议将不胜感激,谢谢。

安东尼

标签: pythonaudiopygamegame-developmentmixer

解决方案


经过一番修改后,我设法使用原始 32 位浮点数据播放音频,方法如下。

import structs
import pygame

pygame.mixer.pre_init(44100, size=32, 4)
pygame.init()

raw = #Raw 8bit PCM data
bit = 1 / 512 # 512 sets the volume, the higher the number the quieter the sample
floats = []
for uByte in raw:
    if uByte > 0x7F:
        n = uByte - 256
    else:
        n = uByte
    floats += [bit * n] * 2 # 2 packs it out a bit otherwise it's too fast
buffer = struct.pack("%sf" % len(floats), *floats)
sound = pygame.mixer.Sound(buffer=buffer)
sound.play()

编辑:找到了一种更简单的方式来使用带符号的 8 位而不是 32 位浮点来播放它

import pygame

pygame.mixer.pre_init(44100, size=-8, 4)
pygame.init()

raw = #Raw 8bit PCM signed bytes

buf = b''
for index in range(len(raw)):
    uByte = raw[index:index + 1]
    buf += uByte * 4 # pack that out a bit

sound = pygame.mixer.Sound(buffer=buf)
sound.play()

推荐阅读