实时音视频云

  • 快速开始

    最近更新时间:2018-05-16 17:19:34

    初始化

    首先,在 Application 里,完成 SDK 的初始化操作:

    QNRTCEnv.init(getApplicationContext());
    

    添加连麦需要的渲染控件

    本地预览窗口的配置

    需要在 XML 中期望的位置添加 QNLocalSurfaceView 用来做本地预览画面的渲染。

    示例代码如下:

    <com.qiniu.droid.rtc.QNLocalSurfaceView
        android:id="@+id/local_surface_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    

    对于本地预览的窗口,可以通过 QNRTCManager.initialize(Context context, QNLocalSurfaceView localWindow) 或者 QNRTCManager.initialize(Context context, QNRTCSetting setting, QNLocalSurfaceView localWindow) 方法配置

    示例代码如下:

    mLocalWindow = (QNLocalSurfaceView) findViewById(R.id.local_surface_view);
    mRTCManager = new QNRTCManager();
    mRTCManager.initialize(this, setting, mLocalWindow);
    

    远端渲染窗口的配置

    需要在 XML 中期望的位置添加 QNRemoteSurfaceView 用来做远端视频画面的渲染。多人参与音视频互动可以添加多个窗口。

    示例代码如下:

    <com.qiniu.droid.rtc.QNRemoteSurfaceView
        android:id="@+id/remote_surface_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    

    对于远端的渲染窗口,可以通过 QNRTCManager.addRemoteWindow(QNRemoteSurfaceView remoteWindow) 方法添加

    示例代码如下:

    mRemoteWindow = (QNRemoteSurfaceView) findViewById(R.id.remote_surface_view);
    mRTCManager.addRemoteWindow(mRemoteWindow);
    

    配置连麦采集编码相关的参数

    本操作推荐在 Activity.onCreate() 函数中完成

    QNRTCSetting setting = new QNRTCSetting();
    setting.setAudioBitrate(100 * 1000)
            .setVideoBitrate(videoBitrate)
            .setBitrateRange(videoBitrate, QNRTCSetting.DEFAULT_MAX_BITRATE)
            .setCameraID(QNRTCSetting.CAMERA_FACING_ID.FRONT)
            .setHWCodecEnabled(isHwCodec)
            .setVideoPreviewFormat(new QNVideoFormat(videoWidth, videoHeight, QNRTCSetting.DEFAULT_FPS))
            .setVideoEncodeFormat(new QNVideoFormat(videoWidth, videoHeight, QNRTCSetting.DEFAULT_FPS));
    

    调用 initialize 方法完成配置

    本操作推荐在 Activity.onCreate() 函数中完成

    mLocalWindow = (QNLocalSurfaceView) findViewById(R.id.local_surface_view);
    mRTCManager = new QNRTCManager();
    mRTCManager.initialize(Context context, QNRTCSetting setting, mLocalWindow);
    

    在调用 initialize 的过程中会默认开启音视频的采集。


    设置回调

    QNRoomEventListener 包含了连麦过程中的所有重要回调接口,因此在初始化过程中需要注册该监听器:

    mRTCManager.setRoomEventListener(QNRoomEventListener listener);
    

    开始连麦

    上面一系列的配置结束后,可以调用如下接口加入房间并开始连麦,在成功加入房间之后,就可以进行媒体流的发布、订阅等操作了。加入房间的过程需要 App 服务端的配合,详情请见服务端文档

    加入房间的函数原型如下:

    /**
     * 加入房间
     *
     * 加入房间成功后会触发 onJoinedRoom() 的回调,可以在回调里面去发布媒体流到连麦服务器
     *
     * @param roomToken 连麦的Token,由 App 服务器动态生成
     */
    public void joinRoom(String roomToken)
    

    示例代码如下:

    mRTCManager.joinRoom(mRoomToken);
    

    在连麦之后,用户可以根据业务场景的需求在适当的时间调用离开房间的接口退出连麦,详情请见房间管理


    发布媒体流

    在成功加入房间,即收到 onJoinedRoom 的回调之后,即可调用如下函数进行媒体流的发布操作:

    /**
     * 发布音视频媒体流
     *
     * 调用该方法发布媒体流,其中,可以通过调用 QNRTCSetting.setVideoEnabled(boolean enable) 和 QNRTCSetting.setAudioEnabled(boolean enable) 方法来控制是否发布音频或视频
     */
    public void publish()
    

    示例代码如下:

    @Override
    public void onJoinedRoom() {
        mRTCManager.publish();
    }
    

    媒体流成功发布之后,远端用户便会收到 onRemotePublished 的回调并可以选择调用订阅接口去订阅该媒体流。

    在媒体流发布之后,用户可以根据业务场景的需求在适当的时间调用取消发布的接口取消发布相应的媒体流,详情请见媒体流的发布与订阅


    订阅远端媒体流

    在成功加入房间之后,如果收到了远端用户发布媒体流的回调 onRemotePublished,即可调用如下函数进行媒体流的订阅操作:

    /**
     * 订阅远端窗口
     *
     * @param userId 远端连麦者的 userId,userId 可通过 onRemotePublished 回调获取
     */
    public void subscribe(String userId)
    

    示例代码如下:

    @Override
    public void onRemotePublished(String userId, boolean hasAudio, boolean hasVideo) {
        mRTCManager.subscribe(userId);
    }
    

    订阅成功之后会触发 onSubscribed 回调,用户可以在该回调中做一些操作比如开启统计信息等。

    在成功订阅之后,用户可以根据业务场景的需求在适当的时间调用取消订阅的接口取消订阅相应的媒体流,详情请见媒体流的发布与订阅


    退出

    在连麦结束,整个 Activity 销毁的时候(建议在 onDestroy 中),需要调用如下函数释放资源:

    /**
     * Release resources
     */
    public void destroy()
    

    示例代码如下:

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mRTCManager != null) {
            mRTCManager.destroy();
            mRTCManager = null;
        }
    }
    
    以上内容是否对您有帮助?
  • Icon free helper
    Close