头图

「融合通信常见问题」月刊将在每月末与大家见面,该月刊主要包括错题集、知识加油站、技术加餐三大板块,汇集实践过程中的易错问题和解题思路,分享融合通信领域的前沿资讯和技术干货,为您的开发提效加速,为您的进阶之路添砖加瓦。

本期内容概览

看这里!别人踩过的坑快绕开!

Mac 端使用 Type-C 耳机说话别人听不到;

声音从蓝牙耳机播放切换到外放;

退到后台一段时间后再说话,对方听不到声音;

iOS 端呼叫组件初始化时 APP 卡死;

小程序说话,Native 听不到;

发送信息失败;

因加密模式问题无法上架到 Google 商店;

App 启动时,应用使用不流畅

......

这些知识点你知道吗:

直播场景与通信场景有什么区别?

SDK 支持的 QoS 策略是什么意思?

如何处理无声问题?

如何处理回声问题?

这些干货也不容错过!

网易会议组件正式开源

网易会议开源之移动端篇、桌面端篇

RTC 音频质量评价和保障

Gitlab-ci 替代 webhook 触发Jenkins job

SQLite 简介

20万字《网易智企技术合辑》重磅发布

一、错题集

音视频通话

疑难问题 1:

Mac 端插入 Type-C 耳机之后说话,其他端听不到。

易错等级:⭐⭐⭐⭐

错题原因:

Mac 对于 Type-C 耳机的适配有问题,Mac 端在插入 Type-C 耳机后,说话时系统声音面板中的输入电平很低或者几乎没有,而且在该情况下,市面上其他的通话软件效果均一致。因此判断无法正常使用 Type-C 的耳机是 Mac 对于 Type-C 耳机的适配不好导致。

image.png
解题思路:

建议可以更换其他耳机或者使用系统麦克风通话。

疑难问题 2:

音视频发送音频流,接收端听到的声音异常,从蓝牙耳机播放切换到外放。

接收端一开始听到的声音是通过蓝牙耳机播放的,在调用 enableLocalAudio 设置成 true 之后,声音异常变为外放,再次调用 enableLocalAudio 设置成 false 之后,声音恢复通过蓝牙耳机播放。

易错等级:⭐⭐⭐

错题原因:

iOS 的音频是通过 AVAudioSession 管理的,是单例类,不止 SDK 可以调用,客户业务层也可以修改 AVAudioSession 的 option,这个问题现象看跟调用 SDK 的方法有关,实际上是在调用 SDK 方法的时候,客户业务层有调用修改 AVAudioSession 的 option,修改成了外放类型 AVAudioSessionCategoryOptionDefaultToSpeaker。

解题思路:

业务层有使用到 AVAudioSession 的时候,注意管理好业务层的调用。在通过 SDK 进行音频输出的时候避免修改 AVAudioSession。

疑难问题 3:

Android 端发送音视频/纯音频,退到后台一段时间后再说话,对方听不到声音。

易错等级:⭐⭐⭐

错题原因:

音视频采集退后台后被系统限制。长时间退后台,采集是个高危动作,极有可能被系统限制,取决于用户对APP 的设置及系统对这种行为的限制要求,系统限制详情请见行为变更https://developer.android.com/about/versions/pie/android-9.0-changes-all);

解题思路:

在锁屏或将应用退至后台前,建议用户可以先开启前台服务,从而让应用正常工作(继续采集声音和视频画面),在退出锁屏或返回前台前终止前台服务;不过需要有个预期:因为高版本 Android 系统对于退后台继续采集这种敏感操作非常严格,前台服务的保活也是有风险的,需要考虑好异常情况的处理方式。

疑难问题 4:

iOS 端呼叫组件初始化时,偶现 APP 卡死情况

易错等级:⭐⭐⭐

错题原因:

呼叫组件内部初始化 IM 和老版本 RTC SDK 互锁导致卡死。

解题思路:

按照官网文档在 pod 导入 NERtcCallKit 的时候,指定 NERtcSDK 版本为 4.2.120。

示例如下:

pod 'NERtcCallKit', '1.5.0'

pod 'NERtcSDK', '4.2.120'

4.2.120 版本是呼叫组件适配的稳定版本,pod 不指定版本拉到的 NERtcSDK 不是稳定版本。

疑难问题 5:

小程序和 Native 通话时,小程序说话,Native 听不到

易错等级:⭐⭐⭐

错题原因:

小程序调用 publish 时参数传递错误。小程序端 publish 时,需要传入要发布的媒体类型,而在传参时错误的认为传入 video 表示音视频都发布。

