2016-06-23 67 views
0

当我使用websocket连接从Android发送实时音频流时,我得到BufferedWaveProvider上的缓冲区完全异常。 从Android发送的音频格式:44100,Sterio,16bit 我也尝试增加BufferedWaveProvider的缓冲区长度,但仍然没有好处,唯一改变的是程序运行时间更长,此外我尝试将音频记录到文件使用WaveFileWriter,该文件大约80mb用于10秒音频流并且没有音频。C#Naudio BufferedWaveProvider缓冲区完全异常

class Program 
{ 


    static WaveOut waveOut; 
    static BufferedWaveProvider bufferedWaveProvider = null; 
    private static SpeechSynthesizer ss; 
    private static SpeechRecognitionEngine sre; 
    private static int temperature = 75; 
    private static WebSocketServer appServer = new WebSocketServer(); 
    private static int total = 0; 
    private static WaveFileWriter writer = new WaveFileWriter("recording.wav", new WaveFormat(44100, 16, 2)); 
    private static MemoryStream memStream = new MemoryStream(); 

    static void Main(string[] args) 
    { 

     Console.WriteLine("Press any key to start the WebSocketServer!"); 
     Console.ReadKey(); 
     Console.WriteLine(); 
     waveOut = new WaveOut();    
     bufferedWaveProvider = new BufferedWaveProvider(new WaveFormat());   
     waveOut.Init(bufferedWaveProvider); 
     waveOut.Play();  
     appServer.NewDataReceived += new SessionHandler<WebSocketSession, byte[]>(appServer_NewDataReceived); 
     appServer.NewSessionConnected += AppServer_NewSessionConnected;   
     appServer.SessionClosed += new SessionHandler<WebSocketSession, CloseReason>(appServer_SessionClosed);  

     //Setup the appServer 
     if (!appServer.Setup(80)) //Setup with listening port 
     { 
      Console.WriteLine("Failed to setup!"); 
      Console.ReadKey(); 
      return; 
     } 

     //Try to start the appServer 
     if (!appServer.Start()) 
     { 
      Console.WriteLine("Failed to start!"); 
      Console.ReadKey(); 
      return; 
     } 

     Console.WriteLine("The server started successfully, press key 'q' to stop it!"); 

     while (Console.ReadKey().KeyChar != 'q') 
     { 
      Console.WriteLine(); 
      continue; 
     } 

     //Stop the appServer 
     appServer.Stop(); 
     Console.WriteLine(); 
     Console.WriteLine("The server was stopped!"); 
     Console.ReadKey(); 
    } 

    static void appServer_NewDataReceived(WebSocketSession session, byte[] value) 
    { 
     total = total + value.Length;    
     Console.WriteLine("Receiving!! " + total); 
     bufferedWaveProvider.AddSamples(value, 0, value.Length); 
    } 

回答

0

那么您需要首先了解输入数据的格式。如果您录制的wav文件中没有音频,则说明有问题,但在尝试访问wave文件之前必须调用Dispose。

+0

感谢Mark Heath,第二天我发现我的android设备实际上并没有录制音频,所以流是空的,现在它可以完美地解决任何问题,对于迟到的反应感到抱歉。 –