2014-10-31 138 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();