快速开始
如果您已经完成了上文中提到的开发准备,现在就让我们开始编写一个基本的实时音视频应用吧。这个应用会展示 SDK 基本的连麦功能,包括 加入房间,采集,发布,订阅 等过程。但是在实际的连麦应用开发过程中,是需要后端介入的(用于给用户鉴权并生成 RoomToken),在这里为了减少开发的时间,请您先预先生成 2 个 RoomToken(要求同一个 APPID,同一个 RoomName,不同的 UserName)。
如果您还不知道如何生成 RoomToken,请先阅读 七牛实时音视频云接入指南
初始化
首先,在 Application 里,完成 SDK 的初始化操作:
QNRTCEnv.init(getApplicationContext());
添加音视频通话需要的渲染控件
用户需要在布局文件中期望的位置添加两个 QNSurfaceView 分别用来做本地视频画面预览窗口和远端视频画面渲染窗口。
示例代码如下:
<com.qiniu.droid.rtc.QNSurfaceView
android:id="@+id/local_surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.qiniu.droid.rtc.QNSurfaceView
android:id="@+id/remote_surface_view"
android:layout_width="150dp"
android:layout_height="150dp" />
mLocalWindow = findViewById(R.id.local_surface_view);
mRemoteWindow = findViewById(R.id.remote_surface_view);
创建音视频通话核心类
本操作推荐在 Activity 生命周期中的 onCreate() 中完成
mEngine = QNRTCEngine.createEngine(getApplicationContext());
设置回调
QNRTCEngineEventListener 包含了音视频通话过程中的所有重要接口,因此需要注册该监听器:
mEngine.setEventListener(/*QNRTCEngineEventListener*/ listener);
创建 Track
Track 是 v2.x.x 版本中推出的新概念,如果您对 Track 概念不太了解,请查看 SDK 概述中的概念介绍。在本文中介绍的是快速搭建一个音视频通话程序,所以我们创建一条视频 Track 和一条音频 Track,并将它们设置为 master 轨道,代码如下:
QNTrackInfo localVideoTrack = mEngine.createTrackInfoBuilder()
.setVideoEncodeFormat(format)
.setSourceType(QNSourceType.VIDEO_CAMERA)
.setBitrate(600 * 1000)// 设置视频码率
.setMaster(true)
.create();
QNTrackInfo localAudioTrack = mEngine.createTrackInfoBuilder()
.setSourceType(QNSourceType.AUDIO)
.setBitrate(64 * 1000)// 设置音频码率
.setMaster(true)
.create();
创建好本地视频 Track 后即可设置预览窗口,代码如下:
mEngine.setRenderWindow(localVideoTrack, mLocalWindow);
SDK 提供了与 v1.x 版本相同的
QNRTCEngine#publish
接口,能够让 v1.x 版本用户更方便地升级至 v2.x 版本,若使用此接口则无需在此创建 Track。
加入房间
上文提到过,SDK 所有的功能都是从 RoomToken
开始的,所以加入房间只需要将 RoomToken
作为参数传给 SDK 就可以了。代码如下:
mEngine.joinRoom(roomToken);
加入房间成功后会触发 onRoomStateChanged(QNRoomState state)
回调,状态会从 QNRoomState.CONNECTING 变为 QNRoomState.CONNECTED。此时即可进行发布、订阅等操作。
在进入音视频通话房间之后,用户可以根据业务场景的需求在适当的时间调用离开房间的接口退出连麦,详情请见房间管理。
发布本地 Tracks
成功加入房间后,即可在 onRoomStateChanged
回调中调用以下代码进行本地 Track 的发布:
@Override
public void onRoomStateChanged(QNRoomState state) {
switch (state) {
case CONNECTED:
mEngine.publishTracks(Arrays.asList(localVideoTrack, localAudioTrack));
break;
}
}
发布成功后,本地会收到 onLocalPublished(List<QNTrackInfo> trackInfoList)
回调。远端用户会收到 onRemotePublished(String remoteUserId, List<QNTrackInfo> trackInfoList)
回调。
SDK 提供了
QNRTCEngine#publish
/QNRTCEngine#publishVideo
/QNRTCEngine#publishAudio
接口,可利用这些接口快速发布作为 master 的音视频/视频/音频 Track,无需自行创建及管理 Track。
订阅远端 Tracks
SDK 默认会进行自动订阅,订阅成功后将会收到 onSubscribed(String remoteUserId, List<QNTrackInfo> trackInfoList)
的回调,在此回调内则可进行对 Track 的渲染窗口设置的操作:
@Override
public void onSubscribed(String remoteUserId, List<QNTrackInfo> trackInfoList) {
for(QNTrackInfo track : trackInfoList) {
if (track.getTrackKind().equals(QNTrackKind.VIDEO)) {
mEngine.setRenderWindow(track, mRemoteWindow);
}
}
}
在成功订阅之后,用户可以根据业务场景的需求在适当的时间调用取消订阅的接口取消订阅相应的 Track,详情请见发布与订阅
离开房间
当音视频通话结束,调用以下代码离开房间:
mEngine.leaveRoom()
销毁
在整个 Activity 销毁时,用户需要调用以下代码对资源进行释放,一般此操作建议在 Activity 生命周期的 onDestroy()
中进行,示例代码如下:
@Override
protected void onDestroy() {
super.onDestroy();
mRTCEngine.destroy();
}