快速入门

本文为您介绍如何使用 NERTC SDK 快速实现音视频通话功能。

前提条件

在开始运行工程之前,请您准备如下材料:

快速跑通Sample Code

注意:在运行前,请联系商务经理开通非安全模式。非安全模式建议只在集成开发阶段使用,正式上线前请改回安全模式。

下载 Sample Code 源码工程,打开 app/src/main/res/values/strings.xml 文件,配置AppKey:

<!-- 替换为你自己的AppKey -->
<string name="app_key">YOUR APP KEY</string>

然后,运行工程即可。

集成SDK

Maven集成

建议使用此方式集成

集成前,请先前往SDK下载页面查看当前最新版本。这里以 x.x.x 版本为例,在项目对应模块的 build.gradle 中加入:

api 'com.netease.yunxin:nertc:x.x.x'

手动集成

首先,请先前往SDK下载页获取当前最新版本SDK,解压后将对应的文件拷贝至项目(以Sample Code为例)路径中。

文件/文件夹 项目路径
nertc-sdk-3.7.0.jar /app/libs/
arm64-v8a
arm64-v7a
x86
/app/src/main/jniLibs/

此外,您可能还会看到 part 文件夹,无特殊情况可以先忽略。

然后,在 app/build.gradle 文件中设置 libs 路径。

