4

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();
4

1 に答える 1

3

から読んでいないmeteringSampleProviderので、イベントは発生しません。通常、これIWavePlayerが呼び出し元になりReadますが、オーディオを再生していない場合は、別の方法でパイプラインを介してオーディオをプルする必要があります。

于 2012-03-28T12:25:11.507 に答える