2017-02-19 2 views
1

Ich möchte Raw Audio von WASAPI Loopback von NAudio aufnehmen und Pipe zu FFmpeg für Streaming über Speicherströme. Von diesem document, kann FFmpeg Eingabe als Raw bekommen, aber ich habe Ergebnis Geschwindigkeit bei 8 ~ 10x! ist hier mein Code:Rohaudio von NAudio

waveInput = new WasapiLoopbackCapture(); 
waveInput.DataAvailable += new EventHandler<WaveInEventArgs>((object sender, WaveInEventArgs e) => 
{ 
    lock (e.Buffer) 
    { 
     if (waveInput == null) 
      return; 
     try 
     { 
      using (System.IO.MemoryStream memoryStream = new System.IO.MemoryStream()) 
      { 
       memoryStream.Write(e.Buffer, 0, e.Buffer.Length); 
       memoryStream.WriteTo(ffmpeg.StandardInput.BaseStream); 
      } 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 
}); 
waveInput.StartRecording(); 

FFmpeg Argumente:

ffmpegProcess.StartInfo.Arguments = String.Format("-f s16le -i pipe:0 -y output.wav"); 

1. Kann jemand bitte diese Situation erklären und eine Lösung geben Sie mir?
2. Sollte ich Wav-Header zum Speicher-Stream hinzufügen dann Pipe zu FFmpeg als Wav-Format?

Die Arbeitslösung

waveInput = new WasapiLoopbackCapture(); 
waveInput.DataAvailable += new EventHandler<WaveInEventArgs>((object sender, WaveInEventArgs e) => 
{ 
    lock (e.Buffer) 
    { 
     if (waveInput == null) 
      return; 
     try 
     { 
      using (System.IO.MemoryStream memoryStream = new System.IO.MemoryStream()) 
      { 
       memoryStream.Write(e.Buffer, 0, e.BytesRecorded); 
       memoryStream.WriteTo(ffmpeg.StandardInput.BaseStream); 
      } 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 
}); 
waveInput.StartRecording(); 

FFMpeg Argumente:

ffmpegProcess.StartInfo.Arguments = string.Format("-f f32le -ac 2 -ar 44.1k -i pipe:0 -c:a copy -y output.wav"); 

Antwort

0

sicherstellen, dass Sie die richtigen Wave Parameter FFMpeg passieren. Sie werden die FFmpeg documentation für Details dazu überprüfen. WASAPI Capture wird Stereo IEEE Float (32 Bit) und wahrscheinlich 44,1 kHz oder 48 kHz sein. Auch sollten Sie e.BytesRecorded nicht e.Buffer.Length verwenden.

+0

ich verwendet, um dieses '-f s32le -i Rohr: 0 -ar 44100 -ac 2 -sample_fmt s32 -c: a Kopieren Sie -y output.wav. aber bekam 2x Geschwindigkeit. Der FFMpeg sagte: Guested Channel Layout für Input Stream # 0.0: Mono. Stream # 0: 0: Audio: pcm_s32le, 44100 Hz, mono, s32, 1411 kb/s – Ken

+0

Ich habe das oben geändert zu: '-f s32le -ac 2 -ar 44100 -i pipe: 0 -beispiel_fmt s32 -c: a kopiere -y output.wav' und erhielt das Ergebnis: Stereo und Geschwindigkeit von 3x auf 1x in den ersten 4 Minuten und 1x stetig weiter. Es brachte Interferenz und Rauschen in den gesamten Ton, aber ich konnte den Ton erkennen. Was soll ich tun, um damit umzugehen? Ihre Informationen haben mir sehr geholfen. Vielen Dank. – Ken

+0

Ich glaube nicht, dass S32 richtig ist. Sie möchten float angeben (nicht sicher, wofür das Flag steht). Ich kann die Geschwindigkeitszunahme nicht erklären, aber ich nehme ab - das ist sehr seltsam –

0

Die FFmpeg rohen PCM-Audiodemuxer müssen mit der richtigen Anzahl an Kanälen (-channels, Standardwert ist 1) und der Abtastrate (-sample_rate, Standardwert ist 44100) geliefert werden.

Die Reihenfolge der Optionen ist wichtig: Optionen unmittelbar vor der Eingabe werden auf die Eingabe angewendet und Optionen unmittelbar vor der Ausgabe werden auf die Ausgabe angewendet.

ffmpeg cli Beispiel:

ffmpeg -f s32le -channels 2 -sample_rate 44100 -i pipe:0 -c copy output.wav 

Ihr Codebeispiel:

ffmpegProcess.StartInfo.Arguments = String.Format("-y -f s32le -channels 2 -sample_rate 44100 -i pipe:0 -c copy output.wav"); 
+0

Ich tat das nur etwa 30 Minuten vor Ihrer Antwort, schätzen Sie Ihre Hilfe. Aber mein nächstes Problem ist der Ausgang Audio ist nicht klar. Es hat eine Menge Störungen und Geräusche. – Ken

Verwandte Themen