2016-10-02 3 views
0

Ich habe einen Client mit geschriebenen C# und einen Server mit Java geschrieben. Ich sammle Audio und sende mit Socket an den Server und sende Server mit Web-Socket an den Browser und möchte mit Browser spielen. Aber wenn ich versuche, Browser sagt Uncaught (in Aussicht) DOMException: Fehler beim Laden, weil keine unterstützte Quelle gefunden wurde. Können Sie mir helfen?Capture Audio mit Naudio und spielen mit Javascript

private static void Recordwav() 
    { 
     waveInEvent = new WaveInEvent(); 
     int devicenum = 0; 
     for (int i = 0; i < WaveIn.DeviceCount; i++) 
     { 
      if (WaveIn.GetCapabilities(i).ProductName.Contains("icrophone")) 
       devicenum = i; 
     } 

     waveInEvent.DeviceNumber = devicenum; 
     waveInEvent.WaveFormat = new WaveFormat(44100, WaveIn.GetCapabilities(devicenum).Channels); 
     waveInEvent.DataAvailable += new EventHandler<WaveInEventArgs>(VoiceDataAvailable); 

     waveInEvent.StartRecording(); 
    } 

private static void VoiceDataAvailable(object sender, WaveInEventArgs e) 
    { 
     JObject jObject = new JObject(); 
     jObject["voice"] = Convert.ToBase64String(e.Buffer); 

     byte[] messageByte = Encoding.ASCII.GetBytes(jObject.ToString().Replace("\r\n", "") + "\n"); 
     socket.Send(messageByte); 
    } 

$scope.socket.onmessage = function (response) 
{ 
    var data = JSON.parse(response.data); 
    if(data.id == $scope.id) { 
     if(data.voice) { 
      var voice = data.voice; 
      var sound = new Audio("data:audio/wav;base64," + voice); 
      sound.play(); 
     } 
    } 
}; 

Antwort

0

Sie senden nur rohe Samples, nicht eine richtig formatierte WAV-Datei. Sie müssten WaveFileWriter verwenden, um in eine MemoryStream (in eine IgnoreDisposeStream verpackt) zu schreiben, die WaveFileWriter zu entsorgen und dann auf das MemoryStream zugrundeliegende Bytearray zuzugreifen. Auch Sie berücksichtigen nicht BytesRecorded.

Selbst wenn Sie das funktionieren, vermute ich, dass Sie sehr abgehackten Audio bekommen, da jede WAV-Datei ein paar hundert ms sein wird, und sie nicht unbedingt perfekt nacheinander abgespielt werden.