一.介绍
AudioToolbox.framework是一套基于C语言的框架,使用它来播放音效其本质是将短音频注册到系统声音服务(System Sound Service).System Sound Service是一种简单、底层的声音播放服务,但是它本身也存在着一些限制:
音频播放时间不能超过30s
数据必须是PCM或者IMA4格式
音频文件必须打包成.caf、.aif、.wav中的一种(注意这是官方文档的说法,实际测试发现一些.mp3也可以播放)
音效处理对应的框架是AudioToolbox,只不过AVFoundation框架包含了此框架
二.使用
使用System Sound Service 播放音效的步骤如下:
方法播放音效(后者带有震动效果)
2.使用对应的API,开始播放音效:
(1)根据音效文件,来生成SystemSoundID
(2)根据SystemSoundID,播放音效
调用AudioServicesCreateSystemSoundID(CFURLRef inFileURL, SystemSoundID* outSystemSoundID)函数获得系统声音ID
如果需要监听播放完成操作,
则使用AudioServicesAddSystemSoundCompletion(SystemSoundID inSystemSoundID, CFRunLoopRef inRunLoop, CFStringRef inRunLoopMode
或者使用 AudioServicesSystemSoundCompletionProc inCompletionRoutine, void* inClientData)方法注册回调函数。
如果不需要监听播放完成的操作,
则调用AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID)
或者AudioServicesPlayAlertSound(SystemSoundID inSystemSoundID)
(3)根据SoundID释放内存
AudioServicesDisposeSystemSoundID(SystemSoundID inSystemSoundID),(如果是不需要监听播放完成的方法,则不需要这句代码)
代码如下:
//获取路径
NSURL *url = [[NSBundle mainBundle] URLForResource:@"2018-11-27 10_36_51 1.wav" withExtension:nil];
//根据音效文件创建systemSoundId
SystemSoundID soundID = 0;
AudioServicesCreateSystemSoundID((__bridge CFURLRef _Nonnull)(url), &soundID);
//根据soundId播放音效一:
// AudioServicesPlaySystemSoundWithCompletion(soundID, ^{
// NSLog(@"play finish");
// //当音效播放完成时,我们需要根据SystemSoundID 释放内存资源
// AudioServicesDisposeSystemSoundID(soundID);
// });
// 根据soundId播放音效二:播放音效时,手机会跟着震动;
AudioServicesPlayAlertSoundWithCompletion(soundID, ^{
NSLog(@"play finish");
AudioServicesDisposeSystemSoundID(soundID);
});