音频会话: AVAudioSession

音频会话在引用程序和操作系统之间扮演者中间人的角色, 他提供了一种简单实用的方法使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 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 *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 *channelAssignments; 

你可能感兴趣的:(音频会话: AVAudioSession)