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)
我只是想知道系统是否是我创建音板的前进方向.尤其要感谢用户在节拍之间快速交替拍打电路板..如果不是最好的方式播放响应真的很好的声音?
从经验来看,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)
2014 年 3 月 22 日 - 更新:删除了我过于兴奋的帖子(很久以前写的)并更新以描绘更合适的答案。
我必须实现对音频的精细控制,因此选择使用 OpenAL。WOW 是一种总结方式。当我自己决定使用 OpenAL 时,这需要一些额外的工作,实现所有必需的方法并设置一切;我发现自己几乎没有明显的延迟。我对出色的结果感到非常满意。
我能够实现精细控制并且完全没有延迟。我记得当它工作时我高兴得跳了起来。
以下是我使用的资源,帮助简化了首次实施 OpenAL 的工作:
如果您需要对音频进行精细控制,更重要的是,如果您需要低延迟点播音频,特别是对于游戏,当您需要确保在那里播放声音,然后当您需要和期望它能够实现,例如基于音频的应用程序。