1.关于音效           

音效又称短音频,是一个声音文件,在应用程序中起到点缀效果,用于提升应用程序的整体用户体验。
 
我们手机里常见的APP几乎都少不了音效的点缀。
 
显示实现音效并不复杂,但对我们App很重要!
 

2.音效播放            

2.1.首先实现我们需要导入框架AudioToolbox.framework 

2.2.为了优化效播放,减少每次重复加载音效播放,我们将加载音效设为单例

实现单例 —— 将我在前几篇文章说过封装好的的单例宏 直接引用 Singleton.h

创建

Singleton.h
#import <Foundation/Foundation.h>
#import "Singleton.h" @interface SoundTools : NSObject //单例宏
singleton_interface(SoundTools) //要播放的音效名
- (void)playSoundWithName:(NSString *)name; @end

将APP要用到的音效添加到新建的bound里去

如图:

创建

Singleton.m
#import "SoundTools.h"
#import <AudioToolbox/AudioToolbox.h> /**
将所有的音频文件在此单例中统一处理
*/ @interface SoundTools()
{
NSDictionary *_soundDict; // 音频字典
} @end @implementation SoundTools
singleton_implementation(SoundTools) - (id)init
{
self = [super init]; if (self) {
// 完成所有音频文件的加载工作
_soundDict = [self loadSounds];
} return self;
}

2.3.启动系统声音服务                   

系统声音服务通过SystemSoundID来播放声音文件,对于同一个声音文件,可以创建多个SystemSoundID

系统声音服务是一套C语言的框架

为了提高应用程序性能,避免声音文件被重复加载,通常采用单例模式处理系统声音的播放

Singleton.m 实现
#pragma mark 加载指定的音频文件
- (SystemSoundID)loadSoundWithURL:(NSURL *)url
{
SystemSoundID soundID = ; AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID); return soundID;
}

2.4.加载bound里所有的音效文件,并记录进全局的字典中    

#pragma mark 加载所有的音频文件
- (NSDictionary *)loadSounds
{
// 思考:如何直到加载哪些音频文件呢?
// 建立一个sound.bundle,存放所有的音效文件
// 在程序执行时,直接遍历bundle中的所有文件
// 1. 取出bundle的路径名
NSString *mainBundlPath = [[NSBundle mainBundle] bundlePath];
NSString *bundlePath =[mainBundlPath stringByAppendingPathComponent:@"sound.bundle"]; // 2. 遍历目录
NSArray *array = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:bundlePath error:nil]; // 3. 遍历数组,创建SoundID,如何使用?
NSMutableDictionary *dictM = [NSMutableDictionary dictionaryWithCapacity:array.count]; [array enumerateObjectsUsingBlock:^(NSString *fileName, NSUInteger idx, BOOL *stop) {
// 1> 拼接URL
NSString *filePath = [bundlePath stringByAppendingPathComponent:fileName];
NSURL *fileURL = [NSURL fileURLWithPath:filePath]; SystemSoundID soundID = [self loadSoundWithURL:fileURL]; // 将文件名作为键值
[dictM setObject:@(soundID) forKey:fileName];
}]; return dictM;
}

2.5.播放音频                        
注意 断言:在项目开发中,防止被无意中修改音效名,找不到要播放的音效文件

#pragma mark - 播放音频
- (void)playSoundWithName:(NSString *)name
{
SystemSoundID soundID = [_soundDict[name] unsignedLongValue];
NSLog(@"%ld",soundID);
//断言它必须大于0;
NSAssert(soundID > , @"%@ 声音文件不存在!", name); AudioServicesPlaySystemSound(soundID);
}

在控制器里调用按钮的点击事情即可

- (void)clickMe
{
[[SoundTools sharedSoundTools] playSoundWithName:@"game_overs.mp3"]; }

2.6.优化之前的代码 —— 每次都会重复加载新的音效

//    NSURL *url = [[NSBundle mainBundle] URLForResource:@"bullet.mp3" withExtension:nil];
// SystemSoundID soundID = 0;
//
// // 创建声音,并且生成soundID的数值
// AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID);
//
// // 播放声音
// // 同样遵守苹果的静音原则,如果用户静音,会震动!提示用户注意!
//// AudioServicesPlayAlertSound(<#SystemSoundID inSystemSoundID#>)
// // 只播放声音,遵守苹果的静音原则 HIG
// AudioServicesPlaySystemSound(soundID);
//
// NSLog(@"%ld", soundID);

作者: 清澈Saup
出处:http://www.cnblogs.com/qingche/
本文版权归作者和博客园共有,欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接。

