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

音效通过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 SGAudioTool

static 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=0
    if (!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

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

时间: 2024-08-25 15:23:28

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

JAVA学习笔记(五十一)- DBUtil 封装数据库工具类

数据库工具类 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /* * 数据库工具类 */ public class DBUtil { // 获取数据库连接 public static Connection getConnection() { String dr

一个对称加密、解密的方法C#工具类

using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Security.Cryptography; namespace CMD.EDI { public class EncryptHandler { /// <summary> /// 加密字符串 /// </summary> public static string Encrypt(strin

JUDE工具类图制作

1. 类图图形元素 2. 连接线条 线的关系解释如下: 3. 创建一个类

iOS开发—音频的播放的简单介绍和封装工具类

iOS开发—音频的播放的简单介绍和封装工具类 一.音效的播放简单介绍 简单来说,音频可以分为2种 (1)音效 又称“短音频”,通常在程序中的播放时长为1~2秒 在应用程序中起到点缀效果,提升整体用户体验 (2)音乐 比如游戏中的“背景音乐”,一般播放时间较长 框架:播放音频需要用到AVFoundation.framework框架 二.音效的播放 1.获得音效文件的路径 NSURL *url = [[NSBundle mainBundle] URLForResource:@"m_03.wav&qu

iOS开发拓展篇—封装音频文件播放工具类

一.简单说明 1.关于音乐播放的简单说明 (1)音乐播放用到一个叫做AVAudioPlayer的类 (2)AVAudioPlayer常用方法 加载音乐文件 - (id)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError; - (id)initWithData:(NSData *)data error:(NSError **)outError; 准备播放(缓冲,提高播放的流畅性) - (BOOL)prepareToPlay;

Apache Commons 工具类介绍及简单使用

Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍.   组件 功能介绍 BeanUtils 提供了对于JavaBean进行各种操作,克隆对象,属性等等. Betwixt XML与Java对象之间相互转换. Codec 处理常用的编码方法的工具类包 例如DES.SHA1.MD5.Base64等. Collections java集合框架操作. Compress java提供文件打包 压缩类库. C

Unity+NGUI打造网络图片异步加载与本地缓存工具类(二)

接上文,我们的工具类中的主要方法: public  void SetAsyncImage(string url,UITexture texture) 按照前文分析的图片加载步骤来 public void SetAsyncImage(string url,UITexture texture){ //开始下载图片前,将UITexture的主图片设置为占位图 texture.mainTexture = placeholder; //判断是否是第一次加载这张图片 if (!File.Exists (pa

关于Java中何时使用static和工具类相关知识

一.使用static修饰变量:当对象中出现共享数据时,该数据被静态修饰,对象中的特有数据要定义成非静态存放于堆内存中. 二.使用static修饰静态函数:当该函数内部没有访问到非静态数据(对象特有数据)时,可以定义为静态的. 三.工具类是为了封装功能(对象时为了封装数据),工具类中没有属性数据,只有实现各种功能的方法,这些方法都是静态的.为了防止其他类中创建工具类的对象(工具类对象毫无意义),所以可以对工具类的构造方法私有化.工具类中不需要对外开放的方法(这些方法功能工具类中其他方法调用)也要私

apache 工具类

Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. 组件 功能介绍 BeanUtils 提供了对于JavaBean进行各种操作,克隆对象,属性等等. Betwixt XML与Java对象之间相互转换. Codec 处理常用的编码方法的工具类包 例如DES.SHA1.MD5.Base64等. Collections java集合框架操作. Compress java提供文件打包 压缩类库. Con