python - 有没有办法使用 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)
任何建议将不胜感激,谢谢。
安东尼
解决方案
经过一番修改后,我设法使用原始 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()
推荐阅读
- typo3 - TYPO3 8.7.27:段不是 postVarSet 的关键字
- regex - 如果换行符前面没有句点,则 Vim 中的正则表达式会尝试删除换行符
- python - 如何获取验证集上的错误预测列表
- python - 热图不显示
- amazon-web-services - AWS在VPC中通过ELB连接EC2,如何配置?
- php - 如何访问 laravel 集合中的属性值
- python-3.x - 使用应用程序工厂模式时如何从嵌入式 Dash 应用程序中访问 Flask 应用程序的上下文?
- wordpress - 我想在 WordPress 中为自定义分类创建一个字母导航而不影响网站设计
- android - 关闭 SpeechClient 时出现 java.util.concurrent.RejectedExecutionException
- c# - 单元测试 xunit 以下构造函数参数没有匹配的夹具数据