美文网首页
音频会话: AVAudioSession

音频会话: AVAudioSession

作者: 伯wen | 来源:发表于2016-11-04 14:41 被阅读306次

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

    相关文章

      网友评论

          本文标题:音频会话: AVAudioSession

          本文链接:https://www.haomeiwen.com/subject/yhoiuttx.html