Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Pygame播放ADPCM流_Python_Audio_Stream_Pygame_Adpcm - Fatal编程技术网

Python 使用Pygame播放ADPCM流

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

我有一些原始的ADPCM压缩音频流,我想用pygame来播放它们,但据我所知,用pygame是不可能的。我如何用python将它们解压缩到正常的PCM流或pygame可以玩的其他东西,然后用pygame玩它们

我已经尝试过audioop模块,因为它有一些东西可以将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时,你不会选择这里的音响发烧友

我已经尝试过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等?