播放系统音效需要使用 AudioToolBox.framework
(一套基于 C
语言的框架),其本质是将短音频注册到系统的声音服务中来播放,其特点是简单,太底层,支持震动,但也有许多限制:
- 音效持续时间不能超过30秒
- 音频数据必须是PCM或IMA4(IMA/ADPCM)格式
- 音频文件必须打包成.caf、.aif或.wav格式
播放系统音效
播放系统音效的只需要调用这个方法:
void AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID);
当调用这个方法的时候需注意:
- 声音在当前系统音频卷中播放,没有编程音量控制可用
- 声音会立即播放
- 循环和立体定位是不可用的
- 每次只能播放一个声音,不支持同时播放多个声音
- 声音在设备扬声器上播放,不使用音频路由
播放系统音效最简单,只需要知道音效的id(SoundID)就可以了。
// 系统声音
AudioServicesPlaySystemSound(1007);
// 震动 只有iPhone才能震动而且还得在设置里开启震动才行,其他的如touch就没有震动功能
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
系统音效的ID保存在/System/Library/Audio/UISounds/(不知道怎样查看),但是可以在这里参考 http://iphonedevwiki.net/index.php/AudioServices 。
播放自定义音效
播放自定义音效的关键也是在 SoundID 上,主要方法有:
// 创建 SoundID
OSStatus AudioServicesCreateSystemSoundID ( CFURLRef __nonnull inFileURL,SystemSoundID * __nonnull outSystemSoundID );
// 销毁 soundID
OSStatus AudioServicesDisposeSystemSoundID ( SystemSoundID inSystemSoundID);
// 添加播放完成回调
OSStatus AudioServicesAddSystemSoundCompletion ( SystemSoundIDinSystemSoundID, CFRunLoopRef __nullable inRunLoop, CFStringRef __nullableinRunLoopMode, AudioServicesSystemSoundCompletionProc __nonnullinCompletionRoutine, void * __nullable inClientData );
// 播放音效
// 无振动
void AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID);
void AudioServicesPlaySystemSoundWithCompletion(SystemSoundID inSystemSoundID, void (^__nullable inCompletionBlock)(void));
// 有震动
void AudioServicesPlayAlertSound(SystemSoundID inSystemSoundID);
void AudioServicesPlayAlertSoundWithCompletion(SystemSoundID inSystemSoundID,
void (^__nullable inCompletionBlock)(void));
以下是具体代码
// 获取音频文件路径
NSURL *url = [[NSBundle mainBundle] URLForResource:@"in.caf" withExtension:nil];
// 加载音效文件并创建 SoundID
SystemSoundID soundID = 0;
AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, &soundID);
// 设置播放完成回调
AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, soundCompleteCallback, NULL);
// 播放音效
// 带有震动
// AudioServicesPlayAlertSound(_soundID);
// 无振动
AudioServicesPlaySystemSound(soundID);
// 销毁 SoundID
// AudioServicesDisposeSystemSoundID(_soundID);