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

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

● 播放音频需要用到的框架

● AVFoundation.framework

音效的播放

// 1.获得音效文件的路径

NSURL *url = [[NSBundle mainBundle] URLForResource:@"m_03.wav" withExtension:nil];

// 2.加载音效文件,得到对应的音效ID

SystemSoundID soundID = 0;

AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url),&soundID);

// 3.播放音效

AudioServicesPlaySystemSound(soundID);

● 音效文件只需要加载1次

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

AudioServicesCreateSystemSoundID(CFURLRef inFileURL,SystemSoundID *outSystemSoundID)

● 释放音效资源
AudioServicesDisposeSystemSoundID(SystemSoundID inSystemSoundID)

● 播放音效
AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID)

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

音效格式

注意:硬件解码器一次只能对一个音频文件解码。

在实际应用中通常使用非压 缩的音频格式(AIFF)或者CAF音频格式,从而减低系统在音频解码上的消 耗,达到省电的目的
 

声音和音效小结——音频转换工具

●  转换aiff格式

●  afconvert -f AIFF -d I8 filename

●  转换caf格式

●  afconvert -f caff -d aac -b 32000 filename

●  批量转换

●  find . -name '*.mp3' -exec afconvert -f caff -d aac -b 32000 {} \;

音乐的播放

音乐播放用到一个叫做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;

流媒体播放

● 苹果自带有个AVPlayer和MPMoviePlayerController能播放流媒体音频,但是提供 的功能接又较少, 无法实现过于复杂和个性化的功能

●  如果想实现一些个性化\复杂的操作, 可以借助一些第三方框架轻易实现

●  DOUAudioStreamer : 产自天朝, 豆瓣出品

• https://github.com/douban/DOUAudioStreamer

● StreamingKit
• https://github.com/tumtumtum/StreamingKit

● FreeStreamer
• https://github.com/muhku/FreeStreamer

DOUAudioStreamer使用步骤

● DOUAudioStreamer使用步骤
● 导入src文件夹下面的所有源代码
● 导入依赖的框架
● 包含主头文件
• #import "DOUAudioStreamer.h"

● 新建一个遵守协议的模型类, 用于提供音频文件的远程路径
#import "DOUAudioStreamer.h"

@interface MJAudioFile : NSObject <DOUAudioFile>

/**
* 音频文件路径
*/

@property (strong, nonatomic) NSURL *audioFileURL;

@end
● 传入模型, 开始播放音频
self.audioStreamer = [DOUAudioStreamer streamerWithAudioFile:file];
[self.audioStreamer play];

● 可以通过KVO监听播放器的状态
[self.audioStreamer addObserver:self forKeyPath:MJStatusProp options:NSKeyValueObservingOptionNew context:nil];

[self.audioStreamer addObserver:self forKeyPath:MJDurationProp options:NSKeyValueObservingOptionNew context:nil];

[self.audioStreamer addObserver:self forKeyPath:MJBufferingRatioProp options:NSKeyValueObservingOptionNew context:nil];


● 暂停\停止播放
[self.audioStreamer pause];
[self.audioStreamer stop];

● 移除KVO监听

[self.audioStreamer removeObserver:self forKeyPath:MJStatusProp];
[self.audioStreamer removeObserver:self forKeyPath:MJDurationProp];
[self.audioStreamer removeObserver:self forKeyPath:MJBufferingRatioProp];

DOUAudioStreamer常见属性

● 新建一个遵守协议的模型类, 用于提供音频文件的远程路径
● @property(nonatomic,readonly)NSUIntegerexpectedLength;

• 文件的总大小

● @property(nonatomic,readonly)NSUIntegerreceivedLength;

• 目前已下载的文件大小

● @property(nonatomic,readonly)NSUIntegerdownloadSpeed;

• 下载速度

● @property(nonatomic,assign,readonly)doublebufferingRatio;

• 缓冲比例

● @property(nonatomic,assign)double volume;

• 音量

● @property(nonatomic,readonly)NSString*cachedPath;

• 缓存路径(在沙盒的tmp目录, 随时会被删除)

● @property(nonatomic,assign,readonly)NSTimeInterval duration;

• 歌曲的总时长

● @property(nonatomic,assign)NSTimeIntervalcurrentTime;

• 歌曲的当前播放时长

● @property(assign,readonly)DOUAudioStreamerStatusstatus;

• 播放器状态


DOUAudioStreamerStatus

● 播放器状态
typedef NS_ENUM(NSUInteger, DOUAudioStreamerStatus) {

DOUAudioStreamerPlaying, // 正在播放

DOUAudioStreamerPaused, // 暂停

DOUAudioStreamerIdle, // 停止播放

DOUAudioStreamerFinished, //播放完毕

DOUAudioStreamerBuffering, // 正在缓冲

DOUAudioStreamerError // 播放错误

};

最新文章

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统(35)-文章发布系统②-构建项目
  2. intel82599在centos6.5下编译安装
  3. Asprise-OCR的使用
  4. TestLink测试软件安装条件检查不通过的解决方案
  5. 【Java】代处理?代理模式 - 静态代理,动态代理
  6. zabbix3.0.4 部署之二 (Centos6.5系统准备)
  7. JS 获取 本周、本月、本季度、本年、上月、上周、上季度、去年
  8. QQ空间开放平台开发教程-SDK和API的使用
  9. C10K及C100K问题探讨 &amp; 怎么应对大流量大并发
  10. hdu2093
  11. phpMyAdmin 完整路径泄露漏洞
  12. UESTC_菲波拉契数制升级版 2015 UESTC Training for Dynamic Programming&lt;Problem L&gt;
  13. CodeSmith 模版
  14. Spring MVC RedirectAttributes的用法解决办法
  15. (三)Jquery Mobile按钮详细讲解
  16. 常用的DDL语句
  17. WebPackBrows
  18. fiddler 笔记-重定向
  19. Spring Boot应用的后台运行配置(转载)
  20. SciTe设置

热门文章

  1. 杭电ACM hdu 2079 选课时间 (模板)
  2. day21 pickle json shelve configpaser 模块
  3. 《mac的git安装手册-1》
  4. PCB的版本控制
  5. [转]理解js中的原型链,prototype与__proto__的关系
  6. jemeter的简单使用
  7. Flume启动错误之:Bootstrap Servers must be specified
  8. zuul路由网关
  9. 使用taobao的npm镜像源,同时安装nrm镜像工具
  10. HDU 2389 ——Rain on your Parade——————【Hopcroft-Karp求最大匹配、sqrt(n)*e复杂度】