游戏互动
联系电话:(010) 6072 8829
技术QQ群:697918347
English
集成和使用
登录

为什么提示我被踢出了房间

如果一个已经登录的用户,在另一个设备登录,则当前用户会被踢。

频道

网络环境差时,SDK会强行让用户自动退出频道吗?

SDk不会让用户自动退出频道,除非用户自己主动退出。例如,应用程序调用leaveChannel()的方法;如果客户端长时间没有上行视频或者音频数据,会被服务器踢下线。

在每个房间,每个频道内,通话中是否有管理员?

没有频道管理员的概念,管理员是属于信令层的范围。可以由信令层实现,由信令服务器主动下发命令,调用SDK的接口来实现通话管理。

客户端是否要维护频道?

频道是自动创建和删除的,客户端无需处理和维护。当所有客户端都离开一个频道时,频道自动被删除。

什么是 App ID?

App ID是由3TLive分配的,请联系官网获取。

用户直播时,如何保持房间名/频道名的唯一性?

由 App 端自行区分,例如加上前后缀。如果指定相同的频道名,则进入同一频道。

如何监听频道内谁在说话?

以下各平台回调方法提示了频道内谁在说话,以及说话者的音量:

  • Android: onAudioVolumeIndication
  • iOS: reportAudioVolumeIndicationOfSpeake ####该提醒默认为关闭状态。如需启用,请调用 enableAudioVolumeIndication 方法进行配置。

录制

  • iOS 平台上: 首次运行系统会提示打开录音权限。如被手工关闭后开发者可以查询系统接口 AVAudioSession.sharedInstance().recordPermission()[iOS8.0+] 来检测录音权限。
  • Android 平台上: 比较复杂,因为各个厂家的实现不一,并没有统一的手段可以检测到所有手机的录音权限。

信令

怎么获取用户在线列表?

SDK 内有 onUserJoined 和 onUserOffline 的回调接口,可以知道用户上线和离线时刻的通知。但无法获取在线列表,用户管理属于信令层的逻辑,建议由你自己在信令层来做。

App 的用户之间要建立和发起一个呼叫,整个流程是怎样的?

以 A 呼叫 B 为例,一般呼叫流程如下:

1.A 向信令服务器发起呼叫请求。
2.信令服务器检查 B 是否在线:
如不在线,向 A 返回 B 不在线错误。
如在线,信令服务器生成频道名,返回给 A;并向 B 投递呼叫信令。
3.A 收到信令服务器返回的频道名,准备加入语音频道。此时为加快进频道速度,可以提前进入频道待命:
A 调用 muteLocalAudioStream(true) 和 muteLocalVideoStream(true)(如有视频功能)禁止发送音视频数据。
调用 joinChannel 进入频道。
4.B 收到信令服务器投递过来的A的呼叫请求。
B 响铃。 为加快进频道速度,可以提交进入频道待命。
B 调用 muteLocalAudioStream(true) 和
muteLocalVideoStream(true)(如有视频功能)禁止发送音视频数据。 5.A 调用 joinChannel 进入频道:
如 B 拒绝请求:
* B 调用 leaveChannel 退出频道
* B 向信令服务器返回拒绝应答
* 信令服务器向 A 返回 B 拒绝应答信令
* A 调用 leaveChannel 退出频道
如 B 接受请求:
* B 调用 muteLocalAudioStream(false) 和 muteLocalVideoStream(false) 开始发送音视频数据
* B 向信令服务器返回接受应答信令
* 调用 muteLocalAudioStream(false) 和 muteLocalVideoStream(false) 开始发送音视频数据

Android 问题

安卓平台上,可以将 SDK 代码与我自己的代码混用吗?

不能,否则无法回调 .so 文件。

集成 SDK 后,点击 App 中视频小窗口没有反应,也无法拖动,我该怎么办?

检查系统上有没有开启悬浮窗权限。如果没有开启该权限,App 是无法启动小窗口的。

其他问题

