错题集

更新时间: 2024/09/18 16:26:13

本文汇总了集成 Web SDK 的云信开发者在各个场景实践过程中的易错问题以及对应的解题思路,帮助您避开别人踩过的坑,为您的开发提效加速。

通用

我将角色从观众切换至连麦者时,为什么会听到主播声音的回声?

问题描述

用户将角色从观众切换至连麦者时,听到主播的声音两次重复播放。

问题原因

在您切换角色至连麦者时,实际上是从通过播放器拉流切换至加入 RTC 房间订阅主播的媒体流。听到回声的原因是您在连麦成功后,未释放播放器播放实例相关资源,而直接加入了音视频房间并订阅主播音视频流,致使主播媒体流同时从播放器以及在音视频房间中播放。

解决方案

网易云信建议您在互动直播中,按如下标准步骤实现连麦者上麦。

  1. 连麦成功。

  2. 退出播放,调用 release 方法释放播放器实例和资源。

  3. 初始化音视频通话 SDK 并进入音视频房间。

  4. 订阅远端音视频流。

为什么我订阅远端用户发布的流后听不到声音?

答:NERTC Web SDK 要求您在成功订阅远端发送的音视频流之后调用 play 方法播放,因此您需要在接收到的 stream-subscribed 回调(表示订阅远端的音/视频流成功)里,调用 play 方法播放远端的音视频流,网易云信推荐您此时将 audio 和 video 参数均设置为 true。

为什么推流端推流后,拉流端有时候拉不到流?

答:原因可能是您调用 publish 方法在 RTC 房间里发流和调用 addTasksupdateTasks 方法进行旁路推流的时序错误,或者没有成功订阅远端用户的流后就进行混流转推,导致互动直播混流并转推时缺少相应的数据源。

请在推旁路流之前确保对应的流已在 RTC 房间发布成功,所以您需要在调用 publish 方法成功发流之后再调用 addTasks 或 updateTasks方法;如果您还想转推 RTC 房间内其他用户发布的流,请在收到对应用户的 stream-added/stream-subscribed 回调之后再调用 addTasks 或者 updateTasks 方法。

为什么主播开启了直播,用户获取到的直播状态仍然是空闲?

问题描述

主播 A 在自己的 RTC 频道设置了推流任务开启直播,用户 B 拉流观看时显示直播状态为空闲。

问题原因

主播在互动直播过程中,重复初始化 RTC 房间,并且在每次加入房间的同时都设置了推流任务,而每次设置的推流任务的 taskId 是不一致的,导致推流失败,直播状态显示异常。

解决方案

建议避免在互动直播过程中多次初始化 RTC 房间。

为什么我无法正常播放其他后入会用户的音视频?

问题描述

用户 A 使用安卓端的微信浏览器加入房间后,看后来加入的用户的远端画面为黑屏,也听不到声音。

问题原因

微信浏览器底层阻止了音视频的播放且未抛出异常到 SDK,因此 SDK 无法监听到。

解决方案

建议在业务层提前引导用户和页面产生手势交互,比如通过弹窗指引或者按钮点击,再调用 stream.play 播放远端流,以规避浏览器的自动播放受限问题。详细步骤请参考直接解除自动播放受限

为什么加入房间后初始化本地音视流时,会出现 peer closed 报错?

问题描述

用户创建多实例后出现登录失败、发流失败的情况。

问题原因

用户创建多实例后,使用同一个 uid 加入同一个房间导致登录失败;在多实例的情况下,对应的 stream 没有和正确的实例绑定导致发流失败。

解决方案

NERTC SDK 自 V4.6.10 版本起,支持在同一个 uid 重复登录时,把之前登录的 uid 踢出房间。若您需要兼容该场景,可以按需集成指定版本的 SDK。
此外,建议您在创建多个实例时,需要管理好每个实例对应的 uid(每个实例的 uid 都需要不相同)、监听事件以及实例上的 stream(您可以在创建 stream 时指定 client 字段,以绑定 stream 和对应的实例),做到实例互相隔离。

为什么使用安卓设备入会后,切换摄像头失败,会出现 could not start video source 报错?

问题描述

在华为设备上通过浏览器入会后,调用 switchdevice 方法打开后置摄像头失败,报错 could not start video source

问题原因

切换摄像头后,原先的摄像头默认仍然是开启的状态,但安卓设备上不允许浏览器用户同时打开两个摄像头。

解决方案

建议您先调用 close 方法关闭前置摄像头,再调用 open 方法打开后置摄像头。

为什么使用移动端浏览器入会后,无法正常通话,会出现 notAllowedError: TypeError e.getCode is not a function 报错?

问题描述

在华为设备上通过浏览器入会后,调用 switchdevice 方法打开后置摄像头失败,报错 could not start video source

解决方案

若您使用的是 V4.6.10 及之后版本的 NERTC SDK,建议在 stream 层监听对 Autoplay 的处理;若您使用的是之前的版本,建议在 client 层监听,示例代码如下:

