Objective c iOS应用程序的多音轨mp3播放

Objective c iOS应用程序的多音轨mp3播放,objective-c,ios,core-audio,openal,audiounit,Objective C,Ios,Core Audio,Openal,Audiounit,我正在做一个应用程序,涉及以多音轨格式播放歌曲(鼓、人声、吉他、钢琴等)。我不需要对每首曲目进行任何奇特的音频处理,我所需要做的就是播放、暂停和静音/取消静音每首曲目 我一直在使用AVAudioPlayer的多个实例,但在执行设备测试时,我注意到第一次播放曲目时,曲目有点不同步。此外,当我暂停播放曲目时,它们会继续变得更加不同步。经过一番研究,我意识到AVAudioplayer的延迟太大,不适合我的应用程序 在我的应用程序中,我基本上有一堆AVAudioPlayers,我可以循环播放每一个或暂停

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

我一直在使用AVAudioPlayer的多个实例,但在执行设备测试时,我注意到第一次播放曲目时,曲目有点不同步。此外,当我暂停播放曲目时,它们会继续变得更加不同步。经过一番研究,我意识到AVAudioplayer的延迟太大,不适合我的应用程序

在我的应用程序中,我基本上有一堆AVAudioPlayers,我可以循环播放每一个或暂停/停止每一个,我确信这就是导致设备上不同步的原因

看起来苹果的音频混音器对我来说很好,但当我尝试实现它时,我发现一个EXC_BAD_访问错误,我无法理解


我知道答案是使用OpenAL或音频单元,但似乎没有必要花费数周的时间来学习这些,因为我只需要同时播放大约5首mp3曲目。有人对如何做到这一点有什么建议吗?谢谢

如果您向每个AVAudioPlayer发出单独的
播放
消息,则消息很可能在不同的时间到达,或者AVAudioPlayer完成预热阶段时彼此不同步。您应该使用和属性来实现正确的同步。请注意deviceCurrentTime的说明:

调用playAtTime:instance方法时,使用此属性指示“now”。通过将多个音频播放器配置为在与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
}

如果您能够将文件解码到磁盘,那么音频单元可能是提供最佳延迟的解决方案。如果您决定使用这种架构,您还应查看奴佛卡因:


该框架解决了处理音频单元时的许多难题

多亏了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]
    }
{
-(无效)停止所有
{
int count=[tracksArr count];
for(int i=0;i

这段代码基本上在我的曲目数组中循环,每个曲目都有自己的AVAudioPlayer,从第一首曲目中获取当前时间,然后将以下所有曲目设置为该时间。现在,当我使用startSynchronizedPlayback方法时,它们都同步播放,暂停取消暂停也会保持同步。希望这对其他人有所帮助e其他人正在尝试保持曲目同步。

OpenAL不支持MP3开箱即用。admsyn-感谢您的评论。我实际上已经尝试过这种方法。在第一次播放曲目时,这种方法效果非常好。问题是,当曲目暂停或停止时,它们似乎在每次曲目停止之间都有延迟,因此当我暂停播放时,它们会延迟播放l的曲目,并播放了几次,这是严重的不同步。如果有一个stopAtTime方法:(