2013-04-13 129 views
1

我试图在同一时间播放多个声音。但有时候,声音只是停止播放,或根本不会开始播放。AVFoundation.AVAudioPlayer随机停止

我有临危时的声音效果应该发挥了事件的事件处理程序:

void HandlePlaySound (object sender, EventArgs e) 
    { 
     this.InvokeOnMainThread (()=>{ 
      ... 
      [set url to path] 
      ... 
      MonoTouch.AVFoundation.AVAudioPlayer player = MonoTouch.AVFoundation.AVAudioPlayer.FromUrl(url); 
      player.Play(); 
     }); 
    } 

也能正常工作的大部分时间,但是当两个声音同时它被触发似乎是其中之一将被杀死或两者兼而有之。我必须在这里做一些非常错误的事情。

在iPhone应用程序中播放声音是否更正确?每个声音应该播放直到结束,并且可能同时播放多个声音。

回答

2

如果我猜测,我会说有时GC会进来并且放置已经超出范围的玩家,导致您的随机停止行为。我发现了一个稳定的解决方案是首先建立很多的同步音频流,怎么你最好喜欢到能够发挥,然后执行这些规则:

// I'd like a maximum of 5 simultaneous audio streams 
    Queue<AVAudioPlayer> players = new Queue<AVAudioPlayer>(5); 

    void PlayAudio (string fileName) 
    { 
     NSUrl url = NSUrl.FromFilename(fileName); 
     AVAudioPlayer player = AVAudioPlayer.FromUrl(url); 

     if (players.Count == 5) { 
      players.Dequeue().Dispose(); 
     } 
     players.Enqueue(player); 
     player.Play(); 
    } 

    // In my example, I'll select files from my Sounds folder (containing a couple of .wav, a couple of .mp3 and an .aif) 
    string[] files; 
    int fileIndex = 0; 

    string GetNextFileName() 
    { 
     if (files == null) 
      files = Directory.GetFiles("Sounds"); 

     if (fileIndex == files.Length) 
      fileIndex = 0; 
     return files[fileIndex++]; 
    } 

    partial void OnPlayButtonTapped (NSObject sender) 
    { 
     string fileName = GetNextFileName(); 
     PlayAudio(fileName); 
    }  
+0

感谢萨米!这实际上导致我找到了解决方案。这可能是GC。 –

+0

@Sami Lamti:这里有些不对劲。你没有对你打开阅读的wave文件做任何事情。 – henon

+0

好眼睛@henon;谢谢!我更新了代码示例:) –