音频会话: AVAudioSession
2016-11-04 本文已影响306人
伯wen
音频会话在引用程序和操作系统之间扮演者中间人的角色, 他提供了一种简单实用的方法使OS得知应用程序应该如何与iOS音频环境进行交互
音频会话的分类
- AV Foundation定义了7种分类来描述应用程序所使用的音频行为, 如下所示:
// 游戏、效率应用程序
AVF_EXPORT NSString *const AVAudioSessionCategoryAmbient;
// 游戏、效率应用程序(默认)
AVF_EXPORT NSString *const AVAudioSessionCategorySoloAmbient;
// 音频和视频播放器
AVF_EXPORT NSString *const AVAudioSessionCategoryPlayback;
// 录音机、音频捕捉
AVF_EXPORT NSString *const AVAudioSessionCategoryRecord;
// Voip、语音聊天
AVF_EXPORT NSString *const AVAudioSessionCategoryPlayAndRecord;
// 离线会话和处理
AVF_EXPORT NSString *const AVAudioSessionCategoryAudioProcessing;
// 使用外部硬件的高级A/V应用程序
AVF_EXPORT NSString *const AVAudioSessionCategoryMultiRoute
- 为应用程序选择合适的分类时, 需要知道该应用程序的核心功能是什么, 比如音频播放的功能在应用程序中是核心功能还是次要功能? 应用程序的音频是否可以和背景声音相混合等
- 虽然使用默认的AudioSession配置会获得很好的效果, 但是需要记住的是, 对于一个上架app来说, 只有两种情况适用于使用默认的配置, 其他任何环境, 都不要使用默认的AudioSession配置
- 你的app只使用System sound services 或者 UIKit中的playInputClick方法来播放音频
- 你的app完全不使用任何的音频
使用AVAudioPlayer播放音频
- 功能
- 播放本地音乐
- 属性和方法
// 初始化方法
- (nullable instancetype)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError;
- (nullable instancetype)initWithData:(NSData *)data error:(NSError **)outError;
- (nullable instancetype)initWithContentsOfURL:(NSURL *)url fileTypeHint:(NSString * __nullable)utiString error:(NSError **)outError;
- (nullable instancetype)initWithData:(NSData *)data fileTypeHint:(NSString * __nullable)utiString error:(NSError **)outError;
// 预加载, 当播放器调用play时会自动调动本方法, 如果不调用play先调用prepareToPlay, 那么会减少点击play后到听到声音这段所需时间
- (BOOL)prepareToPlay;
// 播放, 会自动调用prepareToPlay方法
- (BOOL)play;
// 在哪个时间开始播放, time的值必须大于deviceCurrentTime的时间
- (BOOL)playAtTime:(NSTimeInterval)time;
// 暂停, 不撤销底层prepareToPlay配置
- (void)pause;
// 停止, 撤销底层prepareToPlay配置
- (void)stop;
// 只读属性, 是否正在播放
@property(readonly, getter=isPlaying) BOOL playing;
// 只读属性
@property(readonly) NSUInteger numberOfChannels;
// 只读属性, 当前播放音乐的时间总长度
@property(readonly) NSTimeInterval duration;
// 代理
@property(assign, nullable) id<AVAudioPlayerDelegate> delegate;
// 当前播放的音频的url
@property(readonly, nullable) NSURL *url;
// 当前播放的音频的data
@property(readonly, nullable) NSData *data;
// 立体声 取值 -1.0(极左) ~ 1.0(极右), 默认0.0(中间)
@property float pan;
// 声音大小
@property float volume;
- (void)setVolume:(float)volume fadeDuration:(NSTimeInterval)duration;
// 如果想要设置rate属性并生效, 必须设置enableRate = YES, 并且enableRate属性必须在prepareToPlay方法调用之前设置
@property BOOL enableRate;
// 播放速度, 取值0.5(半速) ~ 2.0(二倍速度), 默认1.0(正常)
@property float rate;
// 播放音频的当前时间, 可以改变这个值来改变当前音频播放的进度
@property NSTimeInterval currentTime;
// 音频相对于设备的当前时间, 可以通过[player playAtTime:[AVAudioPlayer deviceCurrentTime] + 0.01]设置在0.01秒后播放音频
@property(readonly) NSTimeInterval deviceCurrentTime;
// 播放次数, -1为无限循环
@property NSInteger numberOfLoops;
@property(readonly) NSDictionary<NSString *, id> *settings;
// 音频格式
@property(readonly) AVAudioFormat *format NS_AVAILABLE(10_12, 10_0);
@property(getter=isMeteringEnabled) BOOL meteringEnabled;
- (void)updateMeters;
// 获取指定通道的峰值功率
- (float)peakPowerForChannel:(NSUInteger)channelNumber;
// 获取指定通道的平均功率
- (float)averagePowerForChannel:(NSUInteger)channelNumber;
@property(nonatomic, copy, nullable) NSArray<AVAudioSessionChannelDescription *> *channelAssignments;