iOS- 优化与封装 APP音效的播放的更多相关文章

  1. iOS开发,音效的播放简单实现以及音效播放的简单封装

    一.音效的播放简单实现 二.音效播放的封装 -- 封装思路:将生成的SystemSoundID存放到字典中,每次播放的时候从字典中取出对应的SystemSoundID,没有的话再创建 头文件中定义类方 ...

  2. iOS开发拓展篇—音效的播放

    iOS开发拓展篇—音效的播放 一.简单介绍 简单来说,音频可以分为2种 (1)音效 又称“短音频”,通常在程序中的播放时长为1~2秒 在应用程序中起到点缀效果,提升整体用户体验 (2)音乐 比如游戏中 ...

  3. iOS开发——音频篇——音效的播放

    一.简单介绍 简单来说,音频可以分为2种 (1)音效 又称“短音频”,通常在程序中的播放时长为1~2秒 在应用程序中起到点缀效果,提升整体用户体验 (2)音乐 比如游戏中的“背景音乐”,一般播放时间较 ...

  4. iOS之基于FreeStreamer的简单音乐播放器(模仿QQ音乐)

    代码地址如下:http://www.demodashi.com/demo/11944.html 天道酬勤 前言 作为一名iOS开发者,每当使用APP的时候,总难免会情不自禁的去想想,这个怎么做的?该怎 ...

  5. iOS - GitHub干货分享(APP引导页的高度集成 - DHGuidePageHUD - ②)

    距上一篇博客"APP引导页的高度集成 - DHGuidePageHUD - ①"的发布有一段时间了, 后来又在SDK中补充了一些新的内容进去但是一直没来得及跟大家分享, 今天来跟大 ...

  6. 关于iOS中用AudioFile相关API解码或播放AAC_HE_V2时仅仅能识别单声首22.05k採样率的问题

    关于iOS中用AudioFile相关API解码或播放AAC_HE_V2时仅仅能识别单声首22.05k採样率的问题 在官方AQPlayer Demo 和 aqofflinerender中.都用了Audi ...

  7. html+css+js实现类似音乐app似的列表播放

    最近做了一个类似于音乐app里面列表播放的功能,主要是音频播放和按钮状态的联动: 界面如下: 如上图所示 上面有一个播放按钮 下面有一个播放列表 上面还有一个歌曲长度的总时长 上面一个按钮能控制下面所 ...

  8. iOS蓝牙原生封装,助力智能硬件开发

    代码地址如下:http://www.demodashi.com/demo/12010.html 人工智能自1956年提出以来,一直默默无闻,近年来人工智能的发展得到重视逐渐发展起步,智能硬件.智能手环 ...

  9. 封装APP之详解

    一.什么是封装APP 封装APP又称Web APP,Web APP即是一种框架型APP开发模式(HTML5 APP 框架开发模式),该开发方式拥有跨平台的优势,该模式通常由"HTML5云网站 ...

随机推荐

  1. 3. HTML中的容器标签

    什么是容器标签?在HTML开发中我们常常会使用一类标签作为容器放置一些内容,我们把这类标签称之为容器标签,可以作为容器标签的包括列表标签.表格标签.框架标签.布局标签,在这里我们就来总结下这些内容. ...

  2. composer切换中国镜像

    替换 composer.lock 文件中的 https://files.phpcomposer.com/files/ 为 https://dl.laravel-china.org 命令行 compos ...

  3. java中子类会继承父类的构造方法吗?

    参考: https://blog.csdn.net/wangyl_gain/article/details/49366505

  4. 定义一个大数组时,出现错误,程序进入HardFault_Handler中断

    在原子的串口程序前加了几个数组定义,加了个对数组处理的函数,出现了HardFault_Handler的错误,不知道怎么解决!!! 因为局部变量是存放在栈区的,而全局变量在全局区(静态区),如果栈区较小 ...

  5. 中国大学MOOC-C程序设计(浙大翁恺)—— 时间换算

    时间换算(10分) 题目内容: UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8.现在,你的程序要读入一个整数,表示BJT的时和分.整数的个位和十位表示分,百位和千位表示小时.如果小 ...

  6. Go Web Gin EasyUI 框架

    项目结构 第三方: 1.gin微服务框架 2.EasyUI框架

  7. 北京Uber优步司机奖励政策(3月23日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  8. LeetCode:46. Permutations(Medium)

    1. 原题链接 https://leetcode.com/problems/permutations/description/ 2. 题目要求 给定一个整型数组nums,数组中的数字互不相同,返回该数 ...

  9. GitHub 配置指南

    Git和GitHub的区别 GitHub术语解析 配置使用 注册GitHub帐号 创建Git 创建库 复制库 社交化 Git和GitHub的区别 Git是一个分布式的版本控制系统,与SVN类似:最初由 ...

  10. focus如何实现事件委托

    事件委托是利用事件冒泡机制的一种优化手段,如果有很多列表元素要绑定事件,那么就可以用事件委托来优化(不需要给每个元素都绑定事件).但是对于focus这种特殊的表单事件,它不会冒泡,那么又该如何实现这一 ...