一、简介


简单来说,音频可以分为2种
音效
又称“短音频”,通常在程序中的播放时长为1~2秒
在应用程序中起到点缀效果,提升整体用户体验

音乐
比如游戏中的“背景音乐”,一般播放时间较长

播放音频可以使用框架
AVFoundation.framework

二、音效


1、音效的播放

// 1.获得音效文件的路径
NSURL *url = [[NSBundle mainBundle] URLForResource:@"m_03.wav" withExtension:nil]; // 2.加载音效文件,得到对应的音效ID
SystemSoundID soundID = ;
AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID);

// 3.播放音效
// 播放音效的同时有震动效果
AudioServicesPlayAlertSound(soundID);
// 仅仅是播放音效
// AudioServicesPlaySystemSound(soundID);

音效文件只需要加载1次

2、音效播放常见函数总结
加载音效文件

AudioServicesCreateSystemSoundID(CFURLRef inFileURL, SystemSoundID *outSystemSoundID)

释放音效资源
AudioServicesDisposeSystemSoundID(SystemSoundID inSystemSoundID)

播放音效
AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID)

播放音效带点震动
AudioServicesPlayAlertSound(SystemSoundID inSystemSoundID)

三、音乐


1、音乐的播放
音乐播放用到一个叫做AVAudioPlayer的类

AVAudioPlayer常用方法
加载音乐文件
- (id)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError;
- (id)initWithData:(NSData *)data error:(NSError **)outError;

准备播放(缓冲,提高播放的流畅性)
- (BOOL)prepareToPlay;

播放(异步播放)
- (BOOL)play;

暂停
- (void)pause;

停止
- (void)stop;

是否正在播放
@property(readonly, getter=isPlaying) BOOL playing;

时长
@property(readonly) NSTimeInterval duration;

当前的播放位置
@property NSTimeInterval currentTime;

播放次数(-1代表无限循环播放,其他代表播放numberOfLoops+1次)
@property NSInteger numberOfLoops;

音量
@property float volume;

是否允许更改速率
@property BOOL enableRate;

播放速率(1是正常速率,0.5是一般速率,2是双倍速率)
@property float rate;

有多少个声道
@property(readonly) NSUInteger numberOfChannels;

声道(-1是左声道,1是右声道,0是中间)
@property float pan;

是否允许测量音量
@property(getter=isMeteringEnabled) BOOL meteringEnabled;

更新测量值
- (void)updateMeters;

获得当前的平均音量
- (float)averagePowerForChannel:(NSUInteger)channelNumber;

四、录音

/** 录音对象 */
@property (nonatomic, strong) AVAudioRecorder *recorder; #pragma mark - 录制的控制
- (IBAction)startRecorder {
[self.recorder record];
} - (IBAction)stopRecorder {
[self.recorder stop];
} #pragma mark - 懒加载代码
- (AVAudioRecorder *)recorder
{
if (_recorder == nil) {
// 1.获取音频存放的路径
// 1.1.URL决定的录制的音频的存放的位置
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; // 1.2.拼接一个音频的文件名称
NSString *filePath = [path stringByAppendingPathComponent:@"123.caf"]; // 1.3.将路径转成URL
NSURL *url = [NSURL fileURLWithPath:filePath]; // 2.设置音频的相关格式:settings : 决定音频的格式/采样率
NSDictionary *setttings = @{
AVFormatIDKey : @(kAudioFormatLinearPCM),
AVSampleRateKey : @()}; // 3.创建录音对象
self.recorder = [[AVAudioRecorder alloc] initWithURL:url settings:setttings error:nil];
}
return _recorder;
}

五、播放音乐(抽取工具类)

#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h> @interface CHGAudioTool : NSObject /**
* 根据音效文件名开始播放音效
*
* @param soundName 音效名称
*/
+ (void)playSoundWithSoundName:(NSString *)soundName; /**
* 根据音乐文件名开始播放音乐 返回播放器
*
* @param musicName 音乐名称
*/
+ (AVAudioPlayer *)playMusicWithMusicName:(NSString *)musicName; /**
* 根据音乐文件名暂停播放音乐
*
* @param musicName 音乐名称
*/
+ (void)pauseMusicWithMusicName:(NSString *)musicName; /**
* 根据音乐文件名停止播放音乐
*
* @param musicName 音乐名称
*/
+ (void)stopMusicWithMusicName:(NSString *)musicName; @end

