2016-09-20 50 views
0

我有一个需要发送到Speech-To-Text API的MP4音频文件的URL。该API只接受WAV流。我使用n音讯1.7.3和下面的代码下载的文件,并获得相应的流被发送到API:在内存中创建WAV流

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流

回答

0

您需要倒带内存流回到开头

ms.Position = 0 
+0

谢谢,马克。有效! –