NAudio MeteringSampleProvider 没有触发事件?

Posted

技术标签:

【中文标题】NAudio MeteringSampleProvider 没有触发事件?【英文标题】:NAudio MeteringSampleProvider not firing events? 【发布时间】:2012-03-28 01:38:22 【问题描述】:

从我看到的使用 NAudio 的 MeteringSampleProvider 更新 VolumeMeter 控件的所有示例中,我认为我的代码是正确的,但 MeteringSampleProvider 和 SampleChannel 的事件似乎永远不会触发。我正在同时写入一个 wav 文件,当我播放它时,录音工作正常。有什么想法吗?

IWaveIn wavStream;
WaveFileWriter wavWriter;
BufferedWaveProvider bufferedWaveProvider;
SampleChannel sampleChannel;
MeteringSampleProvider meteringSampleProvider;

wavStream = new WaveIn();
wavWriter = new WaveFileWriter(CurrentRecording.Filename, wavStream.WaveFormat);

wavStream.DataAvailable += new EventHandler<WaveInEventArgs>((s2, e2) =>

  //Add sample to the buffered provider
  bufferedWaveProvider.AddSamples(e2.Buffer, 0, e2.BytesRecorded);

  //************************************************************
  //EDIT: This is how I solved the issue!!!      
  var tmpBuffer = new float[e2.BytesRecorded];
  if (meteringSampleProvider != null)
    meteringSampleProvider.Read(tmpBuffer, 0, e2.BytesRecorded);
  //END EDIT
  //************************************************************

  //Write to the wave file
  wavWriter.Write(e2.Buffer, 0, e2.BytesRecorded);  
);

//Create our Buffered provider
bufferedWaveProvider = new BufferedWaveProvider(wavStream.WaveFormat);
bufferedWaveProvider.DiscardOnBufferOverflow = true;

//Create the sample channel
sampleChannel = new SampleChannel(bufferedWaveProvider);
sampleChannel.PreVolumeMeter += new EventHandler<StreamVolumeEventArgs>((s2, e2) =>

  Console.WriteLine("PreVolumeMeter");
);

//Create the metering sample provider
meteringSampleProvider = new MeteringSampleProvider(sampleChannel);
meteringSampleProvider.StreamVolume += new EventHandler<StreamVolumeEventArgs>((s2, e2) =>

  Console.WriteLine("PostVolumeMeter");
);


//Start Recording
wavStream.StartRecording();

【问题讨论】:

【参考方案1】:

您不是在阅读meteringSampleProvider,因此不会引发任何事件。通常,这当然是调用 ReadIWavePlayer,但如果您不播放音频,则需要通过其他方式将音频拉入管道。

【讨论】:

关于如何执行此操作的任何建议?我只想获取 WaveIn() 上的计量信息...我似乎无法在任何样本中找到执行此操作的方法(它们都显示来自 WaveFileReader 的计量) 所以我的解决方案是简单地在我的 MeteringSampleProvider 上调用 .Read 在我向其添加样本后,在原始 WaveIn 流的 DataAvailable 回调中。这样,我总是会读出放入示例提供程序的确切数据,这会导致我的事件触发。数据只是进入一个从未使用过的缓冲区,所以它可能不是最好的方法,但它确实有效!感谢您的帮助!

以上是关于NAudio MeteringSampleProvider 没有触发事件?的主要内容,如果未能解决你的问题,请参考以下文章

NAudio 的问题

NAudio 演示不再工作

NAudio:正确使用 MixingSampleProvider 和 VolumeSampleProvider

NAudio 和 Midi 文件读取

来自流的NAudio?播放音频

NAudio,Windows服务,多线程