FAQ
更新时间: 2024/09/18 16:26:13
-
产品相关
-
集成相关
-
质量相关
产品相关
云信支持哪些平台及对应平台版本
NERTC SDK 支持 Android、iOS、Windows、Web、macOS 等多平台,各平台的推荐开发环境请参考平台支持。
实时音视频2.0有哪些改变
网易云信音视频第二代实时音视频产品是网易云信新一代音视频服务,以独立音视频SDK的方式进行设计和开发,是网易在第一代技术沉淀的基础上,全面升级了音视频核心的引擎与算法核心模块,融入了5G、AI等领域的设计理念,是面向于4G-5G时代推出的高品质实时音视频服务,具有更强的新技术扩展能力。
借助音视频2.0可以更加快速接入音视频,产品更轻量。
实时音视频2.0支持哪些场景
实时音视频2.0支持场景多样,包括但不限于音乐教学、语音通话、视频社交、在线课堂、远程问诊、音乐互动课堂、主播互动直播,您也可以根据自身业务形态结合音视频通话 2.0强大的音视频能力产生更多的应用场景。
Web端支持哪些浏览器类型和版本?
请参考 音视频应用浏览器兼容情况。
Web端在H5平台有哪些接口限制
Web 端 NERTC SDK 在 H5 平台不支持以下 API:
-
不支持以下伴音相关 API。
startAudioMixing、stopAudioMixing、pauseAudioMixing、resumeAudioMixing、adjustAudioMixingVolume、getAudioMixingDuration。
如果您调用了以上 API,SDK 会报错
BROWSER_NOT_SUPPORT
。 -
不支持以下客户端录制功能相关 API:
startMediaRecording、stopMediaRecording、playMediaRecording、listMediaRecording、cleanMediaRecording、downloadMediaRecording。
如果您调用了以上 API,SDK 会报错
RecordBrowserNotSupport
。 -
不支持设置麦克风采集音量(setCaptureVolume)。
SDK的日志从哪里获取
各端设置日志路径的方式如下:
-
Android: 调用
NERtc.getInstance().init
方法初始化 SDK 时,通过NERtcOption
对象的LogDir
参数指定日志路径。V5.3.0 及之后版本的默认日志路径为:sdcard/Android/data/your_app_name/files/rtc_log
。 -
iOS: 调用
setupEngineWithContext
方法初始化 SDK 时,通过NERtcEngineContext
类下NERtcLogSetting
的logSetting
参数指定日志路径。SDK 日志会保存在沙盒中,V4.X 版本的默认日志路径为Document/NERtcSDK
,V5.3.0 及之后版本的默认日志路径为:~/Documents/Logs
。 -
PC: 调用
initialize
方法初始化 SDK 时,通过rtc_engine_context
对象的log_dir_path
参数指定日志路径。V5.3.0 及之后版本,Windows 端的默认日志路径为:EXE 同级目录下的 logs 文件夹,子目录的命名规则为AppKey 前6位_AppKey hash值的前 9 位
。macOS 端的默认日志路径为:~/Documents/Logs
。 -
Web: 调用
WebRTC2.createClient
方法创建客户端时,通过设置debug
参数为 true 开启调试模式,SDK 将在浏览器控制台输出日志。
如何设置日志不加密
V5 版本的 NERTC,默认开启了日志加密,为了方便排查问题,您可以设置为日志不加密,操作方法如下:
在初始化 SDK 之前,执行如下命令关闭日志加密:
NERtcParameters mRtcParameters = new NERtcParameters();
RtcParameters rtcParameters = mRtcParameters.getRawParameters();
rtcParameters.setBoolean("sdk.enable.encrypt.log",false);
NERtcEx.getInstance().setParameters(mRtcParameters);
在初始化 SDK 之前,执行如下命令关闭日志加密:
//1. 设置日志不加密
[[NERtcEngine sharedEngine] setParameters:@{@"sdk.enable.encrypt.log":@(NO)}];
//2. 初始化
[[NERtcEngine sharedEngine] setupEngineWithContext:context];
在初始化 SDK 之前,执行如下命令关闭日志加密:
// 1. 设置日志不加密
QJsonObject json;
json.insert("sdk.enable.encrypt.log", false);
QString str = RtcTool::getStringFromJsonObject(json);
coreEngine->setParameters(str.toStdString().c_str());
// 2. 初始化SDK
int ret = coreEngine->initialize(engine_context);
SDK支持哪些音频相关功能
主要功能 | 功能描述 | 场景举例 |
---|---|---|
高品质语音 | 支持16KHz~48KHz采样,音质优秀 | 音乐教学 |
语音降噪 | 内置自动降噪模块(NS),有效降低环境音干扰 | 语音通话 |
回声消除 | 内置语音回声消除模块(AEC),抑制回声、啸叫 | 语音通话 |
伴奏、混音和音效 | 本地/云端文件伴音,支持伴奏、混音和音效的发送播放 | 音乐互动课堂 |
音频原始数据回调 | 允许获取底层提供的音频数据,并进行前处理或后处理 | 主播美声 |
SDK支持哪些视频相关功能
主要功能 | 功能描述 | 场景举例 |
---|---|---|
视频多流订阅 | 支持主动/自动根据网络状况调整视频规格,视频更流畅 | 视频社交、在线课堂 |
视频原始数据回调 | 允许获取相机采集的原始视频数据,帮助接入第三方美颜滤镜厂商 | 视频美颜 |
屏幕共享 | 共享屏幕给房间内其他用户 | 办公、教育 |
如何根据场景选择合适的视频分辨率、帧率、码率?
视频分辨率等参数的选择根据使用场景来决定,例如老师和学生在房间内进行1对1通话,视频布局比较大,分辨率随之高一点,帧率和码率也会提高,如果是房间内有多人,那么每个视频布局会相对比较小,所以分辨率等参数可以低一点。 为您推荐的场景参数如下所示:
2人视频通话场景:
- 分辨率 320 x 240、帧率 15 fps、码率 200 Kbps
- 分辨率 640 x 360、帧率 16 fps、码率 400 Kbps
多人视频通话场景:
- 分辨率 160 x 120、帧率 15 fps、码率 65 Kbps
- 分辨率 320 x 180、帧率 15 fps、码率 140 Kbps
- 分辨率 320 x 240、帧率 15 fps、码率 200 Kbps
是否支持设置用户角色?
NERTC SDK 支持通过接口 setClientRole 设置用户角色。
当前支持的用户角色包括主播(broadcaster)和观众(audience)。加入房间时,用户默认为主播角色,主播和观众的权限不同。
角色 | 权限 |
---|---|
主播 |
|
观众 | 接收音视频流。 |
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。
直播场景与通信场景有什么区别?
NERTC SDK 通过 setChannelProfile 方法设置实时音视频通话的场景,您可以通过该方法将房间设置为通信场景或直播场景,默认为通信场景。网易云信会针对不同实时音视频场景设置不同的优化策略,例如用户角色、默认视频编码码率等。
通信场景设置推荐用于一对一或多人音视频通话场景,直播场景设置推荐用于语音聊天室、小班课、主播PK等互动直播场景。
用户角色
为了便于管理用户权限,在直播场景中实现更细节的权限控制,音视频通话 2.0 支持在直播场景中设置用户角色。用户角色可设置为主播(broadcastor)或观众(audience)。
- 直播场景中,用户默认角色为主播,可以发送音视频流、配置推流任务等。通过方法 setClientRole 可切换用户角色,切换为观众后,只能接收音视频流。
- 通话场景中,用户默认角色为主播。不支持切换用户角色为观众。
QoS 策略
直播场景和通信场景下的默认 QoS 策略不同,主要表现在以下方面。
-
直播场景。
在直播场景下,NERTC SDK 的 QoS 策略控制侧重于保证画质清晰度。因此在默认情况下,如果分辨率和帧率相同,直播场景的码率相较于通信场景更高。在弱网环境下会有一定延时。
-
通信场景。
在通信场景下,NERTC SDK 的 QoS 策略控制侧重于保证音视频通话的实时性,最大程度上保证低时延。在弱网环境下会降低音质、画质来保证音视频通话流畅。
房间有效期是多久?
调用服务端 API 创建房间成功后,若 24 小时内无人加入房间,房间会自动销毁;当所有房间成员均离开房间后,房间会立刻销毁。
若客户端调用 joinChannel
方法后未成功加入房间,服务端可能也会创建一个新的音视频房间。
一个 RTC 房间内最多支持多少人?
NERTC SDK V 4.1.0 版本开始支持多至上万人的音视频通话,最多支持 60 人视频通话,可用于线上年会、远程会议、学术论坛等需要多人实时音视频通话的场景。在 V 4.1.0 版本中,NERTC SDK 针对 200 人以上的音视频通话场景进行了技术优化与改进,提高了多人通话的连通性与语音效果,在大房间音视频通话场景中为您提供更优质的语音视频体验。
大小流是什么意思?如何根据场景选择?
大流对应高清画质,小流对应低清画质。多人音视频通话过程中,为了减少下行带宽占用,可以开启大小流模式,每个用户会上传一大一小两个视频流,接收方可以根据显示需要来选择接收大流或是小流。
集成相关
Android端如何实现设置视频属性?
在视频通话前设置视频属性,可以根据用户喜好,调整视频画面的清晰度和流畅度,获得较高的用户体验。
您可以通过setLocalVideoConfig方法方法来设置视频相关的属性。 视频分辨率设置如下:
视频档位 | 具体参数 |
---|---|
LOWEST | 160x90/120 |
LOW | 320x180/240 |
STANDARD | 640x360/480 |
HD720P | 1280x720 |
HD1080p | 1920x1280 |
实现方法如下:
NERtcVideoConfig videoConfig = new NERtcVideoConfig();
videoConfig.frontCamera = mFrontCamera;
videoConfig.videoProfile = mVideoProfile;
NERtc.getInstance().setLocalVideoConfig(videoConfig); //设置本地视频参数
Web端如何实现音频播放
云信SDK为您提供相关接口,实现音频播放功能,接口如下:
- 播放远端声音
localStream.play()
//remoteStream.play()
- 停止播放远端声音
localStream.stop() //remoteStream.stop()
由于浏览器策略,可能会限制页面声音的自动播放,本文以chrome浏览器为您示例。
SDK优化过音频播放逻辑,一般是用户再有页面刷新的业务场景时,才可能出现音频播放失败的问题,因为此时用户还没有交互。
自动播放会报错:
chrome浏览器不允许声音自动播放,如果用显式调用play进行播放会出现如下报错:DOMException: play() failed because the user didn't interact with the document first.(用户还没有交互,不能调用play)。
相关解决方法:
-
您可以手动修改浏览器的配置,解决该问题。
-
打开chrome浏览器。
-
输入
chrome://flags/#autoplay-policy
。 -
在配置页面找到
Autoplay policy
,将Default
修改为No user gesture is required
。 -
重启浏览器使配置生效。
-
-
用户还没有交互,音频不能自动播放,用户的交互包括用户触发的touchend、click、doubleclick或者keydown事件,在这些事件里面音频就能够正常播放了。
因此您可以在Web页面上加一个类似静音的标志按钮,在用户点击按钮时,调用SDK的音频播放接口。
Web端如何实现视频播放
云信SDK为您提供相关接口,实现音频播放功能,接口如下:
-
预览本地或者远端摄像头(调用该方法进行本地、远端预览)
let div = document.getElementById('local-container') localStream.play(div) //let div = document.getElementById('remote-container') //remoteStream.play(div)
-
停止预览本地或者远端摄像头(调用该方法关闭本地、远端预览)
localStream.stop() //remoteStream.stop()
-
设置本地视频画面大小(开启预览本地摄像头捕获的视频流后,可以通过该方法动态调节预览画面的大小)
let config = { width: 160, //窗口宽 height: 120, //窗口高 cut: true //是否允许裁剪 } localStream.setLocalRenderMode(config)
参数说明:
param参数属性 类型 说明 param参数属性 width number 需要预览画面的宽度 width height number 需要预览画面的高度 height cut bool 是否进行裁剪 cut
cut设置为false时,设置的预览大小将按照捕获的原始视频宽高比进行等比缩放,会出现某一个方向撑不满容器,导致黑边的情况。
cut设置为true时,默认将原始画面按照1:1进行裁剪。
-
设置远程视频画面大小(收到远程流并启动预览之后,可以通过该方法动态调节预览画面的大小,用法和上面的设置本地视频画面大小一样)。
let config = { width: 160, //窗口宽 height: 120, //窗口高 cut: true //是否允许裁剪 } remoteStream.setRemoteRenderMode(config)
参数说明:
param参数属性 类型 说明 param参数属性 width number 需要预览画面的宽度 width height number 需要预览画面的高度 height cut bool 是否进行裁剪 cut
cut设置为false时,设置的预览大小将按照捕获的原始视频宽高比进行等比缩放,会出现某一个方向撑不满容器,导致黑边的情况。cut设置为true时,默认将原始画面按照1:1进行裁剪。
如何登录并进行业务管理?
进入云信官网,点击右上角的登录控制台,输入账号与密码即可完成登录。
在对应的云信应用的功能管理一栏中可以看到当前已开通的功能,找到音视频通话G2,点击功能管理即可进行相关业务的配置。
当前支持录制配置,具体包括:
-
录制画布设置。
-
录制布局模式。
-
音视频录制自定义布局配置。
如何开启服务端录制及配置录制模式
首先需要在官网首页通过微信、在线消息或电话等方式联系云信商务经理开通服务端录制功能。
V4.5.0及之后版本,云端录制只需要在服务端进行相关配置,客户端无需再单独配置,服务端的配置方法请参见新版云端录制方案。
怎么获取房间内的成员信息?
- 您可以通过调用服务端API进行查询,接口:
https://logic-dev.netease.im/v2/api/rooms/{cid}/members HTTP/1.1
。 - 通过客户端SDK回调维护。
加入房间后,新加入的成员会收到「用户加入房间通知」,返回已经在房间内的其他成员的账号信息;已经在房间内的其他成员也会通过该通知,收到当前新加入的成员的账号信息。
例如,某个音视频房间已有A、B、C、D,当E加入时,E会收到A/B/C/D加入房间的通知,A/B/C/D也会收到E加入房间的通知。
安全模式和调试模式,有什么区别?
安全模式:客户端需要AppKey和token来完成认证进行实时通话。 其中token需要第三方服务器从云信服务器获取。
调试模式:客户端只需要AppKey即可完成认证进行实时通话,这种情况下用户需要保管好AppKey,防止泄露,默认情况下调试模式处于关闭状态,如需开启,请在控制台中将指定应用的鉴权方式设置为调试模式。
如何获取通话过程中的网络状态、音量状态等数据回调
云信音视频 SDK 在通话过程中会回调通话中的各种状态信息,包括本地音频流统计信息、本地视频流统计信息、通话中远端音频流的统计信息、通话中远端视频流的统计信息、当前通话统计等。
Android 端的实现方式如下:
继承`NERtcStatsObserver`,实现如下回调:
@Override
public void onRtcStats(NERtcStats stats) {
Log.i(STATS_DATA_TAG, stats.toString());
}
@Override
public void onLocalAudioStats(NERtcAudioSendStats stats) {
Log.i(STATS_DATA_TAG, stats.toString());
}
@Override
public void onRemoteAudioStats(NERtcAudioRecvStats[] statsArray) {
for (NERtcAudioRecvStats stats : statsArray) {
Log.i(STATS_DATA_TAG, stats.toString());
}
}
@Override
public void onLocalVideoStats(NERtcVideoSendStats stats) {
Log.i(STATS_DATA_TAG, stats.toString());
}
@Override
public void onRemoteVideoStats(NERtcVideoRecvStats[] statsArray) {
for (NERtcVideoRecvStats stats : statsArray) {
Log.i(STATS_DATA_TAG, stats.toString());
}
}
@Override
public void onNetworkQuality(NERtcNetworkQualityInfo[] statsArray) {
for (NERtcNetworkQualityInfo stats : statsArray) {
Log.i(STATS_DATA_TAG, stats.toString());
}
}
如何处理调用服务端 RESTful API 超出频率限制?
网易云信服务端接口的请求频率上限一般为 50 次/秒,若您调用某服务端 RESTful API 过于频繁,可能会返回 429 错误码。
您可以结合业务的实际并发场景,参考以下建议,优化对 RESTful API 的调用频率:
- 将对某一 RESTful API 发起的请求平均分布在各时间区间段。
例如,要调用https://logic-dev.netease.im/v2/api/rooms/{cid}/members
查询 500 个房间的在线成员列表,由于该 API 默认的调用频率上限为每秒 50 次,为避免调用过于频繁,您可以设置查询时间间隔为 5 秒,每秒查询 50 个房间的用户列表。 - 避免在您的客户端直接调用网易云信服务端的 RESTful API,而是在您的应用服务器上调用服务端 API。
例如,使用查询房间在线成员信息 API 时,可以由您的应用服务器定期向云信服务器发送请求并缓存返回结果,当有用户需要查询房间成员信息时,直接由您的服务器向客户端下发本地缓存的最新数据。 - 开通消息抄送服务。
在业务并发量很大的情况下,您可以申请开通网易云信的消息抄送服务,将音视频通话 2.0 业务下的消息或事件等数据,通过发起 HTTP/HTTPS 请求实时同步给您预设的服务器。
若您参考了以上建议仍然无法解决问题,仍需要上调接口的请求频率上限,可以点击本页下方的提交工单,或在官网首页右侧通过在线消息、微信或电话联系云信商务经理。
质量相关
为什么打开摄像头失败?
摄像头打开失败有多种原因,您可以参考如下步骤进行排查:
-
确认摄像头权限有没有打开。Android、iOS/macOS系统都有权限管理,请在系统设置中检查。同时 Android 上有些安全软件也管理权限。
-
检查是否有其他应用占据了摄像头。关闭其他应用,重启手机再试。
-
摄像头硬件问题。打开系统自带的拍摄视频程序看是否可以录像。
为什么 Android 设备上将应用锁屏或退至后台时,无法正常使用 SDK 的音视频功能?
当 Android 用户将手机锁屏或将应用退至后台时,无法正常使用 SDK 的音视频功能有多种原因,您可以参考如下步骤进行排查:
- 检查是否添加了 AndroidManifest 权限并赋予动态权限。
示例代码如下:
//网络相关
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
//电源锁,SDK在启动时会持有电源锁 防止进程在后台休眠
<uses-permission android:name="android.permission.WAKE_LOCK"/>
//camera相关
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus"/>
//录音相关
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
//前台服务
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
-
检查是否开启了应用通知。
-
检查是否开启了前台服务。
若未开启前台服务,可能 Android 系统会强行限制您的应用,详情请见行为变更。
示例代码如下:
<service
android:name="com.netease.lava.nertc.demo.service.ScreenShareService"
android:foregroundServiceType="mediaProjection"
android:exported="false">
<intent-filter><action android:name="com.netease.Yunxin.ScreenShare" /></intent-filter>
</service>
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
int importance = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel channel = new NotificationChannel(
CHANNEL_ID, CHANNEL_ID, importance);
channel.setDescription(CHANNEL_ID);
NotificationManager notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
Trace.i(TAG, "sdkVer:" + Build.VERSION.SDK_INT + " using FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION");
try {
startForeground(NOTIFICATION_ID, screenShareNotification.getNotification(),
ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION);
}catch (IllegalArgumentException e){
e.printStackTrace();
stopForeground(true);
startForeground(NOTIFICATION_ID, screenShareNotification.getNotification());
}
} else {
startForeground(NOTIFICATION_ID, screenShareNotification.getNotification());
}
- 检查是否关闭了智能省流量模式。
-
检查是否针对此应用开启了允许后台活动。 各主流机型的设置方式如下:
OPPO 设备- 打开锁屏显示权限: 设置 -> 应用管理 -> 权限管理 -> 选择指定应用 -> 打开锁屏显示
- 打开后台运行权限(提升应用保活效果): 设置 -> 电池 -> 应用耗电管理 -> 选择指定应用 -> 打开允许完全后台行为
VIVO 设备- 打开锁屏显示与后台弹出权限: 设置 -> 应用与权限 -> 权限管理 -> 选择指定应用 -> 单项权限设置 -> 打开锁屏显示与后台弹出界面
- 打开后台运行权限(提升应用保活效果): 设置 -> 电池 -> 后台高耗电 -> 打开指定应用的开关
小米设备- 打开锁屏显示与后台弹出权限: 设置 -> 应用设置 -> 应用管理 -> 选择指定应用 -> 权限管理 -> 打开锁屏显示与后台弹出界面
- 打开后台运行权限(提升应用保活效果): 设置 -> 应用设置 -> 应用管理 -> 选择指定应用 -> 省电策略 -> 选择无限制
华为设备打开后台运行权限(提升应用保活效果): 设置 -> 电池 -> 选择指定应用 -> 启动管理 -> 关闭自动管理并打开允许后台活动
其他机型(供参考)打开后台运行权限(提升应用保活效果): 设置 -> 应用和通知 -> 查看全部应用 -> 选择指定应用-> 显示在其他应用的上层 -> 打开开关
为什么 Android 设备开启扬声器失败,声音还是从听筒播放?
请检查 SDK 日志文件nrtc_engine.log
中是否有记录Permission miss : android.permission.MODIFY_AUDIO_SETTINGS
。如有,需要在 AndroidManifest.xml
中配置:
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
为什么加入房间后报错 403?
一般是由于您在使用 Demo 时,没有开通调试模式导致。
网易云信默认关闭调试模式,您在此模式下调用加入房间的接口时,需要传入对应的 Token。而当您使用 Demo 加入房间时,Token 入参为 null,只有在调试模式下才能成功加入房间。为了快速测试并体验产品,建议联系商务经理开通调试模式。
为什么加入房间后报错 414?
返回 414 错误码的可能原因如下:
- 在调试模式下传了 Token,或者在安全模式下没有传 Token。
- Token 计算错误。需要检查服务端获取 Token 的方式。
- App Key、Token、uid、channelName 不匹配。
- uid 传入了非 long 参数或者负数。