C# 使用Naudio播放文件时检测当前音量
所以我有C# 使用Naudio播放文件时检测当前音量,c#,c#-4.0,naudio,C#,C# 4.0,Naudio,所以我有 IWavePlayer waveOutDevice; WaveStream mainOutputStream; WaveChannel32 volumeStream; private WaveStream CreateInputStream(string fileName) { WaveChannel32 inputStream; if (fileName.EndsWith(".mp3")) {
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),用于停止播放。加载表单时,将播放文件。当文件播放时,我想通过运行函数获取文件的当前卷。那么像这样的函数在“…”上应该是什么样的呢
我不是说你可以用windows的声音控制来调节音量。我指的是当前播放的声音文件在当前播放位置的音量,它是基于字节[]数组之类的内容。NAudioDemo演示了如何执行此操作。在
AudioPlaybackPanel.cs
中查看如何将MeteringSampleProvider
添加到播放管道中MeteringSampleProvider
将定期引发StreamVolume
事件,告知您在过去100毫秒内收到的最大采样值(这是可配置的)。您需要决定是否要在任何软件音量调整之前或之后放置MeteringSampleProvider
(对于波形绘制,通常在之前,对于音量测量,通常在之后)
下面是一个正在工作的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();
我根据您的回复创建了,但表单标题没有更改,即您的事件没有触发。您没有通过计量样本提供程序获取任何内容。我将用一个简短的演示更新我的答案
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();