2015-04-07 153 views
0

嘿,我有几个AVAudioPlayers每个包含一个声音。如果我多次按下相同的按钮,它应该从头开始重复声音。如果之后再按下另一个按钮,则应停止运行声音以便为新的“腾出空间”。iOS AVAudioPlayer再次播放声音

的代码我使用为:

-(void) plays:(int)p{ // p is the index of the sound being triggered 

    if([players[p] isPlaying]) 
     {        // setting the time back to 0 makes 
     players[p].currentTime = 0.0; // the player automatically play again 
     } 
    else 
     { 
     [players[p] play]; // if not playing, start playing 
     } 

    if(last!=p) 
     {      // if the last sound is different from the current 
     [players[last] stop]; // stop the last one 
     players[last].currentTime = 0.0;} // put its position back to 0 

    last=p; // set the 'last' variable 

} 

然而,击中同一个按钮再次在没有听到声音稍微延迟(也许20毫秒)结束。现在是时候了,AVAudioPlayer似乎需要“倒带”曲目才能再次播放。一个解决这个问题的想法是为每个声音创建AVAudioPlayer的多个对象,但这会产生一些糟糕的代码!关于如何使这个过程更快的任何想法?

谢谢,亚历克斯

编辑:玩2种不同的声音,工作完全正常,我不能在他们之间听到任何延迟,因为我prepareToPlay所有事先声音。

回答

1

我知道如何消除20ms的差距,但首先考虑如果你想。

想象一下,如果您立即从声音文件的中点跳到开头,并且没有任何间隙。更好的是,下载Audacity并听听它的声音。由于不连续性,你会得到令人不快的crack or声或流行音。或许那50秒的沉默实际上听起来好于立即重新开始。

如果你想要一个不间断的音频流,你将不得不放弃简单的AVAudioPlayer接口并构建一个AUGraph。当然,这意味着要学习复杂的音频接口并学习所有关于音频格式的知识。然后你必须弄清楚你要把什么数据放到你的音频流中。

你会如何让你的循环听起来不错?你可能会试着在触摸点淡出,然后消失。或者你可以在循环的开始和结尾搜索零交叉点(过零点就是声波值为0的地方)。它们发生了所有的时间在单声道输出,但可能很难找到你的输出是否是立体声。)最后,这听起来会比20毫秒的静音更好听吗?在进入学习AUGraph interace的漫长道路之前,先走出Audacity并尝试循环。

+0

感谢您的详细解答,我会为此付出努力。看起来我需要把自己看成AUGraph的东西:/也要感谢所有与音乐有关的输入,但我自己是一名制作人,我知道自己在做什么,但不幸的是,我在制作音乐方面比在编码方面做得更好哈哈 – user2875404

0

对于同一首歌曲,如何停止它,然后prepareToPlay和播放?

+0

这需要100ms,比我到目前为止更差 – user2875404