IOS 音频的 使用说明
● 音效
• 又称“短音频”,通常在程序中的播放时长为1~2秒
● 音乐
• 比如游戏中的“背景音乐”,一般播放时间较长
● 播放音频需要用到的框架
● AVFoundation.framework
音效的播放
// 1.获得音效文件的路径
// 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)
音效格式
注意:硬件解码器一次只能对一个音频文件解码。
声音和音效小结——音频转换工具
● 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;
>.音量
@property float volume;
>.是否允许更改速率
@property BOOL enableRate;
>.播放速率(1是正常速率,0.5是一般速率,2是双倍速率)
@property float rate;
>.有多少个声道
@property(readonly) NSUInteger numberOfChannels;
流媒体播放
● 如果想实现一些个性化\复杂的操作, 可以借助一些第三方框架轻易实现
● DOUAudioStreamer : 产自天朝, 豆瓣出品
• https://github.com/douban/DOUAudioStreamer
● StreamingKit
• https://github.com/tumtumtum/StreamingKit
● FreeStreamer
• https://github.com/muhku/FreeStreamer
DOUAudioStreamer使用步骤
● 导入src文件夹下面的所有源代码
● 导入依赖的框架
● 包含主头文件
• #import "DOUAudioStreamer.h"
@interface MJAudioFile : NSObject <DOUAudioFile>
/**
* 音频文件路径
*/
@property (strong, nonatomic) NSURL *audioFileURL;
@end
self.audioStreamer = [DOUAudioStreamer streamerWithAudioFile:file];
● 可以通过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];
● 移除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 // 播放错误
};
最新文章
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(35)-文章发布系统②-构建项目
- intel82599在centos6.5下编译安装
- Asprise-OCR的使用
- TestLink测试软件安装条件检查不通过的解决方案
- 【Java】代处理?代理模式 - 静态代理,动态代理
- zabbix3.0.4 部署之二 (Centos6.5系统准备)
- JS 获取 本周、本月、本季度、本年、上月、上周、上季度、去年
- QQ空间开放平台开发教程-SDK和API的使用
- C10K及C100K问题探讨 &; 怎么应对大流量大并发
- hdu2093
- phpMyAdmin 完整路径泄露漏洞
- UESTC_菲波拉契数制升级版 2015 UESTC Training for Dynamic Programming<;Problem L>;
- CodeSmith 模版
- Spring MVC RedirectAttributes的用法解决办法
- (三)Jquery Mobile按钮详细讲解
- 常用的DDL语句
- WebPackBrows
- fiddler 笔记-重定向
- Spring Boot应用的后台运行配置(转载)
- SciTe设置
热门文章
- 杭电ACM hdu 2079 选课时间 (模板)
- day21 pickle json shelve configpaser 模块
- 《mac的git安装手册-1》
- PCB的版本控制
- [转]理解js中的原型链,prototype与__proto__的关系
- jemeter的简单使用
- Flume启动错误之:Bootstrap Servers must be specified
- zuul路由网关
- 使用taobao的npm镜像源,同时安装nrm镜像工具
- HDU 2389 ——Rain on your Parade——————【Hopcroft-Karp求最大匹配、sqrt(n)*e复杂度】