Ohos

DingRTC的基本功能包含初始化SDK、加入频道、本地发布、订阅远端和离开频道等。通过阅读本文,您可以了解DingRTC的基本功能。

前提条件

操作步骤

说明 本文中的实现方法仅供参考,您可以根据实际业务需求进行开发。
  1. 初始化SDK。

    您需要创建DingRtcSDK实例,并注册回调。具体回调接口请参见回调及监听

    createRtc(context: Context,level?: number, dir?: string): void {
      if(!dingRtc) {
        if(level)
          DingRtcSDK.setLogLevel(level)
        if(dir)
          DingRtcSDK.setLogDir(dir)
        dingRtc = DingRtcSDK.create(context);
        dingRtc.setEventListener(new ChatRtcEventListener());
      }
    }
    1. 本地预览。在创建完DingRtcSDK实例后,您可以创建canvas布局进行本地预览视频。

      let canvas: DingRtcConstants.RtcEngineVideoCanvas = {xComponentId: user.uid  + '_camera'}
      if(track == DingRtcConstants.RtcEngineVideoTrack.RtcEngineVideoTrackCamera) {
        canvas =  {xComponentId: user.uid  + '_camera', renderMode:this.renderMode}
        user.cameraCanvas = canvas;
      } else if(track == DingRtcConstants.RtcEngineVideoTrack.RtcEngineVideoTrackScreen) {
        canvas =  {xComponentId: user.uid  + '_screen', renderMode:this.renderMode}
      }
      dingRtc?.setLocalViewConfig(canvas,track);
      dingRtc?.startPreview();
    2. 可选:取消本地预览。

      dingRtc?.stopPreview();
    3. 设置发布与订阅。

      • SDK在入会时不会自动推流。想要入会即推流的话,在app里实现

        new DingRtcEventListener() {
          onJoinChannelResult(result: number, channel: string, userId: string, elapsed: number): void {
            console.info(TAG, `onJoinChannelResult: ${result}, elapsed: ${elapsed}`)
            if(result == DingRtcConstants.ErrorCode.NoError) {
              dingRtc?.publishLocalVideoStream(true);
              dingRtc?.publishLocalAudioStream(true);
            }
          }
        }
      • SDK默认入会后自动订阅远端的音频流与视频流,如果您不希望自动订阅音频与视频,可以在入会前通过以下接口设置:

        // 设置自动拉流,以及视频清晰度
        // 这些值根据需要配置
        boolean autoSubAudio = true;
        boolean autoSubVideo = true;
        DingRtcConstants.RtcEngineVideoStreamType preferVideoQuality = DingRtcConstants.RtcEngineVideoStreamType.RtcEngineVideoStreamTypeFHD;
        
        dingRtc?.subscribeAllRemoteAudioStreams(autoSubAudio);
        dingRtc?.subscribeAllRemoteVideoStreams(autoSubVideo);
        dingRtc?.setRemoteDefaultVideoStreamType(preferVideoQuality);
  2. 加入频道。

      let authInfo = new DingRtcConstants.AuthInfo();
      authInfo.channelId = login.cname; /* 频道ID */;
      authInfo.userId = login.uid; /* 用户ID */;
      authInfo.appId = login.appId;  /* 应用ID */;
      authInfo.token = login.token; /* 频道鉴权令牌Token */;
      authInfo.gslbServer = login.gslbServer; /* GSLB地址 */;
      ret = dingRtc?.joinChannel(authInfo, login.uname /* 显示名称 */)
    

    参数

    描述

    appId

    应用ID,在控制台应用管理页面创建和查看。

    channelId

    频道ID。1~64位,由大小写字母、数字、下划线(_)、短划线(-)组成。

    userId

    用户ID。1~64位,由大小写字母、数字、下划线(_)、短划线(-)组成。

    说明

    同一个用户ID在其他端登录,先入会的端会被后入会的端踢出频道。

    token

    频道鉴权令牌。

    gslbServer

    服务地址,可为空,默认值为:"https://gslb.dingrtc.com",请您通过业务服务器下发到客户端SDK,不建议您将该地址固化在客户端代码。

  3. 发布或取消发布本地流。

    入会之后,也可以改变推流状态。

    • 发布本地音频流和视频流

      如果此时没有推流,可以调用以下接口进行发布音频或者视频:

      dingRtc?.publishLocalVideoStream(true);
      dingRtc?.publishLocalAudioStream(true);

      或者取消推流

      dingRtc?.publishLocalVideoStream(false);
      dingRtc?.publishLocalAudioStream(false);

      音频和视频可以独立控制。

  4. 订阅或取消订阅远程流。

    • 订阅远端音频流和视频流

      如果您在入会前没有设置订阅音频流和视频流,则入会后会自动订阅远端的音频流和视频流;如果您在入会前设置取消自动订阅音频流和视频流,则入会后需要调用以下接口进行手动订阅:

      //
      // 对整体操作:全部订阅或者全部不订阅
      //
      // 音频
      dingRtc?.subscribeAllRemoteAudioStreams(true); // false表示不订阅
      // 视频
      dingRtc?.subscribeAllRemoteVideoStreams(true);
      dingRtc?.setRemoteDefaultVideoStreamType(preferVideoQuality); // 设置拉流最高质量
      
      //
      // 对个体操作
      //
      // 音频
      // SDK目前不支持对个体音频订阅操作
      // 视频
      dingRtc?.subscribeRemoteVideoStream(remoteUid,
          DingRtcConstants.RtcEngineVideoTrack.RtcEngineVideoTrackCamera,
          true); // false 表示不订阅
      dingRtc?.SetRemoteVideoStreamType(remoteUid, type);
          // type: DingRtcVideoStreamTypeFHD, DingRtcVideoStreamTypeHD,
          // DingRtcVideoStreamTypeSD, DingRtcVideoStreamTypeLD
          // 表示期望最高订阅规格。实际码流还要受限于拉流侧的网络质量

      订阅视频还需要设置窗口以便能够看到视频内容。比较推荐的时机是在onRemoteTrackAvailableNotify消息收到时,也可以提前设置,或者晚些时候设置。

      let canvas: DingRtcConstants.RtcEngineVideoCanvas = {xComponentId: user.uid  + '_camera'}
      if(track == DingRtcConstants.RtcEngineVideoTrack.RtcEngineVideoTrackCamera) {
        canvas =  {xComponentId: user.uid  + '_camera', renderMode:this.renderMode}
        user.cameraCanvas = canvas;
      } else if(track == DingRtcConstants.RtcEngineVideoTrack.RtcEngineVideoTrackScreen) {
        canvas =  {xComponentId: user.uid  + '_screen', renderMode:this.renderMode}
      }
      let isLocal = user.uid === this.login?.uid
      
      if(isLocal) {
        let ret = dingRtc?.setLocalViewConfig(canvas,track);
        console.info(TAG, `attachRender setLocalViewConfig ret:${ret}`)
      } else {
        let ret = dingRtc?.setRemoteViewConfig(canvas,user.uid,track);
        console.info(TAG, `attachRender setRemoteViewConfig ret:${ret}`)
      }

  5. 离开频道。

    dingRtc?.leaveChannel();

  6. 销毁引擎。

  release() {
    dingRtc?.release()
    dingRtc = null
    console.info(TAG, 'Call release done.')
  }

后续步骤

您可以下载示例代码,快速运行Demo,实现频道内和其他人进行实时音视频通话,详情请参见