0

假设我想使用 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 或正在更改的媒体文件....

4

1 回答 1

0

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

于 2013-02-11T13:39:12.730 回答