private BuffereDWaveProvIDer buffer;private AsioOut input;private AsioOut output;private voID ListenBtn_Click(object sender,EventArgs e){ input = new AsioOut(RecordInCBox.Selectedindex); WaveFormat format = new WaveFormat(); buffer = new BuffereDWaveProvIDer(format); buffer.discardOnBufferOverflow = true; input.InitRecordAndplayback(buffer,1,44100); input.AudioAvailable += new EventHandler<AsioAudioAvailableEventArgs>(AudioAvailable); //output = new AsioOut(RecordInCBox.Selectedindex); //output.Init(buffer); input.Play(); //output.Play();}public voID AudioAvailable(object sender,AsioAudioAvailableEventArgs e){ byte[] buf = new byte[e.SamplesPerBuffer]; e.WrittenToOutputBuffers = true; for (int i = 0; i < e.inputBuffers.Length; i++) { Array.copy(e.inputBuffers,e.OutputBuffers,1); Marshal.copy(e.inputBuffers[i],buf,e.SamplesPerBuffer); buffer.AddSamples(buf,buf.Length); }}
目前它正在获取音频并将其推入缓冲区但输出无效.如果我将录制设置设置为在窗口上监听,我可以让它d吉他但是我觉得这是不必要的,因为我希望能够执行失真并将其视为输出.谢谢!
解决方法 您不需要在缓冲区中添加样本.缓冲区仅用于确定所需的输出通道数.我这样做了:
[Dllimport("Kernel32.dll",EntryPoint = "RtlMoveMemory",SetLastError = false)]private static unsafe extern voID MoveMemory(IntPtr dest,IntPtr src,int size);private voID OnAudioAvailable(object sender,AsioAudioAvailableEventArgs e) { for (int i = 0; i < e.inputBuffers.Length; i++) { MoveMemory(e.OutputBuffers[i],e.inputBuffers[i],e.SamplesPerBuffer * e.inputBuffers.Length); } e.WrittenToOutputBuffers = true; }
但这样做会感觉有点延迟和一点回声,我不知道如何解决它们.所以,如果你有任何想法我会在这里听.
总结以上是内存溢出为你收集整理的c# – NAudio:使用ASIO用吉他录制音频和输出全部内容,希望文章能够帮你解决c# – NAudio:使用ASIO用吉他录制音频和输出所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)