objective-c - iOS 应用程序的多轨 mp3 播放

标签 objective-c ios core-audio openal audiounit

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

我一直在使用 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/

相关文章:

iphone - 如何从 UIView 访问 UIViewController 的按钮?

macos - 发布时崩溃,但调试时不崩溃

objective-c - 如何使用 avassetreader 在音轨中搜索?

ios - 如何在 iOS 中录制音频乐器?

ios - 将 NSLocalizedString 传递给 NSObject 参数的 Swift 方法无法编译

ios - 按下时 UIButton 变淡

ios - 如何摆脱数组中的多组括号

ios - 用户键入新行时如何向 UITextView 添加自动缩进?

ios - 如何在不从应用程序内进入设置的情况下打开位置

ios - 点击 UIButton 后显示 UITableView