# 视频通话快速入门

此集成文档基于三体云 SDK 2.9.6 版本,方便您快速集成和使用 SDK 基本功能。

# Demo体验

Demo, 按照文档说明运行demo

# 开发环境

  • Android Studio 3.0 或以上版本
  • Android SDK API 等级 18 或以上
  • 支持 Android 4.3 或以上版本的移动设备
  • Java SDK 8.0 或以上版本

注册三体云账号,申请AppId

# 下载 SDK

  1. 前往 SDK 下载页面,获取最新版的三体云 SDK,然后解压。

  2. 将 SDK 压缩包解压缩获取 aar 文件,将 aar 引用到项目中:

# 添加项目权限

根据场景需要,在 /app/src/main/AndroidManifest.xml 文件中添加如下行,获取相应的设备权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.tttrtclive.live">
 
   <uses-permission android:name="android.permission.READ_PHONE_STATE" />   
   <uses-permission android:name="android.permission.INTERNET" />
   <uses-permission android:name="android.permission.RECORD_AUDIO" />
   <uses-permission android:name="android.permission.CAMERA" />
   <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
   <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
   <uses-permission android:name="android.permission.BLUETOOTH" />
   <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
   // 如果你使用的是 Android 10.0 及以上设备,还需要添加如下权限:
   <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
 
...
</manifest>

# 防止代码混淆

app/proguard-rules.pro 文件中添加如下行,防止代码混淆:

-keep class ttt.ijk.media.**{*;}
-keep class project.android.imageprocessing.**{*;}
-keep class org.TTTRtc.voiceengine.**{*;}
-keep class com.wushuangtech.**{*;}
-dontwarn ttt.ijk.media.**

# 实现连麦直播

# API 调用时序图

# 1.初始化 TTTRtcEngine

在调用其他 API 前,需要创建并初始化 TTTRtcEngine 对象。

调用 create 方法,传入获取到的 App ID,即可初始化 TTTRtcEngine。

在设置 TTTRtcEngineEventHandler 注意:
1.SDK 暂不支持设置多个回调接收对象,后设置的会覆盖前面所设置的。
2.避免在回调线程中做耗时的操作,以防阻塞线程,影响后续回调信令的接收。

TTTRtcEngine mTTTEngine = TTTRtcEngine.create(getApplicationContext(), <APPID>, false, mMyTTTRtcEngineEventHandler);
if (mTTTEngine == null) {
    return ;
}

# 2. 设置频道模式

初始化结束后,调用 setChannelProfile 方法,将频道模式设为直播。

该 API 必须在 joinChannel(加入频道) 前设置。

全局性 API,退出频道并不会改变之前所设置的模式。如需切换模式,需要显式的再次调用。

mTTTEngine.setChannelProfile(Constants.CHANNEL_PROFILE_COMMUNICATION);

# 3. 设置用户角色

视频通话有两种用户角色:副播(CLIENT_ROLE_BROADCASTER)和观众(CLIENT_ROLE_AUDIENCE),其中默认的角色为副播。

副播可以发生/接收音视频流,观众只接收音视频流,不能发送。

全局性 API,退出频道并不会改变之前所设置的角色身份。如需切换角色,需要显式的再次调用。

mTTTEngine.setClientRole(Constants.CLIENT_ROLE_BROADCASTER); // 角色为副播

# 4. 设置本地视图和视图相关参数

private void setupLocalVideo() {
	// 启用视频模块。
	mTTTEngine.enableVideo();
	
	// 设置视频参数
	mTTTEngine.setVideoProfile(Constants.TTTRTC_VIDEOPROFILE_360P);
	   
	// 创建 SurfaceView 视频渲染控件。
	SurfaceView surfaceView = TTTRtcEngine.CreateRendererView(mContext);
	surfaceView.setZOrderMediaOverlay(true);
	   
	// 配置本地视频渲染控件,必须先进行配置,再添加到布局上。
	VideoCanvas localVideoCanvas = new VideoCanvas(0,Constants.RENDER_MODE_HIDDEN, mLocalView);
	mTTTEngine.setupLocalVideo(localVideoCanvas, getRequestedOrientation());
	// 添加渲染控件到布局上
	mParentLayout.addView(surfaceView);
}

# 5. 加入频道

完成设置角色和本地视图后(视频直播场景),你就可以调用 joinChannel 方法加入频道。你需要在该方法中传入如下参数:

  • token:传入能标识用户角色和权限的 Token。可设为如下一个值:

    • NULL 不启用 Token 功能。
    • 在你的服务器端生成的 Token。在安全要求高的场景下,我们推荐你使用此种方式生成的 Token 。
  • channelName:传入能标识频道的频道 ID。App ID 相同、频道 ID 相同的用户会进入同一个频道。当前 SDK 仅支持数字类型的字符串,数值范围为1-9,不支持任何特殊符号,英文字母,空格等,长度续保证为 Long 类型的最大值以内。

  • optionalUid: 本地用户的 ID。数据类型为长整型,且频道内每个用户的 uid 必须是唯一的。

...
// 监听加入频道成功的回调
@Override
public void onJoinChannelSuccess(String channel, long uid, int elapsed) {}

// 监听加入频道失败的回调
@Override
public void onError(int errorType) {}

// 监听已在频道内,收到异常退出的信令的回调。原因具体看 reason 参数
@Override
public void onUserKicked(long uid, int reason) {
	// 退出当前频道
	mTTTEngine.leaveChannel();
}
...

private void joinChannel() {
 
    // 不使用 Token 加入频道。
    private String mRoomName = "123";
    private long mUid = 1234;
    mTTTEngine.joinChannel("", mRoomName, mUid);
}
...

# 6. 设置远端视图

如果你想实现一个语音直播,可忽略此步骤。

视频直播中,不论你是主播还是观众,都应该看到频道中的所有主播。在加入频道后,可通过调用 setupRemoteVideo 方法设置远端主播的视图。

远端主播成功加入频道后,SDK 会触发 onFirstRemoteVideoDecoded 回调,该回调中会包含这个主播的 uid 信息。在该回调中调用 setupRemoteVideo 方法,传入获取到的 uid,设置该主播的视图。

...
// 监听 onFirstRemoteVideoDecoded 回调。
// SDK 接收到第一帧远端视频并成功解码时,会触发该回调。
// 可以在该回调中调用 setupRemoteVideo 方法设置远端视图。
@Override
public void onFirstRemoteVideoDecoded(long uid, int width, int height, int elapsed) {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            setupRemoteVideo(uid);
        }
    });
}

...
private void setupRemoteVideo(int uid) {
  
    // 创建一个 SurfaceView 对象。
    private RelativeLayout mRemoteContainer;
    private SurfaceView mRemoteView;
    
    mRemoteView = mTTTEngine.CreateRendererView(getBaseContext());
    // 设置远端视图。
    mRtcEngine.setupRemoteVideo(new VideoCanvas(uid, VideoCanvas.RENDER_MODE_HIDDEN, mRemoteView));
    mRemoteContainer.addView(mRemoteView);
  
}
...

# 7. 离开频道

结束直播或离开当前直播频道。

mTTTEngine.leaveChannel();