嘿我有几个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
所有的声音。
答案 0 :(得分:1)
我知道如何消除20ms的差距,但首先要考虑你是否愿意。
想象一下,如果你立刻从声音文件的中点跳到开头没有任何间隙。更好的是,下载Audacity并听听它听起来如何。由于不连续性,您将获得令人不快的噼啪声或砰砰声。也许沉默的五分之一秒实际上听起来比立即重启更好。
如果你想要一个不间断的音频流,你将不得不放弃简单的AVAudioPlayer接口并构建一个AUGraph。当然,这意味着要学习复杂的音频接口并学习所有有关音频格式的知识。然后你必须弄清楚你要将什么数据输入音频流。
你怎么能让你的循环听起来不错?您可以尝试在触摸点淡出,然后淡入。或者您可以在循环的开头和结尾搜索过零点(过零点是声波值为0的位置。它们发生所有时间都是单声道输出,但如果您的输出是立体声,可能更难找到。)最后这听起来会比20毫秒的静音好吗?在进入学习AUGraph interace的漫长道路之前,先获取Audacity并尝试循环。
答案 1 :(得分:0)
对于同一首歌,如何停止它,然后准备播放并播放?