说明
● 简单来说,音频可以分为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 // 播放错误

};

IOS 音频的 使用说明的更多相关文章

  1. 一篇对iOS音频比较完善的文章

    转自:http://www.cnblogs.com/iOS-mt/p/4268532.html 感谢作者:梦想通 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改我也 ...

  2. iOS音频AAC视频H264编码 推流最佳方案

    iOS音频AAC视频H264编码 推流最佳方案 项目都是个人的调研与实验,可能很多不好或者不对的地方请多包涵. 1    功能概况 *  实现音视频的数据的采集 *  实现音视频数据的编码,视频编码成 ...

  3. IOS 音频开发文件大小计算

    音频基础知识 音频文件计算大小 音频转码 标签(空格分隔): 调查 IOS音频 https://developer.apple.com/library/ios/documentation/MusicA ...

  4. iOS音频处理

    ios音频处理 1. iOS底层音频处理技术(带源代码) http://www.cocoachina.com/ios/20111122/3563.html 2.ios 音频入门 http://blog ...

  5. IOS 音频播放

    iOS音频播放 (一):概述 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改我也因此对于iOS下的音频播放实现有了一定的研究.写这个系列的博客目的一方面希望能够抛砖 ...

  6. iOS音频播放(一):概述

    (本文转自码农人生) 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改,我也因此对于iOS下的音频播放实现有了一定的研究.写这个 系列的博客目的一方面希望能够抛砖引玉 ...

  7. IOS音频1:之采用四种方式播放音频文件(一)AudioToolbox AVFoundation OpenAL AUDIO QUEUE

    本文转载至 http://blog.csdn.net/u014011807/article/details/40187737 在本卷你可以学到什么? 采用四种方法设计应用于各种场合的音频播放器: 基于 ...

  8. iOS 音频视频图像合成那点事

    代码地址如下:http://www.demodashi.com/demo/13420.html 人而无信不知其可 前言 很久很久没有写点什么了,只因为最近事情太多了,这几天终于闲下来了,趁此机会,记录 ...

  9. iOS音频合并

    iOS音频合并 最近遇到一个需求,客户录音试听一下可以,就继续向下录制,当客户录制完成后,需要把前面录制的试听音频和后面的音频进行合并.最初想到的方法,使用NSData对两个音频文件进行合并,但是合并 ...

随机推荐

  1. B. Sereja and Suffixes

    B. Sereja and Suffixes time limit per test 1 second memory limit per test 256 megabytes input standa ...

  2. linux中firewall与iptables防火墙服务

    火墙firewall-cmd --state 查看火墙的状态firewall-cmd --get-active-zones 目前所处的域firewall-cmd --get-default-zone ...

  3. 缓存算法及Redis、Memcached、Guava、Ehcache中的算法

    https://my.oschina.net/ffy/blog/501003 https://yq.aliyun.com/articles/622757 https://blog.csdn.net/s ...

  4. spring AOP正则表达式的几个问题

    基于包名的正则表达式,是根据抽象父类的包名过滤,还是实现类的包名过滤, 还是抽象父类实现的接口的包名过滤? org.springframework.aop.aspectj.AspectJExpress ...

  5. indexOf 可用于字符串和数组

    indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. indexOf 与String类似,Array也可以通过indexOf()来搜索一个指定的元素的位置: var arr = ...

  6. free -m命令输出详解

    free -m输出有3行: Mem:表示物理内存 -/+ buffers/cached:表示物理内存缓存 Swap:表示硬盘交换分区 其中Mem中的total.used.free.shared.buf ...

  7. 快速排序算法的实现 && 随机生成区间里的数 && O(n)找第k小 && O(nlogk)找前k大

    思路:固定一个数,把这个数放到合法的位置,然后左边的数都是比它小,右边的数都是比它大 固定权值选的是第一个数,或者一个随机数 因为固定的是左端点,所以一开始需要在右端点开始,找一个小于权值的数,从左端 ...

  8. CAD安装失败怎样卸载CAD 2010?错误提示某些产品无法安装

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  9. SSM项目spring配置文件详细步骤(分门别类、灵巧记忆)

    spring-dao.xml文件 1.配置外部db.property文件: <context:property-placeholder location="classpath:jdbc ...

  10. stm32中断优先级快速入门

    1.基本概念 STM32(Cortex-M3架构)中有两个优先级的概念--抢占式优先级和响应优先级.有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级. 具有高抢占式优 ...