● 音乐• 比如游戏中的“背景音乐”,一般播放时间较长
● 播放音频需要用到的框架
● 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使用步骤
@interface MJAudioFile : NSObject <DOUAudioFile>
/** * 音频文件路径*/
@property (strong, nonatomic) NSURL *audioFileURL;
@end
● 可以通过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)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
DOUAudioStreamerPlaying, // 正在播放
DOUAudioStreamerPaused, // 暂停
DOUAudioStreamerIdle, // 停止播放
DOUAudioStreamerFinished, //播放完毕
DOUAudioStreamerBuffering, // 正在缓冲
DOUAudioStreamerError // 播放错误
};