使用Naudio播放文件时检测当前音量 [英] Detect current volume level while a file is playing using Naudio

查看:2801
本文介绍了使用Naudio播放文件时检测当前音量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我有

    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),停止播放。加载表单时,将播放文件。当文件正在播放我想通过运行一个函数获取文件的当前卷。那么这样的函数看起来像....?

There is a Stop-Button ( button1 ), which stops playback. When the form is loaded, the file is played. While the file is playing I want to get the current volume of the file by running a function. So what does a function like this has to look like at "...."?

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

我不在说你可以用windows声音控制调整的音量中。

I am not talking about the volume level you can adjust with windows' sound controls. I am talking about the currently played sound file's volume at this very position it is playing right now, based on something like a byte[] array.

推荐答案

NAudioDemo显示如何做到这一点。在 AudioPlaybackPanel.cs 中查看如何将 MeteringSampleProvider 添加到播放管道。 MeteringSampleProvider 将定期提出 StreamVolume 事件,告诉您在最近100ms内收到的最大样本值(这是可配置的)中。您将需要决定是否要在任何软件音量调整之前或之后放置 MeteringSampleProvider (对于通常之前的波形绘图,以及通常是之后的音量测量)

The NAudioDemo shows how to do this. Look in AudioPlaybackPanel.cs at how a MeteringSampleProvider is added to the playback pipeline. MeteringSampleProvider will periodically raise StreamVolume events telling you the maximum sample value you have received in the last 100ms (this is configurable). You will need to decide whether you want to place the MeteringSampleProvider before or after any software volume adjustment (for waveform drawing it is usually before, and for volume metering it is usually after)

这是一个有效的WindowsForms演示,将流量写入控制台:

Here's a working WindowsForms demo, writing the stream volume to the Console:

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

这篇关于使用Naudio播放文件时检测当前音量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