解题思路:

  1. 发布音视频流时 publish 中 mediaType 应设置为''(空字符串);
  2. 发布纯视频流时 mediaType 应设置为 video;
  3. 发布纯音频流时 mediaType 应设置为 audio。

IM即时通讯

疑难问题 6:

以下两种场景时,发送失败,报错参数错误:

1.再次 sendMessage 发送已经发送过的图片和文件类消息;

2.直接 forwardMessage 发送新创建的消息。

易错等级:⭐⭐⭐

错题原因:

1.文件类消息创建的时候可以选择相册路径和 data 两种形式创建,创建的时候会赋值给文件 NIMMessageObject 的私有属性 sourceImage,sourceFilepath 和s ourceData。发送完消息的时候,这些私有属性会置空。如果再次调用 sendmessage 方法的话,会因为找不到这些参数报错参数错误;

2.forwardMessage 发送消息,SDK 会解析 messageObject 的 encodeContent 属性,拿到 messageObject 的对象数据进行转发,如果是新创建的消息调用转发方法发送会因为找不到 messageObject 的 encodeContent 报错参数错误。

解题思路:

1.这种场景如果是转发的场景就需要调用转发的接口 forwardMessage,或者先调用 makeForwardMessageFromMessage 构造转发的message,再 sendMessage 发送。

如果是自己想多次发送同一个内容的消息,就按创建消息的流程,创建一个 message 对象发送一次,避免发送完不重新创建就再次 sendMessage 同一个 message对象。

2.新创建的消息直接使用 sendMessage 发送,避免调用转发接口 forwardMessage 发送。

疑难问题 7:

客户需要上架到 Google 商店的时候,会被检测到有一处使用了不安全的加密模式的问题,导致无法上架。

易错等级:⭐⭐⭐

错题原因:

Google 不支持 AES/ECB/PKCS5Padding 的加密模式。

解题思路:

在 IM SDK 8.11.5 之后的版本去除了该加密模式,可以升级处理。

疑难问题 8:

App 启动的时候,应用会出现使用不流畅的情况。看 logcat 日志显示 IM 相关日志频繁打印。

易错等级:⭐⭐⭐

错题原因:

有可能是频繁调用阻塞查询本地数据的接口,这类接口会查询本地数据库,如果在 UI 线程中循环调用会出现性能问题,导致 UI 卡顿。可以通过在 logcat 日志中过滤 TransExec: execute Transaction 关键字,确认是否有 IM 接口频繁调用的情况,尤其需要注意“xxxBlock();”这类同步方法。

解题思路:

  1. 确认是否为业务层实现有问题,通过调整业务层逻辑,避免接口频繁调用。
  2. 查看api确认是否有批量查询的方法,避免循环调用。例如 TeamService.queryTeamBlock 可以改为 TeamService.queryTeamListBlock。
  3. 改为异步调用方法,或者放在子线程中调用,防止UI卡顿。

二、知识加油站

直播场景与通信场景有什么区别?

NERTC SDK 通过 setChannelProfile 方法设置实时音视频通话的场景,您可以通过该方法将房间设置为通信场景或直播场景,默认为通信场景。网易云信会针对不同实时音视频场景设置不同的优化策略,例如用户角色、默认视频编码码率等。

通信场景设置推荐用于一对一或多人音视频通话场景,直播场景设置推荐用于语音聊天室、小班课、主播 PK 等互动直播场景。

用户角色

为了便于管理用户权限,在直播场景中实现更细节的权限控制,音视频通话 2.0 支持在直播场景中设置用户角色。用户角色可设置为主播(broadcastor)或观众(audience)。

  • 直播场景中,用户默认角色为主播,可以发送音视频流、配置推流任务等。通过方法 setClientRole 可切换用户角色,切换为观众后,只能接收音视频流。
  • 通话场景中,用户默认角色为主播。不支持切换用户角色为观众。

QoS 策略

直播场景和通信场景下的默认 QoS 策略不同,主要表现在以下方面。

  • 直播场景。在直播场景下,NERTC SDK 的 QoS 策略控制侧重于保证画质清晰度。因此在默认情况下,如果分辨率和帧率相同,直播场景的码率相较于通信场景更高。在弱网环境下会有一定延时。
  • 通信场景。在通信场景下,NERTC SDK 的 QoS 策略控制侧重于保证音视频通话的实时性,最大程度上保证低时延。在弱网环境下会降低音质、画质来保证音视频通话流畅。

SDK 支持的 QoS 策略是什么意思?