android {
    ...
    compileOptions {
        // SDK 依赖的JDK版本为Java 8
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    ...

    dependencies {
        implementation fileTree(dir: "libs", include: ["*.jar"])
        ...
    }
}

最后,点击 File > Sync Project With Gradle Files 按钮,直到同步完成。

添加权限

打开 app/src/main/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.BROADCAST_STICKY"/>
 <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

 <!-- AndroidQ及以上还需要添加该权限 -->
 <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />

 <uses-feature android:name="android.hardware.camera"/>
 <uses-feature android:name="android.hardware.camera.autofocus"/>

防止代码混淆

proguard-rules.pro 文件中,为 NERTC SDK 添加 -keep 类的配置,这样可以防止混淆 NERTC SDK 公共类名称。

-keep class com.netease.lava.** {*;}
-keep class com.netease.yunxin.** {*;}

实现音视频通话

本节主要介绍如何使用 NERTC SDK 实现音视频通话,主要流程如下图所示: 流程图 流程图

初始化

import com.netease.lava.nertc.sdk.NERtcCallback;
import com.netease.lava.nertc.sdk.NERtcConstants;
import com.netease.lava.nertc.sdk.NERtcEx;
import com.netease.lava.nertc.sdk.NERtcParameters;
import com.netease.lava.nertc.sdk.video.NERtcRemoteVideoStreamType;
import com.netease.lava.nertc.sdk.video.NERtcVideoView;
// 示例
private void initializeSDK() {
        try {
            NERtcEx.getInstance().init(getApplicationContext(),Config.APP_KEY,this,null);
        } catch (Exception e) {
            showToast("SDK初始化失败");
            finish();
            ...
            return;
        }
        ...
}

设置本地视图

启动视频流

在加入频道前或后自行调用该方法启动视频流。

/**
 * 开启/关闭本地视频采集以及发送
 * @param enable    true: 开启,false : 关闭
 * @return   返回 0 代表调用成功,否则为失败
 */
public abstract int enableLocalVideo(boolean enable);
NERtcEx.getInstance().enableLocalVideo(enable);

设置本地视频画布

启动视频流后,可以设置本地视频画布,用来显示本地采集的视频画面。

/**
 * 设置本地预览画布,同一个画布只能设置给一个用户
 * @param render    视频绘制画布
 * @return   返回 0 代表调用成功,否则为失败
 */
public abstract int setupLocalVideoCanvas(com.netease.lava.api.IVideoRender render);
 private void setupLocalVideo() {
    NERtcVideoView localView = (NERtcVideoView)findViewById(R.id.local_view);
    NERtcEx.getInstance().setupLocalVideoCanvas(localView);
}

加入频道

加入频道前,请确保已完成初始化相关事项。若您的业务中涉及呼叫邀请等机制,可以使用信令

/**
 * 加入频道
 * @param token    频道token
 * @param channelName    频道名称
 * @param uid    用户的唯一标识Id,频道内每个用户的 UID 必须是唯一的。
 * @return   返回 0 代表调用成功,否则为失败
 */
public abstract int joinChannel(java.lang.String token,
                                java.lang.String channelName,
                                            long uid);
    private void joinChannel() {
        NERtcEx.getInstance().joinChannel(token,channelName,uid);
    }

初始化方法中传入的callback,其原型为 NERtcCallback。用户需要实现该接口来完成各种状态回调的处理。其中,onJoinChannel 回调为本端加入频道结果的回调。

/**
 * 加入频道结果回调
 * @param result   0 代表加入成功,其他为失败,参考 NERtcConstants.ErrorCode
 * @param channelId    频道id
 * @param elapsed    加入频道总耗时(毫秒)
 */
void onJoinChannel(int  result,
                   long channelId,
                   long elapsed);

设置远端视图

视频通话过程中,除了要显示本地的视频画面,通常也要显示参与通话的其他用户的远端视频画面。

监听远端用户进出频道

NERtcCallback提供监听远端用户进出频道的回调。

// 监听远端用户进入频道
void onUserJoined(long uid);

// 监听远端用户离开频道
void onUserLeave(long uid, int reason);

设置远端视频画布

监听到远端用户加入频道后,可以设置远端视频画布,用来显示远端用户的视频画面。

/**
 * 设置远端用户视频画布
 * @param render    视频绘制画布
 * @return   返回 0 代表调用成功,否则为失败
 */
public abstract int setupRemoteVideoCanvas(com.netease.lava.api.IVideoRender render, long uid);
private void setupRemoteVideo(long uid) {
    NERtcVideoView remoteView = (NERtcVideoView)findViewById(R.id.remote_view);
    NERtcEx.getInstance().setupRemoteVideoCanvas(remoteView,uid);
  }

监听远端视频流发布

当频道中的其他用户有视频流发出/关闭时,分别会走入NERtcCallback中的以下回调:

// 监听远端用户视频流发布
void onUserVideoStart(long uid, int maxProfile);

// 监听远端用户关闭视频流
void onUserVideoStop(long uid);
参数 描述
uid 远端用户ID
maxProfile 用户发送视频的最大分辨率类型,如:
HD1080p:1080P
HD720P:超清
STANDARD:高清
LOW:标清
LOWEST:低清

订阅远端视频流

在设置完远端视频画布后,且监听到远端用户有视频发布时,可以订阅远端用户的视频流。订阅成功后,即可显示远端的视频画面。

/**
 * 订阅 / 取消订阅指定远端用户的视频流
 * @param uid           用户ID
 * @param streamType    订阅的画质 NERtcRemoteVideoStreamType
 * @param subscribe     true: 订阅指定视频流(默认)false: 取消订阅指定视频流
 * @return   返回 0 代表调用成功,否则为失败
 */
public abstract int subscribeRemoteVideoStream(long uid,
                                               NERtcRemoteVideoStreamType streamType,
                                               boolean subscribe);
private void subscribeRemoteVideo(long uid, int profile, boolean subscribe) {
    NERtcEx.getInstance().subscribeRemoteVideoStream(uid, profile, subscribe);
  }

音频流

在 NERtcSDK 中,本地音频的采集发布和远端音频订阅播放是默认启动的,正常情况下无需开发者主动干预。

离开频道

当通话结束,需要离开频道,可以调用以下接口:

// 离开频道
public abstract int leaveChannel();
private void leaveChannel() {
    NERtcEx.getInstance().leaveChannel();
}

NERtcCallback中的 onLeaveChannel 回调为本端离开频道结果的回调。

/**
 * 离开频道回调
 * @param result  0代表退出成功,其他为失败,参见 NERtcConstants.ErrorCode
 */
void onLeaveChannel(int result);

销毁音视频实例

释放当前音视频实例,建议在 App 确定不再需要使用音视频 实例时,通过该接口释放实例的对象资源。

NERtcEx.getInstance().release();