我做的是涉及多磁道格式(鼓,主唱,吉他,钢琴等)播放歌曲的应用程序。 我不需要做任何特殊的音频处理每首曲目,都是我需要能够做的是播放,暂停和静音/取消静音每个轨道。
我一直在使用AVAudioPlayer的多个实例,但执行设备测试的时候,我注意到,轨道非常轻微打不同步时,他们首先播放。 此外,当我暂停和播放他们继续获得更多的不同步的轨道。 一些研究之后,我已经意识到,AVAudioplayer只是有太多的等待时间,也不会为我的应用程序。
在我的应用程序基本上是通过有一个NSArray AVAudioPlayers的,我会循环,发挥每一个或暂停/停止各一个,我敢肯定,这是什么原因造成它不同步的设备上。
这似乎是苹果的音频混合器会为我工作得很好,但是当我尝试实施它,我感到我无法找出一个EXC_BAD_ACCESS错误。
我知道答案是使用OpenAL的或音频单元,但它只是似乎没有必要花费数周时间学习这些,当所有我需要做的是在同一时间玩.MP3 5曲目。 有没有人对如何做到这一点有什么建议? 谢谢
由于admsyn的建议我能拿出一个解决方案。
AVAudioPlayer有一个返回轨道的当前时间,也可以设置currentTime属性。
所以,我实现了startSynchronizedPlayback由admsyn陈述,然后添加以下时,我停止了轨道:
-(void) stopAll
{
int count = [tracksArr count];
for(int i = 0; i < count; i++)
{
trackModel = [tracksArr objectAtIndex:i]
if(i = 0)
{
currentTime = [trackModel currentTime]
}
[trackModel stop]
[trackModel setCurrentTime:currentTime]
}
{
此代码基本上都是通过我的每个守住自己AVAudioPlayer轨道阵列循环,抓住从第一轨道的当前时间,然后将下面所有的轨道到了那个时候的。 现在,当我使用startSynchronizedPlayback方法都同步播放和暂停取消暂停让他们同步为好。 希望这有助于别人试图保持轨道同步。
如果你发行个人play
的消息给每个AVAudioPlayer,这是完全可能的消息是在不同时间到达,或者说,AVAudioPlayers完成他们的预热阶段不同步对方。 你应该用playAtTime:和deviceCurrentTime属性来实现正确的同步。 注意deviceCurrentTime的描述:
使用此属性来表示“现在”调用playAtTime时:实例方法。 通过配置多种音频播放器从deviceCurrentTime指定偏移玩,你可以在这个方法的讨论中所描述进行精确的同步。
还要注意在示例代码playAtTime:
讨论:
// Before calling this method, instantiate two AVAudioPlayer objects and
// assign each of them a sound.
- (void) startSynchronizedPlayback {
NSTimeInterval shortStartDelay = 0.01; // seconds
NSTimeInterval now = player.deviceCurrentTime;
[player playAtTime: now + shortStartDelay];
[secondPlayer playAtTime: now + shortStartDelay];
// Here, update state and user interface for each player, as appropriate
}
如果能够将文件到硬盘进行解码,然后音频单元是可能的解决办法,提供最好的延迟。 如果你决定使用这样的结构,你也应该检查出奴佛卡因:
https://github.com/alexbw/novocaine
该框架需要很多头痛的出处理音频单元。