首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Pygame播放ADPCM流

使用Pygame播放ADPCM流
EN

Stack Overflow用户
提问于 2013-10-02 19:07:30
回答 1查看 981关注 0票数 1

我有一些原始的ADPCM压缩音频流,我想玩他们的游戏,但据我所知,这是不可能的游戏。我如何用python将它们解压缩到正常的PCM流(或者其他游戏可以玩的东西),然后再用吡咯来玩它们呢?

我已经尝试了audioop模块,因为它有一些东西可以将ADPCM转换为线性流,但我既不知道什么是线性流,也不知道如何使用转换它们的函数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-02 19:44:07

我已经尝试了audioop模块,因为它有一些东西可以将ADPCM转换为线性流,但我既不知道什么是线性流,也不知道如何使用转换它们的函数。

简短的版本:“线性”是你想要的。*所以,你想要的函数是adpcm2lin

你是怎么用的?

audioop中的几乎所有东西都以相同的方式工作:在框架上循环,并在每个帧上调用一个函数。如果输入数据有一些固有的帧大小,比如当您从MP3文件(使用外部库)读取时,或者您的输出库需要一些特定的帧大小,那么您在确定框架的方式上会受到一些限制。但是,当您处理原始PCM格式时,帧大小是您想要的,从一个示例到整个文件。**

为了简单起见,让我们先完成整个文件:

代码语言:javascript
复制
with open('spam.adpcm', 'rb') as f:
    adpcm = f.read()
pcm, _ = audioop.adpcm2lin(adpcm, 2, None)

如果您的adpcm文件太大,无法同时加载到内存和进程中,则需要跟踪state,因此:

代码语言:javascript
复制
with open('spam.adpcm', 'rb') as f:
    state = None
    while True:
        adpcm = f.read(BLOCKSIZE)
        if not adpcm:
            return
        pcm, state = audioop.adpcm2lin(adpcm, 2, state)
        yield pcm

当然,我假设你不需要转换样本率,也不需要做其他事情。如果需要,任何此类转换都应该在ADPCM解压缩之后进行。*

*长版本:“线性”是指样本直接编码,而不是通过另一种算法进行映射。例如,如果你有一个16位的A到D,并且你把音频保存在一个8位的线性PCM文件中,你只需要保存每个样本的前8位。这给了你一个非常动态的范围,所以更安静的声音会在噪音中消失。有各种各样的压缩算法,它们为相同数量的比特提供了更大的动态范围(当然,代价是在其他地方丢失其他信息);关于它们的工作细节,请参阅μ-law算法。但是如果你能保持在16位,线性就可以了。

**实际上,使用4位原始ADPCM,您真的不能做一个样本…。但你可以做两个样本,这是足够接近。

*如果你真的很挑剔,你可能想先转换为32位,然后做工作,然后转换回16位,以避免累积损失。但是当你从4位ADPCM开始的时候,你就不会在这里听音乐了。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19144864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档