2012-10-30 48 views
0

玩所以我檢測當前的音量級別,而一個文件使用n音訊

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

有一個停止 - 按鈕(按鈕1),其中停止播放。當表單被加載時,文件被播放。在播放文件時,我想通過運行一個函數來獲取文件的當前音量。那麼像這樣的函數在「....」中看起來像什麼呢?

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

我不是在談論音量級別,你可以使用windows的聲音控制進行調整。我正在討論當前播放的聲音文件的音量,它基於像byte []數組這樣的東西。

回答

1

NAudioDemo顯示瞭如何做到這一點。在AudioPlaybackPanel.cs中查看如何將MeteringSampleProvider添加到回放管道。 MeteringSampleProvider將週期性地提示StreamVolume事件,告訴您在過去的100ms內收到的最大樣本值(這是可配置的)。您需要決定是否在任何軟件音量調整之前或之後放置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(); 
+0

我在您的回覆中創建了http://pastebin.com/AsctdcGU,但表單標題沒有變化,即您的事件不會觸發。 –

+0

你沒有通過計量樣本提供程序拉取任何東西。我會用簡短的​​演示更新我的答案 –