一、简介


简单来说,音频可以分为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. Revolving Digits[EXKMP]

    Revolving Digits Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  2. 关于vs2012、tfs2012、windows server 2008r2一些记录

    windows server 2008r2安装在虚拟机中,装有tfs2012.sql server 2012. 物理机装有vs2012 1.用vs2012连接tfs时候,会让输入一个有效用户.输入的是 ...

  3. ReactNative新手学习之路04 组件化开发轮播图swiper支持安卓和IOS

    react native 新手之路04 组件化开发轮播图swiper支持安卓和IOS npm install react-native-carousel --save git 地址Properties ...

  4. Swift学习(二):自定义扩展方法(Extensions)

    扩展就是向一个已有的类.结构体或枚举类型添加新功能(functionality) 扩展可以 添加计算型属性和计算静态属性 定义实例方法和类型方法 提供新的构造器 定义下标 定义和使用新的嵌套类型 使一 ...

  5. C#软件设计——小话设计模式原则之:单一职责原则SRP

    前言:上篇C#软件设计——小话设计模式原则之:依赖倒置原则DIP简单介绍了下依赖倒置的由来以及使用,中间插了两篇WebApi的文章,这篇还是回归正题,继续来写写设计模式另一个重要的原则:单一职责原则. ...

  6. 备忘:mybatis 3的使用记录

    这是一篇记录.mybatis是一个部分模仿ORM的framework.是一个介于ORM和原始JDBC的框架.既可以提供ORM的操作对象的特性,又能从详细地控制最终的SQL.达到一个平衡.我们还是得写s ...

  7. 为什么 "auto a = 1;" 在C语言中可以编译通过?

    参照:这里 这让我想起之前看的一部书, int i; 其实是等价与 auto int i; 表示为局部变量 这应该与static是相对的吧?

  8. CSS继承的特殊性

    p{color:red;} .first{color:green;} <p class="first">三年级时,我还是一个<span>胆小如鼠</s ...

  9. MFC用户自定义消息

    之前做过佳能相机和位移平台的额二次开发,当时遇到一个棘手的问题,就是位移平台如何知道相机已经拍完照了,或者相机如何知道位移平台已经运行到指定位置,当时为了方便采用了定时器来定时检测位移平台的位置,结果 ...

  10. c# WebClient Get Post 方法

    public string GetData(string url) { string data; using (var client = new WebClient()) { using (var s ...