2017-02-19 102 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