首页 > 代码库 > iOS_33_音效

iOS_33_音效

音效、音乐
导入框架:
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








iOS_33_音效