QoS: Quality of Service,服务质量。

当参与音视频通话的用户网络较差时,SDK 会启动 QoS 策略,自动调整收发数据的分辨率、码率、帧率。 多人音视频通话:A、B、C、D 通话。

  • 对于视频数据如果 A 上行发送网络较差,或者 B、C、D 下行接收网络较差,服务器都会回调给 A 并触发 QoS,调整 A 发送的数据。
  • 对于音频数据如果 A 上行发送网络较差,则服务器回调给 A 并触发 QoS,调整 A 发送的数据;如果 B、C、D下行接收网络较差,则服务器根据 B、C、D 的网络情况重新编码音频数据发送给 B、C、D。

如何处理无声问题?

无声问题定义:通话过程中或通话全程,单方或多方听不到声音。

问题处理思路:如下图所示,发送端与接收端之间有多个音频处理与传输过程,建议通过采集、编码、网络传输、解码、播放等各模块对问题进行定位。

  • 检查采集及播放设备的使用权限。
  • 检查音视频房间的连接状态。
  • 检查发布/订阅接口调用。
  • 检查扬声器/麦克风打开状态。
  • 检查静音接口调用。
  • 检查外接设备状态,如蓝牙耳机、音箱,如 Windows 设备需检查驱动程序或使用系统自带的设备自检。

如以上内容均未存在问题,请联系网易云信同事,云信技术支持会及时提供技术服务帮助问题定位及解决。

如何处理回声问题?

回声问题定义:本端在音频传入时,扬声器播放自己传入的音频。

问题处理思路:如下图所示,发送端听到本端的声音,一般为接收端回声消除处理出现不可靠的情况导致,如在多人的场景下,需先定位明确的异常接收端。

  • 隔离通话双方设备的物理距离。
  • 依次静音房间内的用户,判断出现回声的异常源。
  • 异常源佩戴耳机的情况下可去除回声。
  • 提供异常源的设备具体信息包含 SDK 客户端日志。

请将收集的异常源信息提供给云信技术支持,云信技术支持会及时反馈异常处理进度及结果,该过程一般无需进行 SDK 替换。

三、技术加餐

网易智企发布“易+”开源计划,网易会议组件正式开源

内容概述:网易智企发布”易+”开源计划,旗下融合通信云服务专家网易云信打响头炮,正式开源网易会议组件,并将在第二季度开源低延时直播技术。

“易+”开源 | 网易会议开源之移动端篇

内容概述:网易会议组件源代码已经上传至 GitHub,该项目由网易云信团队自研,结合网易云信系统相关通讯功能、实时音视频、即时消息、白板、直播等功能构建了一套会议系统,本文主要介绍了网易会议组件在网易会议移动端的实践落地。

“易+”开源 | 网易会议开源之桌面端篇

内容概述:线上会议越来越普遍,很多企业希望能够开发出一套自己的会议系统,方便工作和交流;网易云信在通信领域深耕多年,基于自身能力打造了一款成熟的会议系统并将其开源,本文将介绍网易会议桌面端的相关内容。

技术干货 | RTC 音频质量评价和保障

内容概述:会议、连麦、音视频通话、在线教育、远程医疗等实时互动场景对 RTC 音频的质量提出了越来越高的要求,如何对 RTC 音频的效果开展测试,通过构建客观、标准、可重复的评价体系来保证好的音频传输质量,也成为目前比较紧急和重要的课题。

技术干货 | Gitlab-ci 替代 webhook 触发Jenkins job

内容概述:网易云信的 gitlab 服务器搭建在外网,Jenkins 服务器搭建在内网,因此 gitlab 没办法直接把 webhook 发送给 Jenkins,而 pipeline 的搭建采用第三方 relay 转发的方式,但是这个 relay 经常“罢工”。本文根据网易云信的落地实践,详细介绍了如何借助 Gitlab-ci 替代 webhook 触发 Jenkins job。

技术干货 | SQLite 简介

内容概述:SQLite 是世界上使用最广泛的数据库引擎。SQLite 内置于所有手机和大多数计算机中,并捆绑在人们每天使用的无数其他应用程序中。本文主要介绍了 SQLite 的相关特性。

2周年福利 | 20万字《网易智企技术合辑》重磅发布!

内容概述:「网易智企技术+」即将迎来 2 周岁生日,网易智企精心挑选 51 篇技术文章,集结成这份 20 万字的《网易智企技术合辑》,送给每一位开发者!


网易数智
619 声望140 粉丝

欢迎关注网易云信 GitHub: