直播实现屏幕共享 | 基于 ZEGO SDK 快速实现屏幕共享功能

直播屏幕共享是一种在视频通话或互动直播过程中,将本地屏幕内容以视频形式实时分享给远端观众的功能。直播屏幕共享允许主播或参与者将电脑、手机等设备的屏幕内容(如文件、网页、PPT、应用界面等)实时展示给在线观众,从而增强互动性和沟通效率。

屏幕共享在多种场景中得到了广泛应用,比如:

  • 视频会议:分享会议资料、演示文稿或实时操作,提升会议效率。
  • 在线教育:教师可以通过屏幕共享展示课件、解题过程或软件操作,为学生提供直观的教学体验。
  • 远程协作:团队成员可以共享屏幕进行协同工作,如代码编辑、设计评审等。
  • 互动直播:主播可实时展示游戏画面、软件操作或产品演示,增强观众的参与感。

直播实现屏幕共享流程

屏幕共享做为一个基础的视频能力, 开发者在集成 ZEGO 实时音视频 SDK 后,通过简单的配置即可快速实现此功能。下面我们以 Windows 平台为例来看下具体实现流程。

提示:其它平台实现流程请参考以下文档👇

前提条件

在实现屏幕共享功能之前,请确保:

实现流程

1. 获取窗口(包括屏幕)列表信息

SDK 可以通过getScreenCaptureSources获取当前可共享的所有窗口信息。

IZegoExpressEngine *engine = ZegoExpressSDK::getEngine();
std::vector<ZegoScreenCaptureSourceInfo> infoList = engine->getScreenCaptureSources(400, 400, 100, 100);

2. 创建屏幕共享源

通过上述窗口信息里的窗口 ID 与窗口类型,调用createScreenCaptureSource接口创建屏幕共享源对象。

if (infoList.size() > 0) {
    ZegoScreenCaptureSourceInfo info = infoList[0];
    IZegoScreenCaptureSource *source = engine->createScreenCaptureSource(info.sourceID, info.sourceType);
}

3. 设置采集源为屏幕共享源

SDK 推流的视频源默认为摄像头源,如果需要推屏幕共享源,需要通过setVideoSource进行切换为屏幕共享。

engine->setVideoSource(ZEGO_VIDEO_SOURCE_SCREEN_CAPTURE, source->getIndex(), ZEGO_PUBLISH_CHANNEL_MAIN);

4. 启动共享

调用startCapture接口可以共享窗口画面。

source->startCapture();

5. 更新共享源

调用updateCaptureSource接口可以更新共享窗口画面。

ZegoScreenCaptureSourceInfo info = infoList[1];
source->updateCaptureSource(info.sourceID, info.sourceType);

6. 更新共享源区域

调用updateCaptureRegion接口可以动态更新共享窗口区域。其中设置为 (0, 0, 0, 0) 可恢复整个窗口共享。

source->updateCaptureRegion(10, 10, 400, 400);

7. 过滤指定窗口

调用setExcludeWindowList接口可以过滤掉共享的屏幕中指定窗口画面,只适用于共享整个屏幕的时候设置。

void* list[2];
list[0] = infoList[1].sourceID
list[1] = infoList[2].sourceID
source->setExcludeWindowList(list, 2);

8. 是否激活窗口

调用enableWindowActivate接口可以激活当前共享的窗口。

source->enableWindowActivate(true);

9. 是否显示鼠标

调用enableCursorVisible接口可以显示或隐藏鼠标。

source->enableCursorVisible(true);

10. 设置事件回调

调用setEventHandler接口可以设置共享源事件回调。

std::shared_ptr<ScreenCaptureSourceEventHandler> handler = std::make_shared<ScreenCaptureSourceEventHandler>(this);
source->setEventHandler(handler);

···
// 采集数据回调,可用于本地录制。
void onAvailableFrame(IZegoScreenCaptureSource * /*source*/, const void * /*data*/,unsigned int /*dataLength*/, ZegoVideoFrameParam /*param*/) override;

// 采集异常回调,当有异常回调时,会中断采集。
void onExceptionOccurred(IZegoScreenCaptureSource * /*source*/,ZegoScreenCaptureSourceExceptionType /*exceptionType*/) override;

// 窗口采集状态回调,当窗口区域位置更改时,会通过此回调通知,当窗口不在当前屏幕区域内时,会停止采集。
void onWindowStateChanged(IZegoScreenCaptureSource * /*source*/,ZegoScreenCaptureWindowState /*windowState*/,ZegoRect /*windowRect*/) override;

11. 登录房间并开始推流

调用loginRoom接口,传入房间 ID 参数 “roomID” 和用户参数 “user”,登录房间。

调用startPublishingStream接口,传入流 ID 参数 “streamID”,向远端用户发送本端的音视频流。

// 开始登录房间
ZegoUser user(m_currentUserId, m_currentUserId);
engine->loginRoom(m_currentRoomId, user);

// 开始推流
engine->startPublishingStream(m_currentPublishStreamId, ZEGO_PUBLISH_CHANNEL_MAIN);

至此,我们已完成采集屏幕数据并通过 ZEGO Express SDK 分享到远端的操作。

12. 观看远端屏幕共享

完成以上步骤之后,其他用户可以使用startPlayingStream接口拉取屏幕共享流。

ZegoCanvas canvas(ZegoUtilHelper::GetView(ui->frame_Play));
canvas.viewMode = ZEGO_VIEW_MODE_ASPECT_FIT;
engine->startPlayingStream(m_currentPlayStreamId, &canvas);

13. 停止共享

用户可以调用stopCapture接口停止共享。

source->stopCapture();

14. 销毁屏幕采集源对象

不再需要使用屏幕采集功能时,可调用destroyScreenCaptureSource接口销毁屏幕采集源对象。

engine->destroyScreenCaptureSource(source);

通过以上步骤即可在直播中实现屏幕共享功能。如果您有具体的使用需求,可以根据场景选择合适的SDK或平台进行开发。开发过程中如有问题可以联系咨询我们👇

直播实现屏幕共享 | 基于 ZEGO SDK 快速实现屏幕共享功能

原创文章,作者:ZEGO即构科技,如若转载,请注明出处:https://market-blogs.zego.im/reports-technique/2286/

(0)
上一篇 1天前
下一篇 11月 7, 2024 10:38 上午

相关推荐

发表回复

登录后才能评论