【问题标题】:iOS AVAudioPlayer play sound againiOS AVAudioPlayer 再次播放声音
【发布时间】:2015-04-09 08:06:11
【问题描述】:

嘿,我有几个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 

} 

但是,再次按下同一个按钮会导致一点延迟(可能是 20 毫秒),此时听不到任何声音。这是时候,AVAudioPlayer 似乎需要“倒带”曲目才能再次播放。解决这个问题的一个想法是为每个声音创建多个 AVAudioPlayer 对象,但这会产生一些糟糕的代码!有关如何加快此过程的任何想法?

谢谢,亚历克斯

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

【问题讨论】:

    标签: ios objective-c audio avaudioplayer


    【解决方案1】:

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

    想象一下,如果您立即从声音文件的中点跳到开头,完全没有间隙。更好的是,下载 Audacity 并听听它的声音。由于不连续性,您会听到令人不快的噼啪声或爆裂声。或许那五十分之一秒的静默实际上听起来比立即重新开始要好。

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

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

    【讨论】:

    • 感谢您的详细回答,我会为您的努力打勾。看起来我需要把自己读入 AUGraph 的东西:/ 还要感谢所有与音乐相关的输入,但我自己是一名制作人,我知道自己在做什么,但不幸的是,我在制作音乐方面比在编码方面做得更好哈哈
    【解决方案2】:

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

    【讨论】:

    • 这大约需要 100 毫秒,比我目前得到的还要糟糕
    猜你喜欢
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多