2017-02-19 100 views
1

我想通過NAudio錄製來自WASAPI環回的原始音頻,並通過存儲流管道傳輸到FFmpeg進行流式傳輸。從這個document,FFmpeg可以得到原始輸入然而,我得到的結果速度在8〜10x! 這裏是我的代碼: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的參數:

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

1.可有人請解釋這種情況,並給我一個解決方案嗎?
2.我應該添加Wav頭到內存流然後管道FFmpeg爲Wav格式?

工作方案

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的參數:

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

回答

0

確保您傳遞正確的WAVEFORMAT參數FFmpeg的。您需要查看FFmpeg documentation瞭解詳情。 WASAPI捕獲將是立體聲IEEE浮點(32位),可能是44.1kHz或48kHz。你也應該使用e.BytesRecorded而不是e.Buffer.Length

+0

我用這個'-f s32le -i管:0 -ar 44100 -ac 2 -sample_fmt S32 -c:一個複製-y output.wav'。但速度提高了2倍。 FFMpeg表示:輸入流#0.0的猜測通道佈局:單聲道。 Stream#0:0:Audio:pcm_s32le,44100 Hz,mono,s32,1411 kb/s – Ken

+0

我將上面的內容更改爲:-f s32le -ac 2 -ar 44100 -i pipe:0 -sample_fmt s32 -c:a copy -y output.wav「,得到的結果是:立體聲和速度在前4分鐘內從3倍降至1倍,並且持續1倍。它在整個音頻中帶來了干擾和噪音,但我可以識別出聲音。我該怎麼做才能解決這個問題?你的信息幫了我很多。謝謝。 – Ken

+0

我不認爲s32是正確的。你想指定浮動(不知道這個標誌是什麼)。無法解釋速度增加我減少,雖然 - 這很奇怪 –

0

FFmpeg原始PCM音頻分路器需要提供適當的通道數(-channels,默認值爲1)和採樣率(-sample_rate,默認值爲44100)。

選項的順序很重要:緊接在輸入應用於輸入之前的選項以及緊接在輸出應用於輸出之前的選項。

ffmpeg CLI例如:

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

您的代碼例如:

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

我在答案前30分鐘左右就做到了,感謝您的幫助。但我的下一個問題是輸出音頻不清晰。它有很多幹擾和噪音。 – Ken