iOS AVAudioPlayer再次播放声音

时间:2015-04-07 22:25:11

标签: ios objective-c audio avaudioplayer

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

我正在使用的代码:

-(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 

} 

然而,再次按下相同的按钮会稍微延迟(可能是20ms),听不到声音。这是时间,AVAudioPlayer似乎需要“回放”曲目才能再次播放。解决这个问题的一个想法是为每个声音创建AVAudioPlayer的多个对象,但这会产生一些可怕的代码!关于如何更快地完成这个过程的任何想法?

谢谢,Alex

编辑:播放2种不同的声音非常合适,我听不到它们之间的任何延迟,因为事先prepareToPlay所有的声音。

2 个答案:

答案 0 :(得分:1)

我知道如何消除20ms的差距,但首先要考虑你是否愿意。

想象一下,如果你立刻从声音文件的中点跳到开头没有任何间隙。更好的是,下载Audacity并听听它听起来如何。由于不连续性,您将获得令人不快的噼啪声或砰砰声。也许沉默的五分之一秒实际上听起来比立即重启更好。

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

你怎么能让你的循环听起来不错?您可以尝试在触摸点淡出,然后淡入。或者您可以在循环的开头和结尾搜索过零点(过零点是声波值为0的位置。它们发生所有时间都是单声道输出,但如果您的输出是立体声,可能更难找到。)最后这听起来会比20毫秒的静音好吗?在进入学习AUGraph interace的漫长道路之前,先获取Audacity并尝试循环。

答案 1 :(得分:0)

对于同一首歌,如何停止它,然后准备播放并播放?