在内存中创建WAV流

时间:2016-09-20 08:47:14

标签: naudio

我有一个MP4音频文件的URL,我需要发送到Speech-To-Text API。 API仅接受WAV流。我正在使用NAudio 1.7.3和以下代码下载该文件并获取要发送到API的相应流:

string filePath = "C:\Windows\Temp\file.wav";
using (MediaFoundationReader reader = new MediaFoundationReader(audioFileURL))
{
    WaveFileWriter.CreateWaveFile(filePath, reader);
}
System.IO.FileStream fs = new FileStream(filePath, FileMode.Open);

然后我将fs流发送到API,一切正常,但由于I / O到磁盘的速度非常慢。

我决定重写这段代码并执行内存中所需的全部内容。为此,我编写了以下代码(不能为我提供正确的流):

using (MediaFoundationReader reader = new MediaFoundationReader(audioLocation)){
    MemoryStream ms = new MemoryStream();
    IgnoreDisposeStream ids = new IgnoreDisposeStream(ms);
    WaveFileWriter writer = new WaveFileWriter(ids, reader.WaveFormat);

    //Doing one of the following (both provide the same outcome):
    //1. reader.CopyTo(ids);
    //or 
    //2. this code from NAudio source:
    var buffer = new byte[reader.WaveFormat.AverageBytesPerSecond * 4];
    while (true)
    {
        int bytesRead = reader.Read(buffer, 0, buffer.Length);
        if (bytesRead == 0)
        {
            // end of source provider
            break;
        }
        // Write will throw exception if WAV file becomes too large
        writer.Write(buffer, 0, bytesRead);
    }

    writer.Dispose();
    Stream streamToSendToAPI = ids.SourceStream;

    //Send streamToSendToAPI to Speech-To-Text API

}

我的期望是使用第二个代码示例,我使用WAV标头创建流,然后将数据添加到流,将为我提供有效的WAV流。但是,当我将其发送到语音到文本API时,API会给出错误,指示无法处理流(意味着流无效)。

请告知如何修复内存中的代码示例以创建有效的WAV流

1 个答案:

答案 0 :(得分:1)

您需要将内存流回退到开头

ms.Position = 0