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

前提条件

操作步骤

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

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

    engine_ = ding::rtc::RtcEngine::Create(""); // do not pass NULL pointer!
    
    // MyEngineEventListerner实现了RtcEngineEventListener
    listener_ = new MyEngineEventListerner();
    engine_->SetEngineEventListener((ding::rtc::RtcEngineEventListener *)listener_);
    1. 本地预览。在创建完RtcEngine实例后,您可以创建canvas布局进行本地预览视频。

      HWND local_view = GetDlgItem(IDC_STATIC_LOCAL)->m_hWnd;
      ding::rtc::RtcEngineVideoCanvas canvas;
      canvas.displayView = local_view;
      canvas.mirrorMode = ding::rtc::RtcEngineRenderMirrorModeAllMirror;
      canvas.renderMode = ding::rtc::RtcEngineRenderMode::RtcEngineRenderModeCrop;
      engine_->SetLocalViewConfig(canvas, ding::rtc::RtcEngineVideoTrackCamera);
      engine_->StartPreview();
    2. 可选:取消本地预览。

      engine_->stopPreview();
    3. 设置发布与订阅。

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

        class MyEngineEventListerner : public ding::rtc::RtcEngineEventListener
        {
        public:
          ..
        	void OnJoinChannelResult(int result, const char *channel,
        		const char *userId, int elapsed) override
        	{
        		// 不建议在SDK消息回调中再调用SDK的API
        		UpdateMeetingInfoParam *param = new UpdateMeetingInfoParam;
        		param->in_room = true;
        		main_wnd_->UpdateUIAsync(param);
        	}
          ..
        };
        
      • SDK默认入会后自动订阅远端的音频流与视频流,如果您不希望自动订阅音频与视频,可以在入会前通过以下接口设置:

        // 设置自动拉流,以及视频清晰度
        // 这些值根据需要配置
        bool auto_sub_audio_ = true;
        bool auto_sub_video_ = true;
        ding::rtc::RtcEngineVideoStreamType prefer_video_quality_ = ding::rtc::RtcEngineVideoStreamType::RtcEngineVideoStreamTypeFHD;
        
        engine_->SubscribeAllRemoteAudioStreams(auto_sub_audio_);
        engine_->SubscribeAllRemoteVideoStreams(auto_sub_video_);
        engine_->SetRemoteDefaultVideoStreamType(prefer_video_quality_);
  2. 加入频道。

    ding::rtc::RtcEngineAuthInfo auth;
    auth.channelId = /* 频道ID */;
    auth.appId = /* 应用ID */;
    auth.token = /* 频道鉴权令牌Token */;
    auth.userId = /* 用户ID */;
    auth.gslbServer = /* GSLB地址. 可不填写 */;
    engine_->JoinChannel(auth, nick /* 显示名称 */);
    

    关于auth字段的定义,参见使用Token鉴权

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

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

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

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

      engine_->PublishLocalVideoStream(true);
      engine_->PublishLocalAudioStream(true);

      或者取消推流

      engine_->PublishLocalVideoStream(false);
      engine_->PublishLocalAudioStream(false);

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

    • 发布小流

      新SDK扩展了小流概念,使用simulcast支持FHD (>=1080P), HD (>=720P), SD (>=480P), LD (<480P) 4种规格。比如如果您推的是FHD,SDK会自适应为您增加低规格的流。最多增加2层。应用无需编程自动获得这个能力。

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

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

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

      //
      // 对整体操作:全部订阅或者全部不订阅
      //
      // 音频
      engine_->SubscribeAllRemoteAudioStreams(true); // false表示不订阅
      // 视频
      engine_->SubscribeAllRemoteVideoStreams(true);
      engine_->SetRemoteDefaultVideoStreamType(prefer_video_quality_); // 设置拉流最高质量
      
      //
      // 对个体操作
      //
      // 音频
      // SDK目前不支持对个体音频订阅操作
      // 视频
      engine_->SubscribeRemoteVideoStream(remoteUid,
          ding::rtc::RtcEngineVideoTrack::RtcEngineVideoTrackCamera,
          true); // false 表示不订阅
      engine_->SetRemoteVideoStreamType(remoteUid, type);
          // type: RtcEngineVideoStreamTypeFHD, RtcEngineVideoStreamTypeHD
          // RtcEngineVideoStreamTypeSD, RtcEngineVideoStreamTypeLD
          // 表示期望最高订阅规格。实际码流还要受限于拉流侧的网络质量

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

      HWND remote_view = GetDlgItem(IDC_STATIC_REMOTE)->m_hWnd;
      ding::rtc::RtcEngineVideoCanvas canvas;
      canvas.displayView = remote_view;
      canvas.mirrorMode = ding::rtc::RtcEngineRenderMirrorModeAllMirror;
      canvas.renderMode = ding::rtc::RtcEngineRenderMode::RtcEngineRenderModeCrop;
      engine_->SetRemoteViewConfig(canvas, p->uid.c_str(), ding::rtc::RtcEngineVideoTrackCamera);
      

  5. 离开频道。

    engine_->LeaveChannel();

  6. 销毁引擎。

if(engine_ != NULL) {
		ding::rtc::RtcEngine::Destroy(engine_);
		engine_ = NULL;
}

if(listener_ != NULL) {
    delete listener_;
    listener_ = NULL;
}

后续步骤

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