2018.02.03 11:22* 字数 2157 阅读 1876评论 2喜欢 15
1. AVAudioSession 概述
最近一年一直在做IPC Camera的iOS客户端开发。和音频打交道,必须要弄清楚
AVAudioSession。
先看下苹果的官方图:
Audio Session
可以看到AVAudioSession就是用来管理多个APP对音频硬件设备(麦克风,扬声器)的资源使用。
举例一下AVAudioSession可以做这些事情
-
设置自己的APP是否和其他APP音频同时存在,还是中断其他APP声音
-
在手机调到静音模式下,自己的APP音频是否可以播放出声音
-
电话或者其他APP中断自己APP的音频的事件处理
-
指定音频输入和输出的设备(比如是听筒输出声音,还是扬声器输出声音)
-
是否支持录音,录音同时是否支持音频播放
2. AVAudioSession Category
AVAudioSession的接口比较简单。APP启动的时候会自动帮激活AVAudioSession,当然我们可以手动激活代码如下。
可以看到设置session这里有两个参数,category和options
Category iOS下目前有七种,每种Category都对应是否支持下面四种能力
-
Interrupts non-mixable apps audio:是否打断不支持混音播放的APP
-
Silenced by the Silent switch:是否会响应手机静音键开关
-
Supports audio input:是否支持音频录制
-
Supports audio output:是否支持音频播放
下面用图表来直观的看下每种category具体的能力集
Category
|
是否允许音频播放/录音
|
是否打断其他不支持混音APP
|
是否会被静音键或锁屏键静音
|
AVAudioSessionCategoryAmbient
|
只支持播放
|
否
|
是
|
AVAudioSessionCategoryAudioProcessing
|
不支持播放,不支持录制
|
是
|
否
|
AVAudioSessionCategoryMultiRoute
|
支持播放,支持录制
|
是
|
否
|
AVAudioSessionCategoryPlayAndRecord
|
支持播放,支持录制
|
默认YES,可以重写为NO
|
否
|
AVAudioSessionCategoryPlayback
|
只支持播放
|
默认YES,可以重写为NO
|
否
|
AVAudioSessionCategoryRecord
|
只支持录制
|
是
|
否(锁屏下仍可录制)
|
AVAudioSessionCategorySoloAmbient
|
只支持播放
|
是
|
是
|
-
AVAudioSessionCategoryAmbient,只支持音频播放。这个 Category,音频会被静音键和锁屏键静音。并且不会打断其他应用的音频播放。
-
AVAudioSessionCategorySoloAmbient,这个是系统默认使用的 Category,只支持音频播放。音频会被静音键和锁屏键静音。和AVAudioSessionCategoryAmbient不同的是,这个会打断其他应用的音频播放
-
AVAudioSessionCategoryPlayback,只支持音频播放。你的音频不会被静音键和锁屏键静音。适用于音频是主要功能的APP,像网易云这些音乐app,锁屏后依然可以播放。
需要注意一下,选择支持在静音键切到静音状态以及锁屏键切到锁屏状态下仍然可以播放音频 Category 时,必须在应用中开启支持后台音频功能,详见
UIBackgroundModes
。
-
AVAudioSessionCategoryRecord,只支持音频录制。不支持播放。
-
AVAudioSessionCategoryPlayAndRecord,支持音频播放和录制。音频的输入和输出不需要同步进行,也可以同步进行。需要音频通话类应用,可以使用这个 Category。
-
AVAudioSessionCategoryAudioProcessing,只支持本地音频编解码处理。不支持播放和录制。
-
AVAudioSessionCategoryMultiRoute,支持音频播放和录制。允许多条音频流的同步输入和输出。(比如USB连接外部扬声器输出音频,蓝牙耳机同时播放另一路音频这种特殊需求)
我们也可以通过AVAudioSession的属性来读取当前设备支持的Category
这样可以保证设备兼容性。
设置Category的代码示例如下
3. AVAudioSession Mode&&Options
刚刚介绍的Category定义了七种主场景,实际开发需求中有时候需要对Category进行微调整,我们发现这个接口还有两个参数Mode和Options。
AVAudioSession Mode
我们通过读取下面这条属性获取当前设备支持的Mode
iOS下有七种mode来定制我们的Category行为
模式
|
兼容的 Category
|
场景
|
AVAudioSessionModeDefault
|
All
|
默认模式
|
AVAudioSessionModeVoiceChat
|
AVAudioSessionCategoryPlayAndRecord
|
VoIP
|
AVAudioSessionModeGameChat
|
AVAudioSessionCategoryPlayAndRecord
|
游戏录制,GKVoiceChat自动设置
|
AVAudioSessionModeVideoRecording
|
AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryRecord
|
录制视频
|
AVAudioSessionModeMoviePlayback
|
AVAudioSessionCategoryPlayback
|
视频播放
|
AVAudioSessionModeMeasurement
|
AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryRecord AVAudioSessionCategoryPlayback
|
最小系统
|
AVAudioSessionModeVideoChat
|
AVAudioSessionCategoryPlayAndRecord
|
视频通话
|
下面逐一介绍下每个Mode
-
AVAudioSessionModeDefault,默认模式,与所有的 Category 兼容
-
AVAudioSessionModeVoiceChat,适用于VoIP 类型的应用。只能是 AVAudioSessionCategoryPlayAndRecord Category下。在这个模式系统会自动配置AVAudioSessionCategoryOptionAllowBluetooth 这个选项。系统会自动选择最佳的内置麦克风组合支持语音聊天。
-
AVAudioSessionModeVideoChat,用于视频聊天类型应用,只能是 AVAudioSessionCategoryPlayAndRecord Category下。适在这个模式系统会自动配置 AVAudioSessionCategoryOptionAllowBluetooth 和 AVAudioSessionCategoryOptionDefaultToSpeaker 选项。系统会自动选择最佳的内置麦克风组合支持视频聊天。
-
AVAudioSessionModeGameChat,适用于游戏类应用。使用 GKVoiceChat 对象的应用会自动设置这个模式和 AVAudioSessionCategoryPlayAndRecord Category。实际参数和AVAudioSessionModeVideoChat一致
-
AVAudioSessionModeVideoRecording,适用于使用摄像头采集视频的应用。只能是 AVAudioSessionCategoryPlayAndRecord 和 AVAudioSessionCategoryRecord 这两个 Category下。这个模式搭配 AVCaptureSession API 结合来用可以更好地控制音视频的输入输出路径。(例如,设置 automaticallyConfiguresApplicationAudioSession 属性,系统会自动选择最佳输出路径。
-
AVAudioSessionModeMeasurement,最小化系统。只用于 AVAudioSessionCategoryPlayAndRecord、AVAudioSessionCategoryRecord、AVAudioSessionCategoryPlayback 这几种 Category。
-
AVAudioSessionModeMoviePlayback,适用于播放视频的应用。只用于 AVAudioSessionCategoryPlayback 这个Category。
AVAudioSession Options
我们还可以使用options去微调Category行为,如下表
Option
|
Option功能说明
|
兼容的 Category
|
AVAudioSessionCategoryOptionMixWithOthers
|
支持和其他APP音频 mix
|
AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryPlayback AVAudioSessionCategoryMultiRoute
|
AVAudioSessionCategoryOptionDuckOthers
|
系统智能调低其他APP音频音量
|
AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryPlayback AVAudioSessionCategoryMultiRoute
|
AVAudioSessionCategoryOptionAllowBluetooth
|
支持蓝牙音频输入
|
AVAudioSessionCategoryRecord AVAudioSessionCategoryPlayAndRecord
|
AVAudioSessionCategoryOptionDefaultToSpeaker
|
设置默认输出音频到扬声器
|
AVAudioSessionCategoryPlayAndRecord
|
调优我们的Category
通过Category和合适的Mode和Options的搭配我们可以调优出我们的效果,下面举两个应用场景:
用过高德地图的都知道,在后台播放QQ音乐的时候,如果导航语音出来,QQ音乐不会停止,而是被智能压低和混音,等导航语音播报完后,QQ音乐正常播放,这里我们需要后台播放音乐,所以Category使用AVAudioSessionCategoryPlayback,需要混音和智能压低其他APP音量,所以Options选用 AVAudioSessionCategoryOptionMixWithOthers和AVAudioSessionCategoryOptionDuckOthers
代码示例如下
又或者我希望AVAudioSessionCategoryPlayAndRecord这个Category默认的音频由扬声器播放,那么可以调用这个接口去调整Category
通过选择合适和Category,mode和options,就可以调优音频的输入输出,来满足日常开发需求(需要注意的是Category,mode,option是搭配使用的,而不是简单组合,也就是说某种Category支持某些mode和option,从上面的表中也可以看出这一点)
4. 音频中断处理
其他APP或者电话会中断我们的APP音频,所以相应的我们要做出处理。
我们可以通过监听AVAudioSessionInterruptionNotification这个key获取音频中断事件
回调回来Userinfo有键值
-
AVAudioSessionInterruptionTypeKey:
取值AVAudioSessionInterruptionTypeBegan表示中断开始
取值AVAudioSessionInterruptionTypeEnded表示中断结束
中断开始:我们需要做的是保存好播放状态,上下文,更新用户界面等
中断结束:我们要做的是恢复好状态和上下文,更新用户界面,根据需求准备好之后选择是否激活我们session。
选择不同的音频播放技术,处理中断方式也有差别,具体如下:
-
System Sound Services:使用 System Sound Services 播发音频,系统会自动处理,不受APP控制,当中断发生时,音频播放会静音,当中断结束后,音频播放会恢复。
-
AV Foundation framework:AVAudioPlayer 类和 AVAudioRecorder 类提供了中断开始和结束的 Delegate 回调方法来处理中断。中断发生,系统会自动停止播放,需要做的是记录播放时间等状态,更新用户界面,等中断结束后,再次调用播放方法,系统会自动激活session。
-
Audio Queue Services, I/O audio unit:使用aduio unit这些技术需要处理中断,需要做的是记录播放或者录制的位置,中断结束后自己恢复audio session。
-
OpenAL:使用 OpenAL 播放时,同样需要自己监听中断。管理 OpenAL上下文,用户中断结束后恢复audio session。
需要注意的是:1. 有中断开始事件,不一定对应有中断结束事件,所以需要在用户进入前台,点击UI操作的时候,需要保存好播放状态和对Audio Session管理,以便不影响APP的音频功能。2.音频资源竞争上,一定是电话优先。3. AVAudioSession同样可以监听外设音频状态,比如耳机拔入拔出。这里不做累述
5. AVAudioSession总结
AVAudioSession的作用就是管理音频这一唯一硬件资源的分配,通过调优合适的AVAudioSession来适配我们的APP对于音频的功能需求。切换音频场景时候,需要相应的切换AVAudioSession。
iOS 音频-AVAudioSession 安东_Ace 关注2018.02.03 11:22* 字数 2157 阅读 1876评论 2喜欢 151. AVAudioSession 概述最近一年一直在做IPC Camera的iOS客户端开发。和音频打交道,必须要弄清楚AVAudioSession。先看下苹果的官方图: Audio Session可以看到AVAud...
这个星期我完成了一个具有基本录音和回放的功能,一开始也不知道从何入手,也查找了很多相关的资料。与此同时,我也学会了很多关于
音频
方面的东西,这也对后面的录音配置有一定的帮助。其中参照了《iPhone开发之
音频
: 文件和数据类型(一)》,启发比较大。
一、
音频
格式
iPhone上支持的
音频
编码格式还是比较多的,而且有很多我是以前听都没有听过的。我就先简单列出来(以下是摘录自《iPhone开发...
An intermediary object that communicates to the system how you intend to use
audio
in your app
扮演一个中间人角色,告知系统,你的app中是如何使用
音频
的
所有的
iOS
和tvOS应用程序都有
音频
会话,并...
原文选择一个Categorypragma mark – Values for the category property –
/* Use this category for background sounds such as rain, car engine noise, etc. Mixes with other music. */
AV
F_EXPORT
NSString *const A
音频
输出作为硬件资源,对于
iOS
系统来说是唯一的,那么要如何协调和各个App之间对这个稀缺的硬件持有关系呢?
iOS
给出的解决方案是"
AV
Audio
Session
" ,通过它可以实现对App
当前
上下文
音频
资源的控制,比如
插拔耳机、接电话、是否和其他
音频
数据混音等。当你遇到:
是进行录音还是播放
AV
Audio
Session
蓝牙支持源码
增加
AV
Audio
Session
蓝牙的支持实际上比你想象的代码要少的多。事实上,整个
audio
session
API很简单,以至于开发要么很容易要么异常困难。猜猜哪个分类
AV
Audio
Session
蓝牙支持集成?
据我所知增加蓝牙到
AV
Audio
Session
包括很多特性。让我们逐一展开:
打开bluetooth
audio
首先,你需要明确地
遇见一个需求,耳机插入播放一种
音频
文件,未插入播放另外一种.代码逻辑写好了以后,发现判断耳机插入逻辑走不通.
最后发现在
AV
Audio
Session
Port,我的蓝牙耳机类型是
AV
Audio
Session
PortBluetoothA2DP,而代码逻辑只判断了
AV
Audio
Session
PortHeadphones.
所以整理一下
AV
Audio
Session
Port的输出设备类型:
1、
AV
A...
1. 什么是
AV
Foundation?
AV
Foundation是苹果公司提供的一个多媒体处理框架,它能够处理
音频
、视频、文本和图像等媒体类型,还能够实现录制、编辑、播放等多种操作。
2.
AV
Foundation的优点是什么?
AV
Foundation有以下几个优点:
- 它可以在多个平台上使用,包括
iOS
、macOS和tvOS等。
- 它提供了灵活的API,可以对多种媒体类型进行处理。
- 它支持硬件加速,能够提高处理速度和性能。
- 它支持多种格式的媒体文件,包括MP3、AAC、H.264和MPEG-4等。
3. 如何使用
AV
Foundation实现
音频
录制?
在使用
AV
Foundation实现
音频
录制时,需要执行以下步骤:
- 创建一个
AV
Audio
Session
对象,用于管理
音频
会话。
- 创建一个
AV
Audio
Recorder对象,用于录制
音频
。
- 配置录音参数,例如
音频
格式、采样率、通道数、
音频
质量等。
- 调用
AV
Audio
Recorder的record方法开始录音。
- 调用
AV
Audio
Recorder的stop方法停止录音。
4.
AV
Foundation中的
AV
PlayerLayer是什么?
AV
PlayerLayer是一个CALayer子类,用于在
iOS
和macOS应用程序中显示视频内容。它可以显示一个
AV
Player对象的输出,并且支持全屏播放、画中画、视频内容缩放等功能。
5. 如何使用
AV
Foundation实现视频播放?
在使用
AV
Foundation实现视频播放时,需要执行以下步骤:
- 创建一个
AV
Player对象,用于播放视频。
- 创建一个
AV
PlayerLayer对象,用于显示视频内容。
- 将
AV
PlayerLayer对象添加到视图层次结构中。
- 创建一个
AV
PlayerItem对象,用于管理视频资源。
- 调用
AV
Player的replaceCurrentItemWithPlayerItem方法将
AV
PlayerItem与
AV
Player关联。
- 调用
AV
Player的play方法开始播放视频。
6. 如何在
AV
Foundation中实现视频编辑?
在
AV
Foundation中实现视频编辑通常需要使用
AV
Asset、
AV
AssetTrack、
AV
Composition、
AV
MutableComposition等类。以下是实现视频编辑的大致步骤:
- 创建一个
AV
Asset对象,用于表示视频资源。
- 创建一个
AV
MutableComposition对象,用于管理视频资源。
- 使用
AV
AssetTrack
获取
视频的
音频
和视频轨道。
- 使用
AV
MutableCompositionTrack将
音频
和视频轨道添加到
AV
MutableComposition中。
- 使用
AV
AssetExport
Session
导出编辑后的视频。
7.
AV
Foundation中的
AV
Capture
Session
是什么?
AV
Capture
Session
是用于管理视频和
音频
输入
的会话对象。它可以管理多个
输入
设备(例如摄像头、麦克风等)并且可以将它们合并到单个输出中。使用
AV
Capture
Session
可以方便地实现视频录制、视频流传输、实时视频分析等功能。
CSDN-Ada助手:
NSS 编译
u011052960:
Windows下 WebRTC Demo运行: PeerConnection
pskyfly: