适用于iOS应用程序的多轨mp3播放

rbe*_*ch8 3 openal objective-c core-audio audiounit ios

我正在做一个涉及以多轨道格式播放歌曲的应用程序(鼓,人声,吉他,钢琴等......).我不需要对每个音轨进行任何精美的音频处理,我需要做的就是播放,暂停和静音/取消静音.

我一直在使用AVAudioPlayer的多个实例,但在进行设备测试时,我注意到首次播放时曲目的播放效果非常不同步.此外,当我暂停并播放曲目时,它们会继续变得更加不同步.经过一番研究后,我意识到AVAudioplayer只有太多的延迟,不能用于我的应用程序.

在我的应用程序中,我基本上有一个AVAudioPlayers的NSArray,我会循环播放每个或暂停/停止每个,我敢肯定这是导致它在设备上失去同步的原因.

看起来Apple的音频混音器对我来说效果很好,但是当我尝试实现它时,我得到一个我无法弄清楚的EXC_BAD_ACCESS错误.

我知道答案是使用OpenAL或音频单元,但是当我需要做的就是同时播放5个.mp3音轨时,似乎没有必要花几个星期来学习这些.有没有人对如何做到这一点有任何建议?谢谢

rbe*_*ch8 5

感谢admsyn的建议,我能够提出一个解决方案.

AVAudioPlayer有一个currentTime属性,它返回一个轨道的当前时间,也可以设置.

所以我按照admsyn的说明实现了startSynchronizedPlayback,然后在我停止轨道时添加了以下内容:

-(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]
    }
{
Run Code Online (Sandbox Code Playgroud)

这段代码基本上遍历我的轨道数组,每个轨道都拥有自己的AVAudioPlayer,从第一首轨道获取当前时间,然后将所有以下轨道设置为该时间.现在,当我使用startSynchronizedPlayback方法时,它们都会同步播放,并且暂停未暂停使它们保持同步.希望这对其他试图保持轨道同步的人有所帮助.