一次打开大量的AVAudioPlayers?

Posted

技术标签:

【中文标题】一次打开大量的AVAudioPlayers?【英文标题】:Open a large number of AVAudioPlayers at once? 【发布时间】:2013-02-11 13:39:12 【问题描述】:

假设我想使用 AVAudioPlayer 而不是 SystemSound 来控制 AVAudioPlayer 提供的 SystemSound 不提供的音量控制。

对于 AVAudioPlayer,我可以同时打开的播放器数量似乎是有限的。您会在我的示例项目的代码中注意到,当我创建一个包含 200 个 AVAudioPlayer 的列表时,它工作得很好。但是当我将该数字增加到 300 时,它会因错误而崩溃。我唯一的结论是我可以创建一定数量的玩家。是这样吗?有什么方法可以创建更多玩家而不会崩溃?

    AVAudioPlayer player;
    NSUrl mediaFile;
    List<AVAudioPlayer> playerList;



    DateTime before = DateTime.Now;
    mediaFile = NSUrl.FromFilename("mySoundConvertedToCAF.caf");
    player = AVAudioPlayer.FromUrl(mediaFile);
    player.Delegate = new AVAudioPlayerDelegate();
    Console.WriteLine("total ms = " + DateTime.Now.Subtract (before).TotalMilliseconds);


    playerList = new List<AVAudioPlayer>();


    // For loop 200 times works
    // for ( int i = 0; i < 200; i++ )

    // For loop 300 times does NOT work.  Almost as if somewhere between 200 and 300 AVAudioPlayers is the max amount you can have open at once... Is it because all of them are accessing the same sound file?
    for ( int i = 0; i < 300; i++ )
    
        playerList.Add (AVAudioPlayer.FromUrl(mediaFile));
        playerList[i].Delegate = new AVAudioPlayerDelegate();
    

    Console.WriteLine("I made a list of " + playerList.Count() + " AVAudioPlayers!");


    playerList[0].Play();

    Thread.Sleep(500);

    playerList[1].Play();

至于我为什么要这样做,它是为了 ios 游戏引擎的工作......我不是一次播放数百个声音,但我希望播放器打开,以便我可以在任何时间播放它们无需加载新的 AVAudioPlayer 或更改媒体文件....

【问题讨论】:

【参考方案1】:

我已经解决了这个问题。不要使用 NSURL 类型从音频文件中读取,而是使用 NSData 类型。而不是使用 AVAudioPlayer.FromUrl 函数导入,而是使用 AVAudioPlayer.FromData。这确实有大约 245 名玩家的限制。作为测试,我用 NSData 尝试了多达 6000 个 AVAudioPlayers,它们运行良好。

【讨论】:

以上是关于一次打开大量的AVAudioPlayers?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AVAudioPlayers 之间交叉淡入淡出

处理多个AVAudioPlayers的中断

使用 AVAudioPlayer 同时播放多个声音

如果已经在 J​​ava 中打开,如何关闭程序

关于j使用ava匿名类的好处总结

sql server 删除大量数据的一次坑爹之旅