我正在使用多个AVAudioPlayer实例同时播放多个音频文件。我运行一个循环来开始播放音频文件(预先调用prepareToPlay,循环只调用play方法)
但总是有一名球员没有同步进行比赛。如何确保所有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 属性值。