实时视频通话

本文将介绍如何使用Thunder视频 SDK 的基础功能快速实现视频通话。如果需要更深层的功能可以参考进阶功能或者咨询接入人员。

1 Demo体验

下载Demo体验

下载Demo工程

2 前提条件

在开始开发之前您必须满足如下条件:

  • Android Studio 3.0 或以上版本
  • Android SDK API 等级 16 或以上
  • 支持 Android 4.1 或以上版本的移动设备
  • 有效的聚联云账号(有效的APPID、APPSECRET),详见APPID申请

3 准备开发环境

在准备好上述的前提条件之后,我们就可以动手开始集成SDK进行开发了。

3.1 创建项目

1 打开 Android Studio,点击 Start a new Android Studio project
2 在 Choose your project 界面,选择 Phone and Tablet > Empty Activity,然后点击 Next
3 在 Configure your project 界面,依次填入以下内容:

  • Name:你的 Android 项目名称,如 mouselive-android
  • Package name:你的项目包的名称,如 com.aivacom.mouselive
  • Project location:项目的存储路径
  • Language:项目的编程语言,如 Java
  • Minimum API level:项目的最低 API 等级

4 点击 Finish。根据屏幕提示,安装可能需要的插件等待项目sync完成

3.2 集成 SDK

  1. 修改项目外层build.gradle 文件,添加仓库路径(两处)
buildscript {
    repositories {
        maven { url "http://nexus.sunclouds.com:8081/nexus/content/groups/public/" }
        ......
    }
}

allprojects {
    repositories {
        ......
        maven { url "http://nexus.sunclouds.com:8081/nexus/content/groups/public/" }
        ......
    }
}
  1. 添加指定的SDK版本,如2.8.2
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    //此处添加ThunderBolt sdk, 比如引入版本为2.8.2
    implementation "com.rtc.thunder:thunderbolt:2.8.2"   
    .....
}
  1. 在使用到SDK的Module中添加SDK要求的权限:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.xxx.xxxx">
    .....
    //添加权限
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.CAMERA" />

    //添加软件特征
    <uses-feature android:name="android.hardware.audio.low_latency" />
    <uses-feature android:name="android.hardware.audio.pro" />
    <uses-feature android:name="android.hardware.microphone" android:required="true" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-feature android:name="android.hardware.camera" android:required="true" />
    <uses-feature android:name="android.hardware.camera.front" android:required="true" />
</manifest>
  1. 防止混淆代码:

如果应用编译时开启混淆,需要防止混淆,在规则文件proguard-rules.pro(/app/proguard-rules.pro)中添加以下内容,这样可以防止混淆库中的公共类名称:

-keep class com.rtc.thunder.** { *; }
-keep class org.webrtc.audioengine.** { *; }
-keep class com.yy.yyvideolib.** { *; }
-keep class com.yy.yyvideoplayer.** { *; }
-keep class com.yy.android.medialibrary.audiocodec.** { *; }
  1. 点击Sync,同步项目,完成集成。

4 实时视频通话

在集成SDK之后,我们就可以使用SDK来实现实时视频通话了。视频通话流程的API调用流程时序图如下图:

实时视频通话时序图

4.1 动态权限申请

调用 checkSelfPermission 方法,在开启 Activity 时检查并获取 Android 移动设备的摄像头和麦克风使用权限等。

private static final String[] REQUEST_PERMISSIONS = new String[]{
        Manifest.permission.CAMERA,
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.INTERNET,
        Manifest.permission.ACCESS_NETWORK_STATE,
        Manifest.permission.RECORD_AUDIO,
        Manifest.permission.MODIFY_AUDIO_SETTINGS,
        Manifest.permission.BLUETOOTH,
        Manifest.permission.BLUETOOTH_ADMIN
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_video_chat_view);


    if (checkSelfPermission(REQUESTED_PERMISSIONS[0], PERMISSION_REQ_ID) &&
        checkSelfPermission(REQUESTED_PERMISSIONS[1], PERMISSION_REQ_ID) &&
        checkSelfPermission(REQUESTED_PERMISSIONS[2], PERMISSION_REQ_ID)) {
      // TODO:
      // 获取权限后,初始化 SDK,并加入频道。
    }
}

