Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.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
C# 将IeeeFloat缓冲区中的音频数据转换为缓冲区中的PCM_C#_Naudio_Pcm_Wasapi - Fatal编程技术网

C# 将IeeeFloat缓冲区中的音频数据转换为缓冲区中的PCM

C# 将IeeeFloat缓冲区中的音频数据转换为缓冲区中的PCM,c#,naudio,pcm,wasapi,C#,Naudio,Pcm,Wasapi,我使用NAudio捕捉声音输入,输入显示为一个缓冲区,包含IeeeFloat格式的声音信息 现在缓冲区中有了这些数据,我想以不同的采样率将其转换为PCM 我已经知道如何从IeeeFloat转换到PCM,以及如何在单声道和立体声之间转换。转换采样率是困难的 任何解决方案,最好使用NAudio,可以将IeeeFLoat缓冲区转换为所选PCM格式的缓冲区(包括更改采样率)?如果您想在接收数据时重新采样,则需要执行输入驱动的重新采样。我不久前写的 NAudio有一些助手类可以从单声道转换为立体声,也可以

我使用NAudio捕捉声音输入,输入显示为一个缓冲区,包含IeeeFloat格式的声音信息

现在缓冲区中有了这些数据,我想以不同的采样率将其转换为PCM

我已经知道如何从IeeeFloat转换到PCM,以及如何在单声道和立体声之间转换。转换采样率是困难的


任何解决方案,最好使用NAudio,可以将IeeeFLoat缓冲区转换为所选PCM格式的缓冲区(包括更改采样率)?

如果您想在接收数据时重新采样,则需要执行输入驱动的重新采样。我不久前写的


NAudio有一些助手类可以从单声道转换为立体声,也可以从浮点转换为PCM,但它们倾向于在
IWaveProvider
ISampleProvider
输入上操作。通常,如果我只是将样本作为一个原始字节块,我会用自己的简单代码编写从浮点到PCM的代码,并将样本加倍。这并不难,WaveBuffer类将允许您直接从
字节[]
读取浮点采样。如果您想在接收数据时重新采样,则需要执行输入驱动的重新采样。我不久前写的


NAudio有一些助手类可以从单声道转换为立体声,也可以从浮点转换为PCM,但它们倾向于在
IWaveProvider
ISampleProvider
输入上操作。通常,如果我只是将样本作为一个原始字节块,我会用自己的简单代码编写从浮点到PCM的代码,并将样本加倍。这并不难,WaveBuffer类将允许您直接从
字节[]
读取浮点样本,我最近不得不这样做,但找不到一种内置的方法,所以我做了Mark所说的,手动转换原始数据。下面是向下采样IeeeFloat(32位浮点采样)、48000个采样/秒、2个通道到16位短、16000个采样/秒、1个通道的代码

我硬编码了一些东西,因为我的格式是已知的和固定的,但同样的原则也适用

private DownsampleFile()
{
var file={your file}
使用(var reader=new NAudio.Wave.waveilereader(file.FullName))
使用(var writer=new NAudio.Wave.waveilewriter({your output file},MyWaveFormat))
{
浮动[]浮动;
//用于标记当前样本mod 3-ness的变量
//我们正在映射48000-->16000,因此需要平均3个源
//样本制作1个输出样本
var-arity=-1;
var runningSamples=新的短期[3];
而((floats=reader.ReadNextSampleFrame())!=null)
{
//将2个通道折叠为1个通道的简单平均值
浮动单=(浮动)((双)浮动[0]+(双)浮动[1])/2;
//将(-1,1)范围int转换为short
短十六比特=(短)(单声道*32767);
//输入为48000Hz,输出为16000Hz,因此我们需要1/3的数据点
//因此,保存3个正在运行的示例,然后混合并写入该文件
arity=(arity+1)%3;
runningSamples[arity]=十六比特;
//在3个运行样本中的第三个
if(arity==2)
{
//3的简单平均值并置于第0位
runningSamples[0]=(短)((int)runningSamples[0]+(int)runningSamples[1]+(int)runningSamples[2])/3);
//将一个16位短路写入输出
WriteData(运行示例,0,1);
}
}
}
}

我最近不得不这样做,但找不到一种内置的方法来做,所以我做了Mark所说的,手动转换原始数据。下面是向下采样IeeeFloat(32位浮点采样)、48000个采样/秒、2个通道到16位短、16000个采样/秒、1个通道的代码

我硬编码了一些东西,因为我的格式是已知的和固定的,但同样的原则也适用

private DownsampleFile()
{
var file={your file}
使用(var reader=new NAudio.Wave.waveilereader(file.FullName))
使用(var writer=new NAudio.Wave.waveilewriter({your output file},MyWaveFormat))
{
浮动[]浮动;
//用于标记当前样本mod 3-ness的变量
//我们正在映射48000-->16000,因此需要平均3个源
//样本制作1个输出样本
var-arity=-1;
var runningSamples=新的短期[3];
而((floats=reader.ReadNextSampleFrame())!=null)
{
//将2个通道折叠为1个通道的简单平均值
浮动单=(浮动)((双)浮动[0]+(双)浮动[1])/2;
//将(-1,1)范围int转换为short
短十六比特=(短)(单声道*32767);
//输入为48000Hz,输出为16000Hz,因此我们需要1/3的数据点
//因此,保存3个正在运行的示例,然后混合并写入该文件
arity=(arity+1)%3;
runningSamples[arity]=十六比特;
//在3个运行样本中的第三个
if(arity==2)
{
//3的简单平均值并置于第0位
runningSamples[0]=(短)((int)runningSamples[0]+(int)runningSamples[1]+(int)runningSamples[2])/3);
//将一个16位短路写入输出