音效和音乐? 其实并没有严格意义上的限定,一般在开发中,将时间比较短, 播放频率比较高的, 当做音效处理;
SystemSoundID播放本地音效步骤
-
导入AVFoundation框架(其实音效处理对应的框架是AudioToolbox, 只不过AVFoundation框架包含了此框架)
// OC
#import <AVFoundation/AVFoundation.h>// swift import AVFoundation
-
使用对应的API, 开始播放音效
- objc
// 1. 根据音效文件, 来生成SystemSoundID // 1.1 获取URL CFURLRef urlRef = (__bridge CFURLRef)([[NSBundle mainBundle] URLForResource:@"m_16.wav" withExtension:nil]); // 1.2 创建保存soundID 的变量 SystemSoundID soundID; // 1.3 通过url, 和soundID的地址, 接收对应的音效soundID AudioServicesCreateSystemSoundID(urlRef, &soundID); // 2. 播放音效 // 2.1 不带振动效果 // AudioServicesPlaySystemSound(soundID); // 2.2 带振动效果 // AudioServicesPlayAlertSound(soundID); // 2.3 不带振动效果,播放完成后, 回调代码块 AudioServicesPlaySystemSoundWithCompletion(soundID1, ^{ AudioServicesPlaySystemSound(soundID2); }); // 2.4 带振动效果,播放完成后, 回调代码块 // AudioServicesPlayAlertSoundWithCompletion(soundID1), ^{ // AudioServicesPlayAlertSound(soundID); // }); // 3. 根据SoundID释放内存 AudioServicesDisposeSystemSoundID(soundID);
- swift
class func playSound(audioName: String, isAlert: Bool , playFinish: (()->())?) { // 一. 获取 SystemSoundID // 参数1: 文件路径 // 参数2: SystemSoundID, 指针 guard let url = NSBundle.mainBundle().URLForResource(audioName, withExtension: nil) else { print("没有找到音频路径") return } let urlCF = url as CFURLRef var systemSoundID: SystemSoundID = 0 AudioServicesCreateSystemSoundID(urlCF, &systemSoundID) // 二. 开始播放 // 判断是否振动 if isAlert { // 1. 带振动播放, 可以监听播放完成(模拟器不行) AudioServicesPlayAlertSoundWithCompletion(systemSoundID) { print("播放完成") // 三. 释放资源 AudioServicesDisposeSystemSoundID(systemSoundID) // 四. 执行回调 if playFinish != nil { playFinish!()} } }else { // 2. 不带振动播放, 可以监听播放完成 AudioServicesPlaySystemSoundWithCompletion(systemSoundID) { print("播放完成") // 三. 释放资源 AudioServicesDisposeSystemSoundID(systemSoundID) // 四. 执行回调 if playFinish != nil { playFinish!()} } } }
-
代码优化, 播放工具类的封装;
1. 优化soundID的生成, 不需要每次都创建一遍 2. 封装播放逻辑, 供多处调用