2014-10-31 64 views
1

我想讓音頻靜音一定的時間,比如說從開始到播放持續時間爲2秒後,持續2秒。使音頻靜音一定時間

我想爲50個不同的音頻文件做不同的開始和停止時間來屏蔽。目前,我使用兩個System.Timer類的對象與第一次的時間間隔是爲靜音開始時間的第二個是停止時間,和我有50項if條款來檢查50個特刊,並設置其啓動,並相應地停止計時器是這樣的:

//50 checks 

    AudioFileReader ar; 
    Timer start_timer = new Timer(),stop_timer=new Timer(); 

    public Form1() 
    { 
     InitializeComponent(); 
     ar = new AudioFileReader(@"D:\SampleDegradedSpeech.wav"); 

     var a = new WaveOut(); 

     a.Init(ar); 

     a.Play(); 

     start_timer.Interval = //start time; 
     stop_timer.Interval = //stop time; 

     start_timer.Tick += t1_Tick; 
     start_timer.Start(); 

     stop_timer.Tick+=t2_Tick; 
     stop_timer.Start(); 
    } 

    private void t2_Tick(object sender, EventArgs e) 
    { 
     ar.Volume = 1; 
     stop_timer.Stop(); 
    } 

    private void t1_Tick(object sender, EventArgs e) 
    { 
     ar.Volume = 0; 
     start_timer.Stop(); 
    } 

有沒有其他的/更好的方法呢? 兩個定時器的任何替代品? 類似ar.mute(start,stop)

+0

等待,你認真有50個獨立的音頻播放器?和50個單獨的塊?還是我完全誤解? – furkle 2014-10-31 05:29:39

+0

我正在爲每個音頻創建一個AudioFileReader類的新對象,如下所示: var obj = new AudioFileReader(string track); 此曲目即將作爲我的方法的參數輸入。 而目前它是50個開關盒,因爲我不知道開關盒是更好還是更高效的,或者是陣列創建,就內存消耗和時間消耗而言。 對不起,我是一個新手:( – Chuker 2014-10-31 07:16:36

+0

不,這沒有錯,它不是一個批評,我真的無法想象我需要50個音頻剪輯同時播放的情況。如果沒有其他人知道我明天會不會看到這個, – furkle 2014-10-31 07:18:35

回答

0

您可以編寫自己的IWaveProvider的實現,它包裝您的WaveSource以在底層流到達該時間點時在Read方法中將採樣字節設置爲0。到達靜音期結束時停止更改字節數組。

的簡單實現的,這是這個MutingReader

private class MutingReader : IWaveProvider 
{ 
    private TimeSpan _start; 
    private TimeSpan _end; 
    private WaveStream _stream; 

    // constructor 
    public MutingReader(WaveStream stream, TimeSpan start, TimeSpan end) 
    { 
     _stream = stream; 
     _start = start; 
     _end = end; 
    } 

    // gets called each time the WaveOut needs more bytes 
    public int Read(byte[] array, int offset, int count) 
    { 
     Debug.WriteLine(_stream.CurrentTime); 
     var samples = _stream.Read(array, offset, count); 
     // if we are between our Start and End Time stamps 
     if (_stream.CurrentTime > _start && 
      _stream.CurrentTime < _end) 
     { 
      // silence by only returning zeroes in the array 
      for (int i = 0; i < count; i++) 
      { 
       array[i + offset] = 0; 
      } 
     } 
     return samples; 
    } 

    #region IWaveProvider Members 
    public WaveFormat WaveFormat 
    { 
     get { return _stream.WaveFormat; } 
    } 
    #endregion 
} 

您可以使用上面的實現如下:

var wo = new NAudio.Wave.WaveOutEvent(); 
var reader = new MutingReader(
     new WaveFileReader(@"v1.wav"), 
     new TimeSpan(0,0,2), // mute after 2 seconds 
     new TimeSpan(0,0,4)); // unmute after 4 seconds 
wo.Init(reader); 
wo.Play();