使用Naudio播放文件时检测当前音量 [英] Detect current volume level while a file is playing using 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屋!