Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.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#和NAudio将[]Int16转换为[]float?_C#_Audio_Type Conversion_Wav_Naudio - Fatal编程技术网

如何使用C#和NAudio将[]Int16转换为[]float?

如何使用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

我从WAV文件中获取了行数据。现在,我知道了关于WAV文件的信息,比如数据速率和采样率等等

在读取WAV文件之后,我有几种数据类型:16位-[]Int16,8位-[]byte

现在我正在尝试将[]Int16转换为[]float

我找到了NAudio.wave函数Wave16ToFloatProvider()

我看到了。但我无法理解,因为我不需要写一个作家。 所以我试着不去写。这是我的密码

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
    // ....
}
谢谢;)这对我有很大帮助(谢谢你)这对我帮助很大