如何使用C#和NAudio将[]Int16转换为[]float?
我从WAV文件中获取了行数据。现在,我知道了关于WAV文件的信息,比如数据速率和采样率等等 在读取WAV文件之后,我有几种数据类型:16位-[]Int16,8位-[]byte 现在我正在尝试将[]Int16转换为[]float 我找到了NAudio.wave函数Wave16ToFloatProvider() 我看到了。但我无法理解,因为我不需要写一个作家。 所以我试着不去写。这是我的密码如何使用C#和NAudio将[]Int16转换为[]float?,c#,audio,type-conversion,wav,naudio,C#,Audio,Type Conversion,Wav,Naudio,我从WAV文件中获取了行数据。现在,我知道了关于WAV文件的信息,比如数据速率和采样率等等 在读取WAV文件之后,我有几种数据类型:16位-[]Int16,8位-[]byte 现在我正在尝试将[]Int16转换为[]float 我找到了NAudio.wave函数Wave16ToFloatProvider() 我看到了。但我无法理解,因为我不需要写一个作家。 所以我试着不去写。这是我的密码 using System; using System.Collections.Generic; using
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using NAudio;
using NAudio.Wave;
namespace WaveREader
{
class WaveReader
{
WaveFileReader reader = new WaveFileReader("wavetest.wav");
IWaveProvider stream32 = new Wave16ToFloatProvider(reader);
byte[] buffer = new byte[8192];
float[] DATASIXTEEN;
for (int i = 0; i < buffer.Length; i++)
{
DATASIXTEEN = new float[buffer.Length];
DATASIXTEEN[i] = stream32.Read(buffer, 0, buffer.Length);
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.IO;
使用NAudio;
使用NAudio.波;
命名空间读波器
{
类读波器
{
WaveFileReader=新的WaveFileReader(“wavetest.wav”);
IWaveProvider stream32=新的Wave16ToFloatProvider(读卡器);
字节[]缓冲区=新字节[8192];
浮动[]数据集;
for(int i=0;i
我认为这部分是错误的,DATASIXTEEN[I]=stream32.Read(buffer,0,buffer.Length)代码>,但我不知道如何更正它
您能给我一些建议吗,或者使用Wave16ToFloatProvider编写代码
或者我会问您如何在没有Wave16ToFloatProvider的情况下进行转换?来自流的返回值。Read
是读取的字节数,而不是您所要读取的字节数。您需要的数据在缓冲区中,但每个32位样本分布在4个8位字节中
有许多方法可以将数据获取为32位浮点
第一种方法是使用ISampleProvider
,它将数据转换为浮点格式,并提供一种读取该格式数据的简单方法:
WaveFileReader reader = new WaveFileReader("wavetest.wav");
ISampleProvider provider = new Pcm16BitToSampleProvider(reader);
int blockSize = 2000;
float[] buffer = new float[blockSize];
// Read blocks of samples until no more available
int rc;
while ((rc = provider.Read(buffer, 0, blockSize)) > 0)
{
// Process the array of samples in here.
// rc is the number of valid samples in the buffer
// ....
}
或者,waveilereader
中有一种方法可以让您直接读取浮点样本。缺点是它一次读取一个样本组(即,每个通道一个样本-一个用于单声道,两个用于立体声),这可能很耗时。在大多数情况下,读取和处理数组的速度更快
WaveFileReader reader = new WaveFileReader("wavetest.wav");
float[] buffer;
while ((buffer = reader.ReadNextSampleFrame()) != null)
{
// Process samples in here.
// buffer contains one sample per channel
// ....
}
Stream.Read
的返回值是读取字节数的计数,而不是您要读取的字节数。您需要的数据在缓冲区中,但每个32位样本分布在4个8位字节中
有许多方法可以将数据获取为32位浮点
第一种方法是使用ISampleProvider
,它将数据转换为浮点格式,并提供一种读取该格式数据的简单方法:
WaveFileReader reader = new WaveFileReader("wavetest.wav");
ISampleProvider provider = new Pcm16BitToSampleProvider(reader);
int blockSize = 2000;
float[] buffer = new float[blockSize];
// Read blocks of samples until no more available
int rc;
while ((rc = provider.Read(buffer, 0, blockSize)) > 0)
{
// Process the array of samples in here.
// rc is the number of valid samples in the buffer
// ....
}
或者,waveilereader
中有一种方法可以让您直接读取浮点样本。缺点是它一次读取一个样本组(即,每个通道一个样本-一个用于单声道,两个用于立体声),这可能很耗时。在大多数情况下,读取和处理数组的速度更快
WaveFileReader reader = new WaveFileReader("wavetest.wav");
float[] buffer;
while ((buffer = reader.ReadNextSampleFrame()) != null)
{
// Process samples in here.
// buffer contains one sample per channel
// ....
}
谢谢;)这对我有很大帮助(谢谢你)这对我帮助很大