哪些回调函数建议做 App 业务逻辑?哪些不建议做?

App 经常关心的是用户状态相关的回调,如 userJoined, userOffline 等,鉴于所有与用户相关的逻辑都是以UDP的方式传输,并不可靠。 同样原理,其他与远程用户相关的回调也是不可靠的。

在使用和集成 SDK 过程中会返回哪些错误代码,哪里可以找到对应的描述?

详见:

错误代码和警告代码

Error Code 里哪些可以做 APP 的业务逻辑,哪些不可以?

Error 类的可以做 APP 的业务逻辑,但是 Warning 类的无需处理。

哪些回调可以用于提示用户断开服务器,或者重连?

rtcEngineConnectionDidLost或connectionLostBlock 可用户提示用户断开服务器, 断开事件后,SDK会主动重连服务器。

多次调用 initWithAppId 会有什么不良后果吗?

有,可能会闪退或者导致摄像头方向不正常等。

通话时,为什么旋转手机,图像有时跟着旋转,有时不?

手机支持转屏和不转屏两种。这个在系统里可以设置。如果设置了允许转屏,应用可以重新布局,窗口会变宽或者窄。如果系统不允许转屏,应用就无法重新布局。这就是为什么旋转手机,图像有时候会跟着旋转,有时候不会。

网络重新连接后,为什么对方视频图像仍然为静止状态,没有恢复?

网络连接后,视频通讯需要一点延时才能连接上。这是所有视频通讯都有的现象。网络比较差的情况下,延时会长一些。

SDK 的用户 id 是 32 位无符号整型,而我们现有用户的 id 是 String 值, 我该怎么办?

这个是信令层的逻辑和协议,建议客户服务器在 string 和 int 间映射。

怎么让音量显示的回调生效?

由于远端音频流音量回调默认关闭,所以必须在加入频道前后立刻调用相关 API 开启该回调: RtcEngineParameters:: enableAudioVolumeIndication(int interval, int smooth)。

直播中如何踢人?

目前App可以通过信令在 App 端踢人。服务器端踢人功能正在开发中。

为什么两个主播进入同一个频道却看不见对方?

进行以下检查:

确认两个主播是否使用相同的 App ID,如果厂商注册多个 App ID,容易弄混; 确认两个主播是否进入相同的频道(频道名相同); 确认两个主播的网络是否正常连接。

为什么设置分辨率为 640 x 360,实际为 640 x 352?

由于 Android 机型较多,受部分编码器限制,只支持视频宽度是 16 的倍数,所以我们统一将分辨率设置为 16 的倍数 例如宽度为 360 时,实际上宽度为 352。

为什么 SEI 中设置的布局,跟实际得到的布局,有 1 个像素上的偏移?

视频底层解码为 YUV420 格式时,YUV 的采样在宽和高两个方向上的比例为 2:1:1,所以宽跟高必须是偶数,移动的距离上也必须是偶数。 但是由于我们自定义布局采用相对值,所以在计算变换时,会将各个主播的宽高和位置,计算成偶数,导致与用户期望的数据,有 1 个像素的偏差。

代码示例与 API

为什么 Open Live 编译无法通过?

Open Live 的编译需要用户提供自己申请的 App ID 才能通过。请在提示出错的地方,补上自己申请的 App ID。

从哪里可以获取 App ID?

请联系三体云官网获取。

为什么在 Open Live 代码里填好 App ID 后,进不去频道,也看不到本地视频?

请检查一下: 在 dashboard 中,是否启用了 App Certificate, 一旦启用 App Certificate, 则必须使用 Channel Key 加入频道。

3TLive SDK 支持 ReplayKit 吗?

ReplayKit 是 iOS 10 内置的录屏功能, 目前 3TLive SDK 支持 ReplayKit。详见连麦直播demo中的录制视频和分享桌面视频源。

观众在直播间的时长数据,可以拿到吗?

推荐通过信令层自行统计,后续 3TLive 将提供非实时对账接口。