什么是快速按下按钮xcode快速播放声音的最佳方法?

时间:2010-06-27 18:04:54

标签: iphone objective-c ios audio uibutton

我有一个音板 它只是一个大约8个按钮的屏幕。 每个按钮都有自己的声音,按下按钮即可播放 我可以通过两种方式播放声音,例如使用SystemSound或AVAudioPlayer 系统声音到目前为止似乎有最快的响应时间,avaudioplayer很慢,如果用户非常快速地点击按钮,它就无法跟上,我为每个声音创建了一个非常混乱的音频播放器。 这就是我现在播放声音的方式 .h文件

@interface MainScreenViewController : UIViewController <AVAudioPlayerDelegate, UITabBarControllerDelegate> {
 AVAudioPlayer *player;
 CFURLRef  keNURL;
 SystemSoundID    keNObject;
 //KE LOUD
 CFURLRef  keLURL;
 SystemSoundID    keLObject;
 //GE NORMAL
 CFURLRef  geNURL;
 SystemSoundID    geNObject;
 //GE LOUD
 CFURLRef  geLURL;
 SystemSoundID    geLObject;
 //NA NORMAL
 CFURLRef  naNURL;
 SystemSoundID    naNObject;
 //NA LOUD
 CFURLRef  naLURL;
 SystemSoundID    naLObject;
 //RA
 CFURLRef  raURL;
 SystemSoundID    raObject;
 //DAGGA CLICK
 CFURLRef  daCURL;
 SystemSoundID    daCObject;
 //TILLI CLICK
 CFURLRef  tiCURL;
 SystemSoundID    tiCObject;

}
@property (nonatomic, retain) AVAudioPlayer *player;
@property (readwrite)    CFURLRef        keNURL;
@property (readonly)    SystemSoundID    keNObject;
@property (readwrite)    CFURLRef        keLURL;
@property (readonly)    SystemSoundID    keLObject;
@property (readwrite)    CFURLRef        geNURL;
@property (readonly)    SystemSoundID    geNObject;
@property (readwrite)    CFURLRef        geLURL;
@property (readonly)    SystemSoundID    geLObject;
@property (readwrite)    CFURLRef        naNURL;
@property (readonly)    SystemSoundID    naNObject;
@property (readwrite)    CFURLRef        naLURL;
@property (readonly)    SystemSoundID    naLObject;
@property (readwrite)    CFURLRef        raURL;
@property (readonly)    SystemSoundID    raObject;
@property (readwrite)    CFURLRef        daCURL;
@property (readonly)    SystemSoundID    daCObject;
@property (readwrite)    CFURLRef        tiCURL;
@property (readonly)    SystemSoundID    tiCObject;
}

然后播放个人声音的动作

然后是.m文件,在导入.h文件并且右框架工作并合成所有变量后,编写动作的代码 这是个人行动中的最新情况。

-(IBAction)geSound{
 AudioServicesPlaySystemSound (self.geNObject);
}

我只是想知道systemound是否是我创建音板的前进方向。 尤其要感谢用户在节拍之间快速交替拍打电路板。 。 如果不是什么是播放响应真的很好的声音的最佳方式?

5 个答案:

答案 0 :(得分:8)

根据经验,AVAudioPlayer可以同时播放多种声音,也可以非常快速地播放。使用它的最佳方法是创建一个方法,您可以在NSString中播放以播放NSString中保存的名称的某些声音...这样,您将创建一个新的播放器对于您播放的每个声音文件。除非你知道你已经完成了它们,否则要小心释放分配的玩家。

除非你有非常大的声音文件可能需要一小段时间来缓冲(如果你能忍受任何等待时间,你必须自己弄明白),我从来没有遇到任何问题,因为它很慢。如果速度很慢,你可能会针对Apple的解决某些文件的建议做一些事情(例如,对于多个声音,Apple推荐使用CAF格式,因为它是硬件解码而不是软件解码):http://developer.apple.com/iphone/library/documentation/AVFoundation/Reference/AVAudioPlayerClassReference/Reference/Reference.html

<强>更新

以下是我使用shell脚本编码文件的方法。将它放在一个名为batchit.sh的文件中,放在它自己的目录中。然后将要编码的任何.WAV文件放在该目录中作为.CAF文件。打开Mac上的Terminalcd到该目录,然后输入sh batchit.sh并让它完成。它将批量转换所有文件......这是代码:

for f in *; do
if  [ "$f" != "batchit.sh" ]
then
    /usr/bin/afconvert -f caff -d ima4 $f 
    echo "$f converted"
fi
done

以下是一个示例项目...... http://www.megaupload.com/?d=5NP6FHR1

注意我在audioPlayerDidFinishPlaying方法中没有做任何事情,这是AVAudioPlayer的委托方法。你需要添加代码才能在每次完成播放后正确释放播放器(嘿,我不能为你完成所有工作:)以便正确分配所有内存。否则,如果你无限制地继续创建玩家而不释放它们,你最终会耗尽。因为看起来你有一个艰难的一天..请看下面的一个大提示。

这是我能给予的所有帮助。你必须学习和学习赚取其余的

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {

    // do something here if you want.. you know like maybe release the old players by uncommenting the line below :)

    //[player release];

}

答案 1 :(得分:2)

22/03/2014 - 更新:摆脱我过于兴奋的帖子(很久以前写过)并更新以描绘更合适的答案。

我必须对音频进行精细控制,因此选择使用OpenAL。 WOW是总结它的一种方式。一旦我自己使用OpenAL,需要一些额外的腿部工作,实现所有必需的方法并设置一切;我发现自己几乎没有明显的潜伏期。我对结果非常满意。

我完全可以实现精细控制和无延迟。我记得当我工作的时候,我喜欢跳跃。

以下是我使用的资源,这有助于简化首次实施OpenAL的努力:

  1. OpenAL on the iPhone
  2. 由于 this link this video tutorial,我能够创建出色的声音管理器单例。这让我能够从声音管理很少的任何课堂上播放我需要的所有声音,单身人士为我照顾一切。
  3. 如果您需要对音频进行精确控制,我谦卑地建议每个人都使用OpenAL,更重要的是,如果您需要低延迟的点播音频,特别是对于需要确保在那里播放声音然后何时播放的游戏您需要并期望它,例如,基于音频的应用程序。

答案 2 :(得分:1)

只是为了别人的利益而加入,即使这是问题发生后的两年。

我发现如果它们是短音,那么你的应用程序负载就可以了(ish)。通过运行准备播放每个声音的实例(在for循环中)来缓冲所有曲目(然后释放 - 只需要让处理器记住文件的位置)

这会消除下次到达时的初始加载时间,并让声音更快地启动

答案 3 :(得分:0)

你可以为每个声音创建AVAudioPlayer,然后暂停/播放它。

答案 4 :(得分:0)

您是否尝试在自己的线程中播放每个声音?您可以尝试基本的NSOperation