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

Pav*_*van 6 iphone audio objective-c uibutton ios

我有一个音板,它只是一个大约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;
}
Run Code Online (Sandbox Code Playgroud)

然后是播放个人声音的动作

然后.m文件,在导入.h文件和右框架工作并合成所有变量后,编写动作的代码,这是个别动作中的内容.

-(IBAction)geSound{
 AudioServicesPlaySystemSound (self.geNObject);
}
Run Code Online (Sandbox Code Playgroud)

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

iwa*_*bed 8

从经验来看,AVAudioPlayer在同时或非常快速地一个接一个地播放多个声音时效果很好.使用它的最好方法是只创建一个方法,你可以在其中NSString播放一些声音,其名称保存在那里NSString...这样,你将为你演奏的每个声音文件创建一个新的播放器.除非你知道你完成了它们,否则要小心释放分配的玩家.

除非你有非常大的声音文件可能需要一小段时间来缓冲(你必须自己弄清楚,如果你可以忍受任何延迟),我从来没有遇到任何问题,因为它很慢.如果它很慢,你可能会针对Apple的解决某些文件的建议做一些事情(例如,对于多个声音,Apple推荐CAF格式,因为它是硬件解码而不是软件解码):http://developer.apple. COM/iphone /库/文件/ AVFoundation /参考/ AVAudioPlayerClassReference /参考/的reference.html

更新

以下是我使用shell脚本编码文件的方法.把它放在一个名为batchit.sh它自己的目录的文件中.然后将要编码的任何.WAV文件放在该目录中作为.CAF文件.打开Terminal你的Mac,cd到那个目录并输入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
Run Code Online (Sandbox Code Playgroud)

这是一个示例项目...... 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];

}
Run Code Online (Sandbox Code Playgroud)

  • 伟大的帖子!...但我是唯一一个将`batchit.sh`读成'batshit`的人吗? (2认同)

Pav*_*van 2

2014 年 3 月 22 日 - 更新:删除了我过于兴奋的帖子(很久以前写的)并更新以描绘更合适的答案。

我必须实现对音频的精细控制,因此选择使用 OpenAL。WOW 是一种总结方式。当我自己决定使用 OpenAL 时,这需要一些额外的工作,实现所有必需的方法并设置一切;我发现自己几乎没有明显的延迟。我对出色的结果感到非常满意。

我能够实现精细控制并且完全没有延迟。我记得当它工作时我高兴得跳了起来。

以下是我使用的资源,帮助简化了首次实施 OpenAL 的工作:

  1. iPhone 上的 OpenAL
  2. 正是因为这个视频教程的链接 ,我才能够创建一个出色的声音管理器单例。这使我能够从任何我想要的类中播放我需要的所有声音,而无需进行任何声音管理,单身人士为我处理了一切。

如果您需要对音频进行精细控制,更重要的是,如果您需要低延迟点播音频,特别是对于游戏,当您需要确保在那里播放声音,然后当您需要和期望它能够实现,例如基于音频的应用程序。