iOS AVAudioPlayer再次播放声音

iOS AVAudioPlayer play sound again

嘿,我有几个 AVAudioPlayers,每个都包含一个声音。如果我多次按下同一个按钮,它应该从头开始重复声音。如果我之后按下另一个按钮,运行 声音将停止以 "make room" 为新的。

我为此使用的代码:

-(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 似乎需要 "rewind" 曲目才能再次播放。解决这个问题的一个想法是为每个声音创建多个 AVAudioPlayer 对象,但这会产生一些糟糕的代码!关于如何加快此过程的任何想法?

谢谢,亚历克斯

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

同一首歌,要不要停下来,然后prepareToPlay播放?

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

想象一下,如果您立即从声音文件的中点跳到开头,没有任何间隙。更好的是,下载 Audacity 并听听它的声音。由于不连续,您会听到令人不快的噼啪声或爆裂声。也许那 1/50 秒的沉默实际上听起来比立即重新开始更好。

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

你如何让你的循环听起来好听?您可以尝试在触摸点淡出,然后淡入。或者您可以在循环的开始和结束处搜索零交叉点(零交叉点是声波值为 0 的地方。它们发生始终以单声道输出,但如果您的输出是立体声,可能会更难找到。)最终这听起来会比 20 毫秒的静音更好吗?在进入学习 AUGraph 界面的漫漫长路之前,请退出 Audacity 并尝试循环。