//若您已集成 4.6.10 及之后版本的 SDK,可以参考如下代码快速实现:
stream.play('remoteElement').catch(error => {});
stream.on('notAllowedError', error => {
    const errorCode = error.getCode();
    if(errorCode === 41030) {
        // AUTO_PLAY_NOT_ALLOWED, 引导用户进行手势交互
        // 调用 stream.resume() 恢复音视频正常播放
    }
});
//以下为各版本 SDK 通用的实现方法:
stream.play('remoteElement').catch(error => {});
client.on('NotAllowedError', error => {
    const errorCode = error.getCode()||error.error.getCode();
    if(errorCode === 41030) {
        // AUTO_PLAY_NOT_ALLOWED, 引导用户进行手势交互
        // 调用 stream.resume() 恢复音视频正常播放
    }
});

更多相关信息请参考浏览器自动播放受限处理

音频相关

为什么我开启伴音效果后,对方听不清我的人声?

问题描述

A 和 B 在语聊房内,A 通过伴音播放背景音乐,B 听到 A 的人声变小。若停止播放伴音,则 B 听到 A 的声音恢复正常。

问题原因

一般是因为设置的伴音音量和人声音量不合理,导致接收端的音频效果较差。

解决方案

网易云信建议您调用 setCaptureVolume 方法设置采集音量为 100,即不对信号做缩放;且调用 adjustAudioMixingVolume 方法设置的混音播放音量不超过 25,否则伴音过程中语音沟通的体验会受到影响。

不推荐设置采集音量超过100,否则会出现音质变差或噪音等问题。

为什么远端听不清本端的声音?

问题描述

老师用 Web 端给学生上课时,学生听不清老师的声音。

问题原因

老师 Web 端的麦克风设备比较特殊,采集的左右声道数据样本值几乎是反过来的;在这种情况下,系统将双声道转成单声道的时候,样本值就会很小,从而造成采集的声音很小,导致学生端听不到老师端的声音。

解决方案

当一些特殊设备遇到无声问题时,建议您调用 enableCompatMode 方法为指定音频设备开启音频双声道兼容模式。
此外您也可以通过 setAudioProfile 方法设置音频属性为 music_standard(单声道下对于回声消除的兼容性更佳)或者 standard_stereo(双声道,提高 Web 端音频对线上设备的兼容性)。

视频相关

为什么我离开房间后,摄像头仍处于使用状态?

答:您可能重复调用了 Stream.init 方法初始化音视频流对象,导致您在本地创建了两条不同的流,同时在使用摄像头设备。因此在您调用 Client.leave 方法离开音视频房间时,只结束了其中一条流的设备采集任务,致使摄像头仍处于使用状态。

网易云信建议您在实际业务场景中,需管理好 Stream.init 方法的调用次数及 Stream 对象的生命周期,确保每个 Stream 只被初始化一次,以确保音视频的正常使用。

为什么使用客户端开启云端录制后,主讲人的画面会切换?

问题描述

本来占据主视窗的用户暂停推流后再重新推流,会导致主视窗被其他用户占据。

问题原因

客户端开启云端录制时,没有通过 isHostSpeaker 参数设置本次视频通话中云端录制的主讲人 uid(主讲人默认会在布局中占据主视窗区域),导致云端录制布局中主视窗的位置不会和对应 uid 绑定,因此会出现主视窗的用户被替换的情况。

解决方案

在您调用 join 方法加入房间时,通过 recordConfig 方法配置录制参数时,需要设置 isHostSpeaker 参数以规定本端用户是否为主讲人。

为什么拉流端显示的流分辨率和推流布局中设置的分辨率不一致?

问题描述

推流布局中设置的推流分辨率为 720P,但拉流端接收到的流分辨率只有 480P。

问题原因

原因一般是您在旁路推流的布局中设置了 single_video_passthrough 参数为 true,表示开启视频透传。透传开启后,若房间中只有一路输入的视频流,则不对视频流进行转码,且不遵循转码布局。因此当您在音视频房间中指定上行的流分辨率是 480P,服务器会直接把分辨率为 480P 的音视频流透传给 CDN 节点,那么拉流端拉到的流分辨率就是 480P。

解决方案

若您希望拉流端显示的流分辨率与推流布局设置的分辨率一致,请在调用 addTasks 方法时,配置 config 属性的 single_video_passthrough 参数为 false 关闭视频透传。

此文档是否对你有帮助?
有帮助
去反馈
  • 通用
  • 我将角色从观众切换至连麦者时,为什么会听到主播声音的回声?
  • 为什么我订阅远端用户发布的流后听不到声音?
  • 为什么推流端推流后,拉流端有时候拉不到流?
  • 为什么主播开启了直播,用户获取到的直播状态仍然是空闲?
  • 为什么我无法正常播放其他后入会用户的音视频?
  • 为什么加入房间后初始化本地音视流时,会出现 peer closed 报错?
  • 为什么使用安卓设备入会后,切换摄像头失败,会出现 could not start video source 报错?
  • 为什么使用移动端浏览器入会后,无法正常通话,会出现 notAllowedError: TypeError e.getCode is not a function 报错?
  • 音频相关
  • 为什么我开启伴音效果后,对方听不清我的人声?
  • 为什么远端听不清本端的声音?
  • 视频相关
  • 为什么我离开房间后,摄像头仍处于使用状态?
  • 为什么使用客户端开启云端录制后,主讲人的画面会切换?
  • 为什么拉流端显示的流分辨率和推流布局中设置的分辨率不一致?