iPhone - 同时启动AVAudioPlayer的多个实例

时间:2009-11-06 13:33:04

标签: iphone avaudioplayer

我正在使用多个AVAudioPlayer实例同时播放多个音频文件。我运行一个循环来开始播放音频文件(预先调用prepareToPlay,循环只调用play方法)

但总是有一名球员没有同步进行比赛。如何确保所有4名玩家同时开始播放音频?

感谢。

4 个答案:

答案 0 :(得分:3)

Apple docs谈论如何“同时播放多个声音,每个音频播放器播放一个声音,精确同步”。也许您需要致电playAtTime:,例如[myAudioPlayer playAtTime: myAudioPlayer.deviceCurrentTime + playbackDelay];

事实上,Apple docs for playAtTime:包含以下代码段:

NSTimeInterval shortStartDelay = 0.01;            // seconds
NSTimeInterval now = player.deviceCurrentTime;

[player       playAtTime: now + shortStartDelay];
[secondPlayer playAtTime: now + shortStartDelay];

它们应该同时播放(假设你为shortStartDelay选择了一个足够大的值 - 不会很快就会在这个线程返回之前发生或等等。)

答案 1 :(得分:2)

不幸的是,你做不到。 AVAudioPlayer不提供任何机制来细粒度控制开始时间。 currentTime属性设置要读取的文件中的点,它不保证AVAudioPlayer实例何时开始在系统时间播放,这是您需要同步多个音频流。

当我需要这种行为时,我使用RemoteIO Audio Unit + 3D Mixer Audio Unit + ExtAudioFile。

修改

请注意,从iOS 4开始,您可以使用AVAudioPlayer

同步多个playAtTime:个实例

答案 2 :(得分:1)

我的此代码段允许您执行此操作,只要您不必立即执行此操作即可。您可以将targetTime作为时间戳传递给您想要听到声音的时间。诀窍是利用时间戳和NSObject的延迟功能。此外,它利用了这样一个事实,即改变播放器音量的时间比改变当前时间的时间要少。应该几乎完全正确地工作。

- (void) moveTrackPlayerTo:(double) timeInSong atTime:(double) targetTime {
 [trackPlayer play];
 trackPlayer.volume = 0;

 double timeOrig = CFAbsoluteTimeGetCurrent();
 double delay = targetTime - CFAbsoluteTimeGetCurrent();
 [self performSelector:@selector(volumeTo:) 
      withObject:[NSNumber numberWithFloat:single.GLTrackVolume] 
      afterDelay:delay];
 trackPlayer.currentTime = timeInSong - delay - (CFAbsoluteTimeGetCurrent() - timeOrig);
}

- (void) volumeTo:(NSNumber *) volNumb {
 trackPlayer.volume = [volNumb floatValue];
}

答案 3 :(得分:0)

尝试为每个AVAudioPlayer对象设置相同的 currentTime 属性值。