音效就是时间比较短的音频,如斗地主游戏中打牌的声音,魂斗罗游戏中打枪的声音等
================================================================================================
播放音效需要用到" <AVFoundation/AVFoundation.h> 框架
播放音效只需要2步:
1.根据音效资源的URL得到与之对应的SystemSoundID
/**
* 根据音效资源的URL返回对应的SystemSoundID
*
* @param _Nonnull 本地音效资源的URL-->需要CFURLRef类型,用NSURL自动桥接即可
*
* 将创建好的SystemSoundID传入;会根据URL返回对应的值
*/
AudioServicesCreateSystemSoundID((__bridge CFURLRef _Nonnull)(url), &soundID);
" 这里的soundID前面一定要加&符号,地址传递后系统才能找到soundID对应的内存去修改它的值!
2.根据URL对应的soundID播放音效
/**
* 播放音效 不带震动效果
*/
AudioServicesPlaySystemSound(soundID);
/**
* 播放音效 带震动效果(需要真机演示)
*/
AudioServicesPlayAlertSound(soundID);
补充:
/**
* 销毁soundID
*/
AudioServicesDisposeSystemSoundID(soundID);
================================================================================================
工具类的使用
在项目中大量使用的公共方法,我们通常会考虑封装一个工具类,减少重复代码。方便开发和后续维护
由于soundID在播放音效时会重复创建,所以可以考虑做一个类似于UITableViewCell缓存池的功能
自定义soundID缓存池思路
>1. 首先创建一个可变字典 字典的key是要播放音效文件的名称 字典的value存放根据音效文件创建的soundID
>2. 从字典中根据音效文件名(如fileName)取出soundID
SystemSoundID soundID = [_soundIDDict[fileName] unsignedIntValue];
>3. 判断soundID是否存在(是否为0)
if (!soundID)
3.1如果不存在,再根据音效文件名去创建soundID,并将此soundID以文件名为key加入字典中(这样下次就能直接从字典中取出soundID,不需要重新创建) --> 然后播放音效--> AudioServicesPlaySystemSound(soundID);
3.2如果存在,则直接播放音效--> AudioServicesPlaySystemSound(soundID);
注意:由于工具类在项目中到处可用,并且使用者可能什么奇葩都有,所以一定要保证代码的健壮性(如判断文件名若为空直接return等).不然有可能不是你代码问题,而且使用者传入格式不对导致出错,闪退等情况,依然会有损你大牛的光辉形象。