Video SDK for Android 快速接入

概述

游密音视频SDK(Video SDK)是游密科技公司旗下的一款专注于为开发者提供实时语音技术和服务的云产品。我们的研发团队来自腾讯,其中不少是拥有10年以上音视频经验的专家,专业专注;我们的服务端节点部署遍布全球,为用户提供高效稳定的实时云服务,且弹性可扩展。通过Video SDK,能够让您的应用轻松拥有多人实时视频通话的能力,可广泛应用于社交、游戏、在线教育、视频会议等场景。支持一对一、多人实时视频互动,打破屏幕阻隔,还原最纯粹的面对面聊天场景。

四步集成

Step1:注册账号

游密官网注册游密账号。

Step2:添加应用,获取Appkey

在控制台添加应用,添加成功后 在网页左边的游戏栏会增加一个对应的应用,点击进去就可以获得接入需要的AppkeyAppsecret

Step3:下载Video SDK包体

根据游戏使用的游戏引擎与开发语言,在下载入口下载对应的SDK包体。

Step4:开发环境配置

开发环境配置

快速接入

开发环境

  1. Android Studio 2.1 或以上版本。
  2. Android SDK 25、Android SDK Build-Tools 25.0.2、Android SDK Platform-Tools 25.x.x 或以上版本。
  3. Android 4.0 或以上版本,且支持音频的 Android 设备或模拟器(推荐使用真机)。
  4. Android 设备已经连接到 Internet。

SDK集成

  1. 解压SDK并将lib文件夹的所有文件移至Android工程-app-libs文件夹下(示例代码中 “libs” 目录仅为举例,开发者可根据实际路径填写)。
  2. 添加 SDK 引用,进入到 “app” 目录,打开 “build.gradle” 文件。在 “defaultConfig” 节点添加 “ndk” 节点,指定支持的平台类型。
    defaultConfig{
    //添加如下设置支持到so库架构
    ndk{
        abiFilters 'arm64-v8a','armeabi-v7a'      //架构可选对应项目需要的
    }
    }
  3. 在 “dependencies” 节点引入 “libs” 下所有的 jar。

    dependencies {
    implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])
    }
  4. AndroidManifest.xml配置,添加录音录像和网络等相关权限。

    <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"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.BROADCAST_STICKY"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-feature android:name="android.hardware.camera"/>
    <uses-feature android:name="android.hardware.camera.autofocus"/>
  5. 防止混淆代码:YOUMESDK不需要混淆,如果你的工程有混淆,请在proguard-rules.pro文件中添加如下代码:
    -keep class com.youme.**{*;}
    -keepattributes Signature

视频通话时序图

时序图

视频通话相关代码

初始化

初始化Video SDK:其中appKey和appSecret为在游密后台申请的App Key和App Secret。serverZone:IM服务器区域,一般使用0表示中国,其余设置值可查看官网文档-服务器部署地区定义。

mRtcEngine = YouMeLiveVideoEngine.initSDK(appKey, appSecret, serverZone, "", getApplicationContext());

设置回调监听

// 设置消息回调监听
mRtcEngine.setCallback(this);

消息回调接口实现

@Override
public void onEvent(int eventType, int iErrorCode, String roomId, Object param) {

    if (eventType == YouMeConst.YouMeEvent.YOUME_EVENT_INIT_OK) {
        Log.i(TAG, "-----初始化引擎成功");
    }
    else if (eventType == YouMeConst.YouMeEvent.YOUME_EVENT_INIT_FAILED) {
        Log.i(TAG, "-----初始化引擎失败");
    }
}
@Override
public void onJoinChannelSuccess(String channel, String userId) {
    Log.i(TAG, "-----本端已加入频道");
}
@Override
public void onLeaveChannel() {
    Log.i(TAG, "-----本端已离开频道");
}
@Override
public void onUserJoined(String userId) {
    Log.i(TAG, "-----远端发布流:" + userId);
}
@Override
public void onUserOffline(String userId) {
    Log.i(TAG, "-----远端取消发布流:" + userId);
}
@Override
public void onUserMuteAudio(String userId, boolean muted) {
    Log.i(TAG, "-----远端音频操作:" + userId + ",is muted=" + muted);
}
@Override
public void onUserMuteVideo(String userId, boolean muted) {
    Log.i(TAG, "-----远端视频操作:" + userId + ",is muted=" + muted);
}

帧率、分辨率设置,加入频道

onEvent收到初始化成功消息YouMeEvent.YOUME_EVENT_INIT_OK后: 设置传输视频分辨率、视频帧率:其中fps为帧率(3-30),默认15帧,width为宽,height为高。

VideoEncoderConfiguration config = new VideoEncoderConfiguration(width, height, fps, 0);
mRtcEngine.setVideoEncoderConfiguration(config);

加入频道: 其中userID:用户标识,channelID:频道标识, autoRecv:是否自动接收频道内其他有人的视频,true表示自动接收,如果为false,需要调用setUsersVideoInfo指定接收流后才会收到对方视频。

mRtcEngine.joinChannel(userID, channelID, autoRecv);

发布音视频流

  1. 加入频道成功后,发布流前先切换角色到主播YOUME_USER_HOST。

    //发布流前先切换角色到主播
    mRtcEngine.setClientRole(YouMeConst.YouMeUserRole.YOUME_USER_HOST);

    userRole:用户在语音频道里面的角色,主要分为YOUME_USER_HOST(可以随时讲话和播放战歌等)、YOUME_USER_LISTENER(只听不讲)、YOUME_USER_TALKER_FREE(自由讲话者)等,详情见YouMeUserRole定义。

  2. 将视频流与本地视频渲染视图(SurfaceViewRenderer)绑定,其中mUserId为本端加入频道时的userID。
SurfaceViewRenderer videoView = mRtcEngine.CreateRendererView(getBaseContext(), RendererCommon.ScalingType.SCALE_ASPECT_FIT, false);
mRtcEngine.setupLocalVideo(userId, videoView);
  1. 最后发布本地音视频流。
mRtcEngine.muteLocalAudioStream(false);
mRtcEngine.muteLocalVideoStream(false);

取消发布流

  1. 用户角色切换为观众角色YOUME_USER_LISTENER。
mRtcEngine.setClientRole(YouMeConst.YouMeUserRole.YOUME_USER_LISTENER);
  1. 取消发布本地音视频流。
mRtcEngine.muteLocalAudioStream(true);
mRtcEngine.muteLocalVideoStream(true);
  1. 解绑本地视频流与视频渲染视图,参数为本端加入频道时的userID。
mRtcEngine.deleteLocalVideo(mUserId);

收到远端用户发布流回调

回调onUserJoined触发时,即收到其他用户发布音视频流的回调事件,将该用户的视频流与远端视频渲染视图绑定,其中userId为远端用户的userID。

SurfaceViewRenderer videoView = mRtcEngine.CreateRendererView(getBaseContext(), RendererCommon.ScalingType.SCALE_ASPECT_FIT, false);
mRtcEngine.setupRemoteVideo(userId, videoView);                         

收到远端用户取消发布流回调

回调onUserOffline触发时,即收到其他用户取消发布音视频流的回调事件,解绑该用户视频流与视频渲染视图,参数为远端加入频道时的userID。

mRtcEngine.deleteRemoteVideo(userId);

离开频道,销毁引擎

离开频道。

[self.youmeEngine leaveChannel];

销毁引擎。

[self.youmeEngine destory];