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编译的博客,我觉得这个主题很实用,对其他用户来说也非常有帮助。下一篇博客,我建议你可以写一篇关于Linux系统的内核编译技巧,包括编译选项、交叉编译等方面的内容,相信会有更多读者受益。加油! 为了方便博主创作,提高生产力,CSDN上线了AI写作助手功能,就在创作编辑器右侧哦~(https://mp.csdn.net/edit?utm_source=blog_comment_recall )诚邀您来加入测评,到此(https://activity.csdn.net/creatActivity?id=10450&utm_source=blog_comment_recall)发布测评文章即可获得「话题勋章」,同时还有机会拿定制奖牌。 NSS 编译 u011052960: 您好,请问最新的nss怎么编译成功呢。我一直提示dont guess host type Windows下 WebRTC Demo运行: PeerConnection pskyfly: 对于版本较新的webrtc源码应该改成这样: //修改后 bool Conductor::CreatePeerConnection(bool dtls) { RTC_DCHECK(peer_connection_factory_); RTC_DCHECK(!peer_connection_); webrtc::PeerConnectionInterface::RTCConfiguration config; config.sdp_semantics = webrtc::SdpSemantics::kUnifiedPlan; config.enable_dtls_srtp = dtls; //turn服务器配置 webrtc::PeerConnectionInterface::IceServer server; server.uri = "turn:your-ip:3478"; server.username = "admin"; // turn服务器的用户名 server.password = "123456"; // turn服务器的密码 config.servers.push_back(server); config.tcp_candidate_policy = webrtc::PeerConnectionInterface::kTcpCandidatePolicyDisabled; config.disable_ipv6 = true; config.disable_ipv6_on_wifi = true; peer_connection_ = peer_connection_factory_->CreatePeerConnection( config, nullptr, nullptr, this); return peer_connection_ != nullptr; Windows下 WebRTC Demo运行: PeerConnection pskyfly: 请问博主在公网成功过吗