文档

观看屏幕共享

更新时间:

本文介绍加入连麦之后如何观看屏幕共享。

说明

  • 加入连麦之后才可以观看屏幕共享。

  • 观看屏幕共享视频流画面之前,需要主动订阅视频流,不订阅则不会进行拉流,无法观看视频流。

订阅屏幕共享视频流画面API使用示例

iOS端(Objective-C):

// 订阅/取消订阅屏幕共享视频流画面
id<AIRBRoomChannelProtocol> room = [[AIRBRoomEngine sharedInstance] getRoomChannelWithRoomID:@"xxx"]
[room.rtc subscribeRemoteScreenShareStream:(BOOL)sub fromUser:(NSString*)userID];

Android端(Java):

// 订阅/取消订阅屏幕共享视频流画面 —— 使用enable进行控制,true为订阅,false为取消订阅
rtcService.subscribeRemoteVideoStream(userId, AliRtcVideoTrackScreen, enable);

Web端(JavaScript):

// 如果正在订阅此人,先取消订阅
await rtcService.unSubscribe(userId)
// 之后订阅此人的屏幕流
await rtcService.subscribeScreen(userId)
// 当此人取消屏幕流时,也先取消订阅,再正常订阅大流
await rtcService.unsubscribe(userId)
await rtcService.subscribe(userId)

Windows端(c++):

// 订阅/取消订阅屏幕共享视频流画面
auto room_ptr = alibaba::meta_space::MetaSpace::GetInstance()->GetRoomInstance(room_id);
auto rtc_plugin = std::dynamic_pointer_cast<IRtc>(room_ptr->GetPlugin(PluginRtc));
std::string uid;
HWND hwnd;
rtc_plugin->StartShowScreenStream(uid, hwnd);
rtc_plugin->StopShowScreenStream(uid);

观看屏幕共享视频流画面API使用示例

iOS端(Objective-C):

// 观看他人屏幕共享视频流画面,需要通过实现AIRBRTCProtocol的AIRBRTCDelegate中的如下方法和事件来通知
- (void) onAIRBRTCRemotePeerViewAvailable:(NSString*)userID view:(UIView*)view type:(AIRBRTCVideoViewType)type{
    if (type == AIRBRTCVideoViewTypeScreen){
        // 订阅
        [room.rtc subscribeRemoteScreenShareStream:YES fromUser:(NSString*)userID];
        // 将屏幕共享视频流画面添加到需要的地方
        [viewHolder addSubview:view]; 
    }
}

Android端(Java):

// 观看他人屏幕共享视频流画面
rtcService.addEventHandler(new SampleRtcEventHandler(){
    @Override
    public void onRtcStreamIn(RtcStreamEvent event) {
        // Rtc流进入
        // 使用event.aliVideoCanvas.view 进行渲染
    }
});

Web端(JavaScript):

// 获取事件列表
const { EventNameEnum } = window.RoomPaasSdk
// 在执行订阅后,监听订阅成功通知
chatService.on(EventNameEnum.onSubscribeResult, (event) => {
  // 使用setDisplayRemoteVideo将流输出到videoDom元素上
  // streamType订阅结果返回,1为摄像头流,2为屏幕分享流,也有可能出现两个流同时存在的情况,可以手动切换
  rtcService.setDisplayRemoteVideo(document.querySelector('video'), event.userId, event.streamType)
})

Windows端(c++):

// 观看他人屏幕共享视频流画面
// 继承RtcEventListener,并重写OnShareScreen方法
virtual void OnShareScreen(const ShareScreenMessageModel & event) override {
  auto room_ptr = alibaba::meta_space::MetaSpace::GetInstance()->GetRoomInstance(room_id);
  auto rtc_plugin = std::dynamic_pointer_cast<IRtc>(room_ptr->GetPlugin(PluginRtc));
  std::string uid;
  HWND hwnd;
  if(event.open) {
     rtc_plugin->StartShowScreenStream(uid, hwnd);
  }
  else {
     rtc_plugin->StopShowScreenStream(uid);
  }
} 

发起/结束屏幕共享相关消息通知示例

iOS端(Objective-C):

// 发起/结束屏幕共享的消息,需要通过实现AIRBRoomChannelProtocol的AIRBRoomChannelDelegate中的如下方法和事件来通知,
- (void) onAIRBRoomChannelEvent:(AIRBRoomChannelEvent) event info:(NSDictionary*)info{
    switch (event) {
        case AIRBRoomChannelEventMessageReceived:{
            AIRBRoomChannelMessageType messageType = [[info valueForKey:@"type"] integerValue];
            switch (messageType) {
                case AIRBRoomChannelMessageTypeOnScreenShareOpened:{
                    NSData *turnData = [[info valueForKey:@"data"] dataUsingEncoding:NSUTF8StringEncoding];
                    NSDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:turnData options:NSJSONReadingMutableLeaves error:nil];
                    // 自定义处理
                }
                break;
                .....
            }
        }
        break;
        .....
    }
}

Android端(Java):

// 发起/结束屏幕共享的消息
@Override
public void onRemoteTrackAvailableNotify(String uid,
                                         AliRtcEngine.AliRtcAudioTrack audioTrack, AliRtcEngine.AliRtcVideoTrack videoTrack) {
    if (audioTrack == AliRtcEngine.AliRtcAudioTrack.AliRtcAudioTrackNo ||
            videoTrack == AliRtcEngine.AliRtcVideoTrack.AliRtcVideoTrackNo) {
        // 无流状态,无需处理
        return;
    }

    final RtcStreamEvent rtcStreamEvent = createRtcStreamInfo(uid, videoTrack, false);
    dispatch(new Consumer<RtcEventHandler>() {
        @Override
        public void consume(RtcEventHandler eventHandler) {
            eventHandler.onRtcStreamIn(rtcStreamEvent);
        }
    });
}

Web端(JavaScript):

// 获取事件列表
const { EventNameEnum } = window.RoomPaasSdk
// 监听发起/结束屏幕共享的消息通知
chatService.on(EventNameEnum.PaaSRtcScreen, (event) => {
  // 在这里执行上面提到的订阅/取消订阅操作
  event.data.open ? console.log('开始分享屏幕') : console.log('结束分享屏幕')
})

Windows端(c++):

// 发起/结束屏幕共享的消息
// 观看他人屏幕共享视频流画面
// 继承RtcEventListener,并重写OnShareScreen方法
virtual void OnShareScreen(const ShareScreenMessageModel & event) override {
  auto room_ptr = alibaba::meta_space::MetaSpace::GetInstance()->GetRoomInstance(room_id);
  auto rtc_plugin = std::dynamic_pointer_cast<IRtc>(room_ptr->GetPlugin(PluginRtc));
  std::string uid;
  HWND hwnd;
  if(event.open) {
     rtc_plugin->StartShowScreenStream(uid, hwnd);
  }
  else {
     rtc_plugin->StopShowScreenStream(uid);
  }
} 
  • 本页导读 (1)
文档反馈