(九十五)音效播放方法和工具类的制作

音效通过AVFoundation框架实现,是通过函数而不是方法,因此需要进行桥接等操作,具体步骤如下。

进行音效播放,首先要得到音效的URL(只能是本地音频),然后转换为音效ID(唯一),通过ID播放音效。

【音效播放方法】

①导入框架主头文件

#import <AVFoundation/AVFoundation.h>

②通过Bundle拿到本地音效,然后调用AudioServicesCreateSystemSoundID函数得到音效ID,ID为0代表无效,以此为依据可进行懒加载

@interface ViewController ()@property (nonatomic, assign) SystemSoundID soundID;@end@implementation ViewController- (SystemSoundID)soundID{if (!_soundID) {// AudioServicesPlayAlertSound(<#SystemSoundID inSystemSoundID#>) // 播放+震动// AudioServicesPlaySystemSound(<#SystemSoundID inSystemSoundID#>) // 只播放不震动// 首先要创建音效ID, 只能播放本地音效,音频相关通过C实现,需要桥接。NSURL *url = [[NSBundle mainBundle] URLForResource:@"xxx.wav" withExtension:nil];SystemSoundID soundID;AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID);_soundID = soundID;}return _soundID;}③调用AudioServicesPlaySystemSound传入ID来播放音效

AudioServicesPlaySystemSound(self.soundID);【工具类的抽取】

工具类通过类方法实现传入文件名自动播放音效,,并且包含懒加载,当收到内存警告时,还可以调用删除单个音效和所有音效的方法,通过字典存储音效ID。

//// SGAudioTool.h// 音效播放//// Created by 11 on 7/28/15.// Copyright (c) 2015 soulghost. All rights reserved.//#import <Foundation/Foundation.h>/* iOS默认能播放的音频格式 硬件解码:AAC ALAC HE-AAC MP3 CAF (硬件解码同一时间只支持一个音频) 软件解码:AAC ALAC iLBC IMA4 Linea PCM MP3 CAF U-law and a-law */// 系统自带的音频转换// afconvert// 转aac afconvert -f adts -d aac buyao.wav@interface SGAudioTool : NSObject+ (void)playAudioWithName:(NSString *)audioName;+ (void)disposeAudioWithAudioName:(NSString *)audioName;+ (void)disposeAll;@end//// SGAudioTool.m// 音效播放//// Created by 11 on 7/28/15.// Copyright (c) 2015 soulghost. All rights reserved.//#import "SGAudioTool.h"#import <AVFoundation/AVFoundation.h>@implementation SGAudioToolstatic NSMutableDictionary *_soundIDs;+ (void)initialize{// 第一次使用类时调用的公共初始化类方法。_soundIDs = [NSMutableDictionary dictionary];}+ (void)playAudioWithName:(NSString *)audioName{// 判断文件名是否为空if(audioName == nil){NSLog(@"文件名不能为空");return;}SystemSoundID soundID = [_soundIDs[audioName] unsignedIntValue]; // nil的uintvalue=0,也就是没有记录过的ID=0if (!soundID) {NSURL *url = [[NSBundle mainBundle] URLForResource:audioName withExtension:nil];// 判断url是否有效if (url == nil) {NSLog(@"找不到文件");return;}AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID);_soundIDs[audioName] = @(soundID);}AudioServicesPlaySystemSound(soundID);}+ (void)disposeAudioWithAudioName:(NSString *)audioName{if (audioName == nil) {return;}SystemSoundID soundID = [_soundIDs[audioName] unsignedIntValue];if (soundID) {AudioServicesDisposeSystemSoundID(soundID);[_soundIDs removeObjectForKey:audioName];}}+ (void)disposeAll{for (NSString *audioName in _soundIDs) {NSLog(@"%@",audioName);SystemSoundID soundID = [_soundIDs[audioName] unsignedIntValue];AudioServicesDisposeSystemSoundID(soundID);}[_soundIDs removeAllObjects];}@end

版权声明:本文为博主原创文章,未经博主允许不得转载。

当你感到悲哀痛苦时,最好是去学些什么东西。

(九十五)音效播放方法和工具类的制作

相关文章:

你感兴趣的文章:

标签云: