我想通过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是正确的。你想指定浮动(不知道这个标志是什么)。无法解释速度增加我减少,虽然 - 这很奇怪 –