【问题标题】:Lag when playing simultaneous audio clips with SoundEffect使用音效同时播放音频剪辑时出现延迟
【发布时间】:2011-04-24 04:56:20
【问题描述】:

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

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


    }



}

}

【问题讨论】:

  • 我长期以来一直持有一个理论,即有一个基本问题使得同步视频和音频成为一种近似练习..我很想看看是否有人知道..

标签: c# windows windows-phone-7 xna


【解决方案1】:

预加载 SoundEffect,这样您就不会从 FromStream() 中得到延迟。然而,这对电话不太友好。

【讨论】:

  • 如何预加载 SoundEffect?另外,为什么这对手机不友好?
  • 要预加载,在初始化期间调用FromStream,并将效果保存在字典或类似文件中。但是,这会将所有声音保存在内存中,这在手机应用中可能会变得很昂贵。
  • 您通过将语句移动到构造函数来预加载它,以便在您需要的时候加载 SoundEffect。它对电话不友好,因为它是一种资源非常有限的设备。当您在需要时加载资源时,它会更好地工作。找到适当的平衡是程序员的工作。
  • @Kyte 我有完全相同的要求,我想为整个应用程序提供共同的氛围/背景音乐以及图像点击时的其他声音。根据认证文件“SoundEffect 类不得用于在应用程序中播放连续的背景音乐曲目”那么您的应用程序是否通过了认证?在其中一个示例代码中,他们将 MediaElement 用于连续的背景音频。有什么建议吗?
  • @oms 好吧,我实际上还没有制作应用程序,所以我自然没有什么要证明的,但我也不会将 SoundEffect 用于背景音乐。一种可能性是使用 Song 和 MediaPlayer 类,后者可以设置为自动重复您加载的任何歌曲。
猜你喜欢
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多