-->

多轨MP3播放功能的iOS应用(multi track mp3 playback for iOS a

2019-09-24 03:33发布

我做的是涉及多磁道格式(鼓,主唱,吉他,钢琴等)播放歌曲的应用程序。 我不需要做任何特殊的音频处理每首曲目,都是我需要能够做的是播放,暂停和静音/取消静音每个轨道。

我一直在使用AVAudioPlayer的多个实例,但执行设备测试的时候,我注意到,轨道非常轻微打不同步时,他们首先播放。 此外,当我暂停和播放他们继续获得更多的不同步的轨道。 一些研究之后,我已经意识到,AVAudioplayer只是有太多的等待时间,也不会为我的应用程序。

在我的应用程序基本上是通过有一个NSArray AVAudioPlayers的,我会循环,发挥每一个或暂停/停止各一个,我敢肯定,这是什么原因造成它不同步的设备上。

这似乎是苹果的音频混合器会为我工作得很好,但是当我尝试实施它,我感到我无法找出一个EXC_BAD_ACCESS错误。

我知道答案是使用OpenAL的或音频单元,但它只是似乎没有必要花费数周时间学习这些,当所有我需要做的是在同一时间玩.MP3 5曲目。 有没有人对如何做到这一点有什么建议? 谢谢

Answer 1:

由于admsyn的建议我能拿出一个解决方案。

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

所以,我实现了startSynchronizedPlayback由admsyn陈述,然后添加以下时,我停止了轨道:

-(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方法都同步播放和暂停取消暂停让他们同步为好。 希望这有助于别人试图保持轨道同步。



Answer 2:

如果你发行个人play的消息给每个AVAudioPlayer,这是完全可能的消息是在不同时间到达,或者说,AVAudioPlayers完成他们的预热阶段不同步对方。 你应该用playAtTime:和deviceCurrentTime属性来实现正确的同步。 注意deviceCurrentTime的描述:

使用此属性来表示“现在”调用playAtTime时:实例方法。 通过配置多种音频播放器从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
}


Answer 3:

如果能够将文件到硬盘进行解码,然后音频单元是可能的解决办法,提供最好的延迟。 如果你决定使用这样的结构,你也应该检查出奴佛卡因:

https://github.com/alexbw/novocaine

该框架需要很多头痛的出处理音频单元。



文章来源: multi track mp3 playback for iOS application