直播屏幕共享是一种在视频通话或互动直播过程中,将本地屏幕内容以视频形式实时分享给远端观众的功能。直播屏幕共享允许主播或参与者将电脑、手机等设备的屏幕内容(如文件、网页、PPT、应用界面等)实时展示给在线观众,从而增强互动性和沟通效率。
屏幕共享在多种场景中得到了广泛应用,比如:
- 视频会议:分享会议资料、演示文稿或实时操作,提升会议效率。
- 在线教育:教师可以通过屏幕共享展示课件、解题过程或软件操作,为学生提供直观的教学体验。
- 远程协作:团队成员可以共享屏幕进行协同工作,如代码编辑、设计评审等。
- 互动直播:主播可实时展示游戏画面、软件操作或产品演示,增强观众的参与感。
直播实现屏幕共享流程
屏幕共享做为一个基础的视频能力, 开发者在集成 ZEGO 实时音视频 SDK 后,通过简单的配置即可快速实现此功能。下面我们以 Windows 平台为例来看下具体实现流程。
提示:其它平台实现流程请参考以下文档👇
前提条件
在实现屏幕共享功能之前,请确保:
- Visual Studio 2013 或以上版本。
- Windows7、Windows8、Windows10 或以上版本。
- 已在ZEGO 控制台创建项目,并申请有效的 AppID 和 AppSign,详情请参考控制台 – 项目信息。
- 已在项目中集成 ZEGO Express SDK,并实现了基本的音视频推拉流功能,详情请参考快速开始 – 集成和快速开始 – 实现流程。
实现流程
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即构科技,如若转载,请注明出处:https://market-blogs.zego.im/reports-technique/2286/