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



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

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

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

苹果的混音器似乎对我来说很好,但当我尝试实现它时,我遇到了一个EXC_BAD_ACCESS错误,我无法理解。

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

多亏了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]
}
{

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

如果向每个AVAudioPlayer发出单独的play消息,则这些消息很可能在不同的时间到达,或者AVAudioPayers在完成预热阶段时彼此不同步。您应该使用playAtTime:和deviceCurrentTime属性来实现正确的同步。注意设备CurrentTime:的描述

在调用playAtTime:instance方法时,使用此属性指示"现在"。通过将多个音频播放器配置为以设备CurrentTime的指定偏移量播放,您可以执行精确的同步——如该方法的讨论中所述。

还请注意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
}

如果您能够将文件解码到磁盘,那么音频单元可能是提供最佳延迟的解决方案。如果你决定使用这样的架构,你也应该看看Novocaine:

https://github.com/alexbw/novocaine

这个框架消除了处理音频单元时的许多头痛问题。

最新更新