我正在做一个涉及以多轨格式(鼓、人声、吉他、钢琴等)播放歌曲的应用程序。我不需要对每个音轨做任何花哨的音频处理,我需要做的就是播放、暂停和静音/取消静音每个音轨。
我一直在使用 AVAudioPlayer 的多个实例,但是在执行设备测试时,我注意到第一次播放轨道时播放的轨道稍微不同步。此外,当我暂停并播放轨道时,它们会继续变得更加不同步。经过一番研究后,我意识到 AVAudioplayer 的延迟太大,无法用于我的应用程序。
在我的应用程序中,我基本上有一个 AVAudioPlayer 的 NSArray,我会循环播放每个 AVAudioPlayer 或暂停/停止每个 AVAudioPlayer,我确信这就是导致它在设备上不同步的原因。
Apple 的音频混合器似乎对我来说效果很好,但是当我尝试实现它时,我遇到了一个我无法理解的 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 方法时,它们都会同步播放,暂停取消暂停也会使它们保持同步。希望这对尝试保持轨道同步的其他人有所帮助。
关于objective-c - iOS 应用程序的多轨 mp3 播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12902920/