2011-04-23 109 views
2

我正在使用Windows Phone应用程序,并遇到以下问题。我有一个可以打开或关闭背景音乐的循环.Wav文件。附加声音效果(例如Sound1)可以在按下按钮时播放。当背景音乐关闭时,音效效果会很好。但是,当背景音乐开启时,按钮按下和音效之间会有轻微的(但非常明显的)延迟。有什么我可以编程方式来避免这种情况?根据MSDN网站http://msdn.microsoft.com/en-us/library/ff431744%28v=vs.92%29.aspx的建议,我设置了一个dispatcherTimer来每50ms调用一次FrameworkDispatcher.Update。但是,这似乎没有太多帮助...我已经粘贴了一些我的代码。还有什么我可以做的,以摆脱这种滞后?使用SoundEffect播放同步音频片段时出现延迟

public partial class Modules : PhoneApplicationPage 
{ 
    static SoundEffectInstance loopedSound = null; 
    static SoundEffectInstance sound1=null; 
    double pitchValue = 4.0; 
    static double pitchAdjust = 0.0; 

    public Modules() 
    { 
     InitializeComponent(); 

     // Timer to simulate the XNA game loop (SoundEffect classes are from the XNA Framework) 
     DispatcherTimer XnaDispatchTimer = new DispatcherTimer(); 
     XnaDispatchTimer.Interval = TimeSpan.FromMilliseconds(50); 
     XnaDispatchTimer.Tick += delegate { try { FrameworkDispatcher.Update(); } catch { } }; 
     XnaDispatchTimer.Start(); 
    } 



    private void playButton_Click(object sender, RoutedEventArgs e) 
    { 
     if (loopedSound!=null) 
      loopedSound.Dispose(); 
     SoundEffect sound = SoundEffect.FromStream(Application.GetResourceStream(new Uri(@"BackgroundSound.wav", UriKind.Relative)).Stream); 
     LoopClip(sound); 

    } 

    private void stopButton_Click(object sender, RoutedEventArgs e) 
    { 
     loopedSound.Stop(); 
    } 

    static protected void LoopClip(SoundEffect soundEffect) 
    { 
     loopedSound = soundEffect.CreateInstance(); 
     loopedSound.IsLooped = true; 
     loopedSound.Pitch = (float) pitchAdjust; 
     loopedSound.Play(); 
    } 

    static protected void sound1Clip(SoundEffect soundEffect) 
    { 
     sound1 = soundEffect.CreateInstance(); 
     sound1.IsLooped = false; 
     sound1.Play(); 
    } 


    private void Sound1Button_Click(object sender, RoutedEventArgs e) 
    { 
     if (sound1 == null) 
     { 
      SoundEffect sound = SoundEffect.FromStream(Application.GetResourceStream(new Uri(@"sound1.wav", UriKind.Relative)).Stream); 
      sound1Clip(sound); 
     } 
     if (sound1 != null) 
     { 

      sound1.Play(); 
     } 


    } 



} 

}

+0

我一直认为,有一个基本问题,使同步视频和音频近似练习..我会有兴趣,看看有人知道.. – 2011-04-23 20:59:39

回答

2

预加载SoundEffect中,这样你就不会得到FromStream延迟()。但这不是非常方便电话。

+0

如何预加载SoundEffect?另外,为什么这不是电话友好? – sv77 2011-04-23 21:06:10

+0

要进行预加载,请在初始化期间调用FromStream,并将效果保存在Dictionary或类似内容中。但是,这会保留所有的声音,这可能会在手机应用程序中变得昂贵。 – Kyte 2011-04-23 21:18:15

+1

您可以通过将语句移动到构造函数来预载它,以便在您需要时加载SoundEffect。这不是电话友好的,因为它是一个非常资源受限的设备。当您需要时加载资源时它会更好地工作。寻找合适的平衡是程序员的工作。 – 2011-04-23 22:05:38