实现

#import "CHGAudioTool.h"

@implementation CHGAudioTool

static NSMutableDictionary *_soundIDs;
static NSMutableDictionary *_players; + (void)initialize
{
_soundIDs = [NSMutableDictionary dictionary];
_players = [NSMutableDictionary dictionary];
} // 播放音频
+ (void)playSoundWithSoundName:(NSString *)soundName
{
// 1.从字典中取出之前保存的soundID
SystemSoundID soundID = [[_soundIDs objectForKey:soundName] unsignedIntValue]; // 2.如果取出为0,表示之前没有加载当前声音
if (soundID == ) {
// 2.1.根据资源文件加载soundID
CFURLRef url = (__bridge CFURLRef)[[NSBundle mainBundle] URLForResource:soundName withExtension:nil];
AudioServicesCreateSystemSoundID(url, &soundID); // 2.2.存入字典
[_soundIDs setObject:@(soundID) forKey:soundName];
} // 3.播放声音
AudioServicesPlaySystemSound(soundID);
} // 开始播放音乐
+ (AVAudioPlayer *)playMusicWithMusicName:(NSString *)musicName
{
// 1.从字典中取出之前保存的播放器
AVAudioPlayer *player = _players[musicName]; // 2.判断播放器是否为nil,如果为空,则创建播放器
if (player == nil) {
// 2.1.加载对应的资源
NSURL *url = [[NSBundle mainBundle] URLForResource:musicName withExtension:nil]; // 2.2.创建播放器
player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; // 2.3.将播放器存入字典
[_players setObject:player forKey:musicName];
} // 3.播放音乐
[player play]; return player;
} // 暂停播放音乐
+ (void)pauseMusicWithMusicName:(NSString *)musicName
{
// 1.从字典中取出之前保存的播放器
AVAudioPlayer *player = _players[musicName]; // 2.判断播放器是否为空,如果不为空,则暂停
if (player) {
[player pause];
}
} // 停止播放音乐
+ (void)stopMusicWithMusicName:(NSString *)musicName
{
// 1.从字典中取出之前保存的播放器
AVAudioPlayer *player = _players[musicName]; // 2.判断播放器是否为空,如果不为空,则停止音乐
if (player) {
[player stop];
[_players removeObjectForKey:musicName];
}
} @end

抽取出这个工具类后,用法很简单

#import "CHGAudioTool.h"
// 开始播放
[CHGAudioTool playMusicWithMusicName:playingMusic.filename];
// 暂停播放
[CHGAudioTool pauseMusicWithMusicName:playingMusic.filename];
// 停止播放
[CHGAudioTool stopMusicWithMusicName:playingMusic.filename];

playingMusic.filename是你要操作的文件(比如: 小苹果.mp3)