private boolean checkSelfPermission(String permission, int requestCode) {
    if (ContextCompat.checkSelfPermission(this, permission) !=
            PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, REQUESTED_PERMISSIONS, requestCode);
        return false;
    }

    return true;
}

4.2 创建ThunderEngine引擎

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

你需要在该步骤中填入项目的 APPID。请参考如下步骤在官网控制台创建项目并获取 [APPID]。

ThunderEngine.createEngine(Context context,String appId,long sceneId,ThunderEventHandler handler);
ThunderEngine.setArea(isChina ?
                ThunderRtcConstant.AreaType.THUNDER_AREA_DEFAULT :
                ThunderRtcConstant.AreaType.THUNDER_AREA_FOREIGN);

详细描述请参考API手册中关于createEnginecreateWithLoopsetArea的说明。

在创建ThunderEngine的时候你需要根据场景需要通过ThunderEventHandler 监听SDK的各种事件、状态回调,如:

public void onTokenWillExpire() {}
public void onConnectionStatus(){}
public void onRemoteVideoStopped(String uid, boolean stop) {}

你还可以在ThunderEventHandler中的其他回调中结合不同的场景处理相应的回调。详情参见API文档

4.3 设置房间属性并加入房间

在加入房间之前,为了是用户能获得更好的体验需要设置房间的属性。

注意:在加入房间的时候需要提供Token,获取Token参考生成Token

ThunderEngine.setMediaMode(isAudio ?
                ThunderRtcConstant.ThunderRtcProfile.THUNDER_PROFILE_ONLY_AUDIO :
                ThunderRtcConstant.ThunderRtcProfile.THUNDER_PROFILE_NORMAL);
ThunderEngine.setRoomMode(int mode);
ThunderEngine.setAudioConfig(int profile,int commutMode,int scenarioMode);
ThunderEngine.joinRoom(byte[] token, String roomName, String uid);

详细描述请参考API手册中关于setMediaModesetRoomModejoinRoom的说明。

4.4 开启本地预览和开播

  1. 开启本地的预览视频:
ThunderVideoCanvas canvas = new ThunderVideoCanvas(ThunderPreviewView view, scaleMode, uid);
ThunderEngine.setLocalCanvasScaleMode(scaleMode);
ThunderEngine.setLocalVideoCanvas(canvas);
ThunderEngine.startVideoPreview();

详细描述请参考API手册中关于setLocalVideoCanvasstartVideoPreview的说明。

  1. 开播本地视频:
ThunderEngine.stopLocalVideoStream(false);

详细描述请参考API手册中关于stopLocalVideoStream的说明。在收到onJoinRoomSuccess的回调之后才能调用stopLocalVideoStream。

  1. 停止开播本地视频:
ThunderEngine.stopLocalVideoStream(true);
ThunderEngine.stopVideoPreview();

详细描述请参考API手册中关于stopLocalVideoStreamstopVideoPreview的说明。

在本地开播的过程中,用户可以设置开播的参数:

ThunderEngine.setVideoEncoderConfig(ThunderVideoEncoderConfiguration yyVideoConfig);

详细描述请参考API手册中关于setVideoEncoderConfig的说明。

4.5 接受远程视频并显示

如果用户在房间之中有其他用户进行开播,会在ThunderEventHandler的回调中会收到onRemoteVideoStopped的事件回调:

public void onRemoteVideoStopped(String uid, boolean stop) {}

在收到如上事件之后需要把远程用户的视频渲染出来:

ThunderVideoCanvas canvas = new ThunderVideoCanvas(ThunderPlayerView view, int renderMode, String uid);
ThunderEngine.setRemoteVideoCanvas(canvas);

详细描述请参考API手册中关于setRemoteVideoCanvas的说明。

4.6 离开频道

根据场景需要,如结束通话、关闭 App 或 App 切换至后台时,调用leaveRoom 离开当前通话频道。

int ret = mThunderEngine.leaveRoom();

详细描述请参考API手册中关于leaveRoom的说明。

5 API 参考

6 注意事项

在集成的时候需要注意几个点

  • 对于接口的返回值:方法调用成功返回 0,失败返回 < 0。
<