我有一些原始的ADPCM压缩音频流,我想玩他们的游戏,但据我所知,这是不可能的游戏。我如何用python将它们解压缩到正常的PCM流(或者其他游戏可以玩的东西),然后再用吡咯来玩它们呢?
我已经尝试了audioop模块,因为它有一些东西可以将ADPCM转换为线性流,但我既不知道什么是线性流,也不知道如何使用转换它们的函数。
发布于 2013-10-02 19:44:07
我已经尝试了audioop模块,因为它有一些东西可以将ADPCM转换为线性流,但我既不知道什么是线性流,也不知道如何使用转换它们的函数。
简短的版本:“线性”是你想要的。*所以,你想要的函数是adpcm2lin。
你是怎么用的?
audioop中的几乎所有东西都以相同的方式工作:在框架上循环,并在每个帧上调用一个函数。如果输入数据有一些固有的帧大小,比如当您从MP3文件(使用外部库)读取时,或者您的输出库需要一些特定的帧大小,那么您在确定框架的方式上会受到一些限制。但是,当您处理原始PCM格式时,帧大小是您想要的,从一个示例到整个文件。**
为了简单起见,让我们先完成整个文件:
with open('spam.adpcm', 'rb') as f:
adpcm = f.read()
pcm, _ = audioop.adpcm2lin(adpcm, 2, None)如果您的adpcm文件太大,无法同时加载到内存和进程中,则需要跟踪state,因此:
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开始的时候,你就不会在这里听音乐了。
https://stackoverflow.com/questions/19144864
复制相似问题