C# 使用SoundEffect同时播放音频片段时出现延迟

C# 使用SoundEffect同时播放音频片段时出现延迟,c#,windows,windows-phone-7,xna,C#,Windows,Windows Phone 7,Xna,我正在使用Windows Phone应用程序,遇到以下问题。我有一个用于背景音乐的循环.Wav文件,可以打开或关闭。按下按钮可播放其他音效(如Sound1)。当背景音乐关闭时,音效可以正常播放。但是,当背景音乐打开时,按钮按下和声音效果之间会有轻微的(但非常明显的)延迟。我可以通过编程来避免这种情况吗?根据MSDN网站上的建议,我设置了一个调度程序来调用FrameworkDispatcher。每50毫秒更新一次。但是,这似乎没有太大帮助。。。我已经在下面粘贴了一些代码。我还能做些什么来消除这种滞

我正在使用Windows Phone应用程序,遇到以下问题。我有一个用于背景音乐的循环.Wav文件,可以打开或关闭。按下按钮可播放其他音效(如Sound1)。当背景音乐关闭时,音效可以正常播放。但是,当背景音乐打开时,按钮按下和声音效果之间会有轻微的(但非常明显的)延迟。我可以通过编程来避免这种情况吗?根据MSDN网站上的建议,我设置了一个调度程序来调用FrameworkDispatcher。每50毫秒更新一次。但是,这似乎没有太大帮助。。。我已经在下面粘贴了一些代码。我还能做些什么来消除这种滞后现象吗

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


    }



}

}

预加载SoundEffect,这样您就不会从FromStream()获得延迟。不过,这对电话并不友好。

我长期以来一直持有一种理论,认为有一个基本问题使得同步视频和音频成为一种近似练习。。我很想知道是否有人知道..你是如何预加载SoundEffect的?另外,为什么这不是电话友好型的?要预加载,请在初始化期间调用FromStream,并将效果保存在字典或类似文件中。但是,这会将所有声音保留在内存中,这在手机应用程序中可能会很昂贵。您可以通过将语句移动到构造函数来预加载声音效果,以便在需要时加载声音效果。它对手机不友好,因为它是一个资源非常有限的设备。当您在需要资源时加载资源时,它工作得更好。找到合适的平衡点是程序员的工作。@Kyte我也有类似的要求,我希望整个应用程序都有一个共同的氛围/背景音乐,再加上图像点击时的其他声音。根据认证文件“SoundEffect类不得用于在应用程序中播放连续的背景音乐曲目”,那么您的应用程序是否通过了认证?在其中一个示例代码中,他们使用MediaElement作为连续的背景音频。有什么建议吗?@oms好吧,我还没有实际制作过应用程序,所以我当然没有什么需要证明的,但我也不会在背景音乐中使用SoundEffect。一种可能是使用Song&MediaPlayer类,后者可以设置为自动重复加载到其中的任何歌曲。