屏幕共享,是指在视频通话或互动直播过程中将屏幕内容以视频的方式分享给其他的观众,以增强互动体验,提高沟通效率。
屏幕共享在如下场景中应用广泛:
在实现屏幕共享功能之前,请确保:
(必选)Android 在录制屏幕前,会弹窗提示用户是否允许应用录制屏幕,请进行授权。
请务必声明以下权限,否则将无法使用屏幕共享功能。
如果目标 Android SDK 版本是 34.0.0 及以后版本,您需要进入您项目的 “app/src/main” 目录,打开 “AndroidManifest.xml” 文件,设置 FOREGROUND_SERVICE
及 FOREGROUND_SERVICE_MEDIA_PROJECTION
权限声明。
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION"/>
SDK 推流的视频源默认为摄像头源,如果需要推屏幕共享源,需要通过 setVideoSource 进行切换为屏幕共享。
ZegoExpressEngine.instance().setVideoSource(ZegoVideoSourceType.ScreenCapture, ZegoPublishChannel.Aux);
SDK 推流的音频源默认为麦克风源,如果需要推屏幕共享源,需要通过 setAudioSource 进行切换为屏幕共享。
ZegoExpressEngine.instance().setAudioSource(ZegoAudioSourceType.ScreenCapture, ZegoPublishChannel.Aux);
有两种屏幕共享方式,分别为应用内屏幕共享和跨应用屏幕共享。
若用户只在应用内共享画面与声音,可以调用 startScreenCaptureInApp 接口开启屏幕共享。也可调用 broadcastFinished 接口回调屏幕共享结束通知,若屏幕采集失败可接收到失败的原因。
ZegoExpressEngine.instance().startScreenCaptureInApp();
跨应用屏幕共享是由 iOS 系统通过 Extension 扩展进程进行录制的,所以需要再额外创建扩展进程,并启动。具体请参考如下实现步骤:
Broadcast Upload Extension 的内存使用限制为 50 MB,请勿在屏幕共享的 Extension 中进行额外的内存分配。
无需勾选 “Include UI Extension”。
创建完成后,您会在项目中看到该 Extension 的文件夹,结构类似如下,该文件夹用于存放屏幕共享功能的实现代码:
若用户需要共享整个系统,可以调用 startScreenCapture 接口开启屏幕共享。
ZegoExpressEngine.instance().startScreenCapture();
如下系统回调的实现可以在 下载示例源码 中的 “/ZegoExpressExample-iOS-OC/Topics/ScreenCapture/ZegoExpressExample-iOS-OC-Broadcast/SampleHandler.m” 文件中查看:
ZegoReplayKitExt
类中的如下接口创建数据传输通道:[ZegoReplayKitExt.sharedInstance setupWithDelegate:self];
在 processSampleBuffer 系统回调中,通过 ZegoReplayKitExt
类中的 sendSampleBuffer
接口发送给 ZEGO Express SDK。
[ZegoReplayKitExt.sharedInstance sendSampleBuffer:sampleBuffer withType:sampleBufferType];
系统通过 broadcastFinished 回调通知 Extension 屏幕录制已结束,您可以在该回调中,调用 ZegoReplayKitExt
类中的如下接口停止屏幕共享并断开数据传输通道:
[ZegoReplayKitExt.sharedInstance finished];
完成上述屏幕共享源的采集过程后,将采集到的数据源 startPublishingStream 推送到云服务器。(推送数据源的通道必须与设置采集源的通道保持一致)
ZegoExpressEngine.instance().startPublishingStream(streamID, ZegoPublishChannel.Aux);
完成以上步骤后,其他用户可以使用 startPlayingStream 接口拉取屏幕共享流。
// 拉流播放,需传入发起屏幕共享的用户推流时所用的 streamID
ZegoExpressEngine.instance().startPlayingStream(streamID, {"reactTag": findNodeHandle(this.refs.zego_play_view), "viewMode": 0, "backgroundColor": 0});
iOS 是否支持共享指定区域?
iOS 系统仅支持共享整个屏幕,不支持共享指定区域。
iOS 使用屏幕共享时进入后台,为什么会停止采集?
iOS 使用屏幕共享时出现音频播放异常,如何处理?
若使用屏幕共享功能采集并推流音频,同时又在本机使用拉流功能,会导致 iOS 系统重复采集拉流音频,导致音频播放异常,建议使用 muteAllPlayStreamAudio 禁止拉取所有音频流。
联系我们
文档反馈