观看屏幕共享
本文介绍加入连麦之后如何观看屏幕共享。
说明
在加入连麦之后才可以观看屏幕共享。
观看屏幕共享视频流画面之前,需要主动订阅视频流,不订阅则不会进行拉流,无法观看视频流。
订阅屏幕共享视频流画面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);
}
}