iOS开发——高级篇——音频、音乐播放(封装类)的更多相关文章

  1. iOS开发拓展篇—音频处理(音乐播放器1)

    iOS开发拓展篇—音频处理(音乐播放器1) 说明:该系列文章通过实现一个简单的音乐播放器来介绍音频处理的相关知识点,需要重点注意很多细节的处理. 一.调整项目的结构,导入必要的素材 调整后的项目结构如 ...

  2. iOS开发拓展篇—音频处理(音乐播放器2)

    iOS开发拓展篇—音频处理(音乐播放器2) 说明:该文主要介绍音乐播放界面的搭建. 一.跳转 1.跳转到音乐播放界面的方法选择 (1)使用模态跳转(又分为手动的和自动的) (2)使用xib并设置跳转 ...

  3. iOS开发拓展篇—音频处理(音乐播放器3)

    iOS开发拓展篇—音频处理(音乐播放器3) 说明:这篇文章主要介绍音频工具类和播放工具类的封装. 一.控制器间数据传递 1.两个控制器之间数据的传递 第一种方法:self.parentViewCont ...

  4. iOS开发拓展篇—音频处理(音乐播放器4)

    iOS开发拓展篇—音频处理(音乐播放器4) 说明:该文主要介绍音乐播放器实现过程中的一些细节控制. 实现的效果: 一.完整的代码 YYPlayingViewController.m文件 // // Y ...

  5. iOS开发拓展篇—音频处理(音乐播放器5)

    iOS开发拓展篇—音频处理(音乐播放器5) 实现效果: 一.半透明滑块的设置 /** *拖动滑块 */ - (IBAction)panSlider:(UIPanGestureRecognizer *) ...

  6. iOS开发拓展篇—音频处理(音乐播放器6)

    iOS开发拓展篇—音频处理(音乐播放器6) 一.图片处理 说明: Aspect表示按照原来的宽高比进行缩放. Aspectfit表示按照原来的宽高比缩放,要求看到全部图片,后果是不能完全覆盖窗口,会留 ...

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

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

  8. iOS开发——高级篇——iOS开发之网络安全密码学

    一.非对称加密 - RSA : + 公钥加密,私钥解密: + 私钥加密,公钥解密: + 只能通过因式分解来破解 二.对称加密 - DES - 3DES - AES (高级密码标准,美国国家安全局使用, ...

  9. iOS开发——高级篇——线程同步、线程依赖、线程组

    前言 对于iOS开发中的网络请求模块,AFNet的使用应该是最熟悉不过了,但你是否把握了网络请求正确的完成时机?本篇文章涉及线程同步.线程依赖.线程组等专用名词的含义,若对上述名词认识模糊,可先进行查 ...

随机推荐

  1. Winform菜单和工具栏控件

    1.ContextMenuStrip--右键菜单 可以绑定在任何一个控件上,添加操作快捷键,并可以设置多层 每行相当于一个按钮,输入-可添加分割线 2.MenuStrip--菜单 优先级最高,一定会出 ...

  2. 2.bootstrap练习笔记-轮播图

    bootstrap练习笔记-轮播图 1.要使用轮播图,首先要将其放在一个主div里面 设置id为myCaroysel class为carousel slide 设置id是标识这个div是轮播图,等到l ...

  3. 【转】【C#】迭代器

    迭代器模式是设计模式中行为模式(behavioral pattern)的一个例子,他是一种简化对象间通讯的模式,也是一种非常容易理解和使用的模式.简单来说,迭代器模式使得你能够获取到序列中的所有元素而 ...

  4. React-Router学习整理

    欢迎大家指导与讨论 : ) 一.前言 本文摘要:react-router的基本用法,动画效果与路由,路由权限控制,路由离开确认,根据路由切分的按需加载,路由组件的属性.本文是笔者在学习时整理的笔记,由 ...

  5. Python-09-线程、进程、协程、异步IO

    0. 什么是线程(thread)? 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆 ...

  6. Multiple Contexts have a path of 错误

    1.问题描述 在eclipse里面启动tomcat的时候,看到报错,multiple contexts have a path.tomcat启动失败 2.解决办法 删除tomcat,重新加载部署tom ...

  7. Using Internal EEPROM of PIC Microcontroller

    There are commonly three types of memories in a PIC Microcontroller, Flash Program Memory, Data Memo ...

  8. Spring IOC容器创建对象的方式

    一.无参构造函数创建                                                                            我们用Spring创建Stu ...

  9. Centos7安装Mono(以4.6.0)为例

    本文记录mono安装的必须步骤,由于只是一个记录因此操作系统及mono版本都以当前环境为准. 1:环境依赖 操作系统为CentOS7.0,先安装mono依赖的各种组件: yum -y install ...

  10. 使用Swift打造动态库SDK和DemoAPP时所遇到的(Xcode7.3)

    使用Swift开发SDK的优点是,生成的SDK对于Obj-C或是Swift调用都不需要自己去建桥接文件,因为Swift的SDK打包时默认已经自动生成供OC调用的.h文件.OC调用时直接import,s ...