音效、音乐
导入框架:
AVFoundation.framework
AudioToolbox.framework
硬件解码更加高效,推荐使用CAF格式的音效
NSURL 转成CFURLRef
需要桥接
核心代码:
音效工具类,提供快速播放和清除销毁音效功能
// // AudioEffectTool.h // 33_音效 // // Created by beyond on 14-9-10. // Copyright (c) 2014年 com.beyond. All rights reserved. // 音效工具类,提供快速播放和清除销毁音效功能 #import <Foundation/Foundation.h> @interface AudioEffectTool : NSObject // 播放音效,参数:音效文件名 如:@"go.wav" + (void)playSound:(NSString *)filename; // 清除销毁音效,参数:音效文件名 如:@"go.wav" + (void)disposeSound:(NSString *)filename; // 清除销毁所有音效 + (void)disposeAllSound; @end
// // AudioEffectTool.m // 33_音效 // // Created by beyond on 14-9-10. // Copyright (c) 2014年 com.beyond. All rights reserved. // 音效工具类,提供快速播放和清除音效功能 #import "AudioEffectTool.h" // 音效播放,必须导入 #import <AVFoundation/AVFoundation.h> @implementation AudioEffectTool // 字典: filename作为key, soundID作为value // 存放所有的生成的 音效ID static NSMutableDictionary *_soundIDDict; #pragma mark - 生命周期 // 初始化 + (void)initialize { // 初始化,可变字典,用于存放所有的 生成的 音频ID _soundIDDict = [NSMutableDictionary dictionary]; } #pragma mark - 公开方法 // 播放音效,参数:音效文件名 如:@"go.wav" + (void)playSound:(NSString *)filename { // 0.robust判断 if (!filename) return; // 1.先从字典中取出soundID,将取出的对象转成unsigned_long SystemSoundID soundID = [_soundIDDict[filename] unsignedLongValue]; // 2.如果是第一次播放,才创建 if (!soundID) { // 2.1 得到文件的url NSURL *url = [[NSBundle mainBundle] URLForResource:filename withExtension:nil]; // 2.2 如果音效文件并不存在,直接返回 if (!url) return; // 2.3 加载音效文件,并且创建音效ID,存入传进来的地址中, // NSURL 转成CFURLRef 需要桥接 AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID); // 2.4 最后将该文件名,对应的音效ID,包装成对象,放入字典 _soundIDDict[filename] = @(soundID); } // 3.最后,开始播放 音效ID AudioServicesPlaySystemSound(soundID); } // 清除销毁音效,参数:音效文件名 如:@"go.wav" + (void)disposeSound:(NSString *)filename { // 0.robust判断 if (!filename) return; // 1.先从字典中取出soundID,将取出的对象转成unsigned_long SystemSoundID soundID = [_soundIDDict[filename] unsignedLongValue]; // 2.如果soundID存在,才清除销毁掉,释放出内存,并记得从字典中移除 if (soundID) { // 销毁音效ID AudioServicesDisposeSystemSoundID(soundID); // 从字典中移除 [_soundIDDict removeObjectForKey:filename]; } } // 清除销毁所有音效 + (void)disposeAllSound { // 遍历,并执行清除 for (id obj in [_soundIDDict allValues]) { SystemSoundID soundID = [obj unsignedLongValue]; // 2.如果soundID存在,才清除销毁掉,释放出内存,并记得从字典中移除 if (soundID) { // 销毁音效ID AudioServicesDisposeSystemSoundID(soundID); } } // 最后清空字典 [_soundIDDict removeAllObjects]; } @end
控制器
// // BeyondViewController.m // 33_音效 // // Created by beyond on 14-9-10. // Copyright (c) 2014年 com.beyond. All rights reserved. // 音效播放demo,触摸随机播放音效 #import "BeyondViewController.h" // 导入音效工具类,负责播放和清除音效 #import "AudioEffectTool.h" @interface BeyondViewController () @end @implementation BeyondViewController - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. [AudioEffectTool disposeAllSound]; } #pragma mark - touch - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSString *filename = [NSString stringWithFormat:@"m_%02d.wav", arc4random_uniform(14) + 3]; [AudioEffectTool playSound:filename]; } @end
时间: 2024-10-06 00:07:15