(iphone)有很多AVAudioPlayer实例很好吗?

时间:2011-05-31 09:59:25

标签: iphone avaudioplayer

对于我的小游戏,我想为各种场景播放效果声 大多数情况下,它将与用户交互相关。

我可能需要一次播放多个声音。

我打算为每个声音分配AVAudioPlayer 我想知道一个有大约10-20个AVAudioPlayers的viewController很好 (声音数据本身相当小,aac中小于100k)

我只是觉得在一个类中声明10-20个AVAudioPlayer实例看起来很奇怪 是否有更好的方法,或者我只是过度思考它?

2 个答案:

答案 0 :(得分:0)

我认为OpenAL在这种情况下是更好的选择。不要担心,如果你不知道它。这里有一个很棒的视频教程(包含源代码):http://www.71squared.com/2009/05/iphone-game-programming-tutorial-9-sound-manager/

要查找更多信息,您可以访问: http://benbritten.com/2008/11/06/openal-sound-on-the-iphone/comment-page-1/

答案 1 :(得分:0)

是的,有很多AVAudioPlayer个实例可以。我不知道有多少限制,但它绝对是十几个。

以下是一些问题:

AVAudioPlayer没有进行电平混音,所以如果你的声音音量很大,它们最终可能会相互干扰并导致波形失真。我设置的最大音量为0.8,试图解决这个问题,但这不可靠。

如果您尝试同时启动它们,使用play方法最终可能会使它们不同步。相反,尽快找出用户不会注意到的时间,但距离足够远,以至于它会让您的代码有时间退出并AVFoundation时间准备好。然后使用[player playAtTime:soon]

以下是一些现在适合我的代码。 YMMV:

-(void)play
{
    BOOL success;

    AVAudioPlayer *player = self.player;

    player.numberOfLoops = -1;
    player.currentTime = 0;
    player.volume = _volume;

    // NSLog(@"deviceCurrentTime=%f", player.deviceCurrentTime);

    static double soon = 0;
    if (soon < player.deviceCurrentTime) {
        soon = player.deviceCurrentTime + 0.5; // why so flakey???
    }
    success = [player playAtTime:soon]; // too flakey for now

    if (!success) {
        NSLog(@"player %@ FAILED", player);
    } else {
        NSLog(@"player %@ %@ playing at: %f", player, [[player.url relativePath] lastPathComponent], soon);
    }
}

(我不确定我的“soon”var是否是线程安全的,你应该调整slop直到它适合你... 0.1对我来说太快了点或其他,所以我把它提升到0.5。)