我想通過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");
我用這個'-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
我將上面的內容更改爲:-f s32le -ac 2 -ar 44100 -i pipe:0 -sample_fmt s32 -c:a copy -y output.wav「,得到的結果是:立體聲和速度在前4分鐘內從3倍降至1倍,並且持續1倍。它在整個音頻中帶來了干擾和噪音,但我可以識別出聲音。我該怎麼做才能解決這個問題?你的信息幫了我很多。謝謝。 – Ken
我不認爲s32是正確的。你想指定浮動(不知道這個標誌是什麼)。無法解釋速度增加我減少,雖然 - 這很奇怪 –