Python 使用Pygame播放ADPCM流
我有一些原始的ADPCM压缩音频流,我想用pygame来播放它们,但据我所知,用pygame是不可能的。我如何用python将它们解压缩到正常的PCM流或pygame可以玩的其他东西,然后用pygame玩它们 我已经尝试过audioop模块,因为它有一些东西可以将ADPCM转换为线性流,但我既不知道什么是线性流,也不知道如何使用转换它们的函数 我已经尝试过audioop模块,因为它有一些东西可以将ADPCM转换为线性流,但我既不知道什么是线性流,也不知道如何使用转换它们的函数 简短版本:Linear就是您想要的。*因此,您想要的函数是adpcm2lin 你如何使用它 audioop中的几乎所有内容都以相同的方式工作:在帧上循环,并在每个帧上调用一个函数。如果您的输入数据有一些固有的帧大小,例如,当您使用外部库读取MP3文件时,或者您的输出库需要一些特定的帧大小,那么您在确定帧的方式上会受到一些限制。但是,当您处理原始PCM格式时,帧的大小是您想要的任何大小,从单个样本到整个文件** 为了简单起见,让我们先处理整个文件:Python 使用Pygame播放ADPCM流,python,audio,stream,pygame,adpcm,Python,Audio,Stream,Pygame,Adpcm,我有一些原始的ADPCM压缩音频流,我想用pygame来播放它们,但据我所知,用pygame是不可能的。我如何用python将它们解压缩到正常的PCM流或pygame可以玩的其他东西,然后用pygame玩它们 我已经尝试过audioop模块,因为它有一些东西可以将ADPCM转换为线性流,但我既不知道什么是线性流,也不知道如何使用转换它们的函数 我已经尝试过audioop模块,因为它有一些东西可以将ADPCM转换为线性流,但我既不知道什么是线性流,也不知道如何使用转换它们的函数 简短版本:Line
with open('spam.adpcm', 'rb') as f:
adpcm = f.read()
pcm, _ = audioop.adpcm2lin(adpcm, 2, None)
如果adpcm文件太大,无法加载到内存并一次处理所有文件,则需要跟踪状态,因此:
当然,我假设您不需要转换采样率或做任何其他事情。如果这样做,任何此类转换都应该在ADPCM解压缩之后进行***
*长版本:线性意味着样本直接编码,而不是通过另一种算法映射。例如,如果您有一个16位a-to-D,并且您将音频保存在一个8位线性PCM文件中,那么您只需保存每个样本的前8位。这给了你一个非常动态的范围,所以更安静的声音会在噪音中消失。当然,有各种各样的压扩算法,它们为相同数量的比特提供了更大的动态范围,但代价是在别处丢失其他信息;有关μ律算法如何工作的详细信息,请参见μ律算法。但如果你能保持在16位,线性就可以了
**实际上,使用4位原始ADPCM,你真的不能做一个样本…但你可以做两个样本,这已经足够接近了
***如果你真的很挑剔,你可能想先转换成32位,然后再做这项工作,然后再转换回16位以避免累积损失。但是,当你开始使用4位ADPCM时,你不会选择这里的音响发烧友
我已经尝试过audioop模块,因为它有一些东西可以将ADPCM转换为线性流,但我既不知道什么是线性流,也不知道如何使用转换它们的函数
简短版本:Linear就是您想要的。*因此,您想要的函数是adpcm2lin
你如何使用它
audioop中的几乎所有内容都以相同的方式工作:在帧上循环,并在每个帧上调用一个函数。如果您的输入数据有一些固有的帧大小,例如,当您使用外部库读取MP3文件时,或者您的输出库需要一些特定的帧大小,那么您在确定帧的方式上会受到一些限制。但是,当您处理原始PCM格式时,帧的大小是您想要的任何大小,从单个样本到整个文件**
为了简单起见,让我们先处理整个文件:
with open('spam.adpcm', 'rb') as f:
adpcm = f.read()
pcm, _ = audioop.adpcm2lin(adpcm, 2, None)
如果adpcm文件太大,无法加载到内存并一次处理所有文件,则需要跟踪状态,因此:
当然,我假设您不需要转换采样率或做任何其他事情。如果这样做,任何此类转换都应该在ADPCM解压缩之后进行***
*长版本:线性意味着样本直接编码,而不是通过另一种算法映射。例如,如果您有一个16位a-to-D,并且您将音频保存在一个8位线性PCM文件中,那么您只需保存每个样本的前8位。这给了你一个非常动态的范围,所以更安静的声音会在噪音中消失。当然,有各种各样的压扩算法,它们为相同数量的比特提供了更大的动态范围,但代价是在别处丢失其他信息;有关μ律算法如何工作的详细信息,请参见μ律算法。但如果你能保持在16位,线性就可以了
**实际上,使用4位原始ADPCM,你真的不能做一个样本…但你可以做两个样本,这已经足够接近了
***如果你真的很挑剔,你可能想先转换成32位,然后再做这项工作,然后再转换回16位以避免累积损失。但是,当您开始使用4位ADPCM时,您不会选择这里的音响发烧友声音。ADPCM中的值必须是什么格式的字符串、int、byte等?ADPCM中的值必须是什么格式的字符串、int、byte等?