0

ので、私は持っています

    IWavePlayer waveOutDevice;
    WaveStream mainOutputStream;
    WaveChannel32 volumeStream;

    private WaveStream CreateInputStream(string fileName)
    {
        WaveChannel32 inputStream;
        if (fileName.EndsWith(".mp3"))
        {
            WaveStream mp3Reader = new Mp3FileReader(fileName);
            inputStream = new WaveChannel32(mp3Reader);
        }
        else
        {
            throw new InvalidOperationException("Unsupported extension");
        }
        volumeStream = inputStream;
        return volumeStream;
    }

    private void Stop()
    {
        if (waveOutDevice != null)
        {
            waveOutDevice.Stop();
        }
        if (mainOutputStream != null)
        {
            // this one really closes the file and ACM conversion
            volumeStream.Close();
            volumeStream = null;
            // this one does the metering stream
            mainOutputStream.Close();
            mainOutputStream = null;
        }
        if (waveOutDevice != null)
        {
            waveOutDevice.Dispose();
            waveOutDevice = null;
        }
    }

    private void Play(string was)
    {
        waveOutDevice = new WaveOut();
        mainOutputStream = CreateInputStream(was);
        waveOutDevice.Init(mainOutputStream);
        waveOutDevice.Play();

    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Play(@"E:\Eigene Audiodateien\Musik\Alben\Pur\Abenteuerland\ -  - .mp3");
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Stop();
    }

再生を停止する停止ボタン(button1)があります。フォームが読み込まれると、ファイルが再生されます。ファイルの再生中に、関数を実行してファイルの現在のボリュームを取得したいと思います。では、このような関数は「....」でどのように見える必要がありますか?

private int currentVolumeLevel(...some suitable parameters...)
{
  int currentVolumeLevelValue = 0;
  //....
  return currentVolumeLevelValue;
}

Windowsのサウンドコントロールで調整できる音量レベルについては話していません。byte []配列のようなものに基づいて、現在再生中のこの位置で現在再生されているサウンドファイルの音量について話します。

4

1 に答える 1

1

NAudioDemoは、これを行う方法を示しています。aが再生パイプラインにAudioPlaybackPanel.csどのように追加されるかを見てください。定期的にイベントを発生させ、過去100ミリ秒に受信した最大サンプル値を通知します(これは構成可能です)。ソフトウェアのボリューム調整の前と後のどちらを配置するかを決定する必要があります(波形描画の場合は通常前で、ボリュームメータリングの場合は通常後です)MeteringSampleProviderMeteringSampleProviderStreamVolumeMeteringSampleProvider

これが動作するWindowsFormsデモで、ストリームボリュームをコンソールに書き込みます。

var player = new WaveOut();
var file = new AudioFileReader(@"test.mp3");
var meter = new MeteringSampleProvider(file);
meter.StreamVolume += (s,e) => Console.WriteLine("{0} - {1}", e.MaxSampleValues[0],e.MaxSampleValues[1]);
player.Init(new SampleToWaveProvider(meter));

var form = new Form();
form.Load += (s,e) => player.Play();
form.FormClosed += (s,e) => player.Dispose();
form.ShowDialog();
于 2012-10-31T07:34:37.223 に答える