1 螢屏共享功能介紹
螢屏共享是指在視頻通話或互動直播程序中將螢屏內容以視頻的方式分享給其他的觀眾,以增強互動體驗,提高溝通效率,螢屏共享解決方案提升了用戶實時視頻通話的溝通效率,
螢屏共享在如下場景中應用廣泛:
- 視頻會議場景中,螢屏共享可以將講話者本地的檔案、資料、網頁、PPT 等畫面分享給其他與會人;
- 在線課堂場景中,螢屏共享可以將老師的課件、筆記、講課內容等畫面展示給學生觀看,

2 螢屏共享示例原始碼下載
請參考 下載示例原始碼 獲取原始碼,
相關原始碼請查看 “/ZegoExpressExample/Others/src/main/java/com/example/others/screensharing” 目錄下的檔案,
others
...
├── screensharing
│ ├── CaptureScreenService.java //此檔案實作了系統 Service 介面
│ ├── ScreenSharingActivity.java // 此檔案主要完成了通過 ZegoExpress SDK 將螢屏畫面資料流推送到遠端的作業
│ ├── VideoCaptureScreen.java //此檔案用于通過安卓系統介面創建 VirtualDisplay 實體,獲取螢屏資料,并發送給 ZEGO Express SDK
│ └── ZegoVideoCaptureCallback.java //此檔案實作了 ZegoExpress 的 IZegoCustomVideoCaptureHandler
...
3 螢屏共享功能實作準備作業-集成螢屏共享SDK
在實作螢屏共享功能之前,請確保:
- 已在專案中集成 ZEGO Express SDK,實作基本的實時音視頻功能,詳情請參考 快速開始 - 集成 和 快速開始 - 實作視頻通話,
- 已在 ZEGO 控制臺 創建專案,并申請有效的 AppID 和 AppSign,詳情請參考 控制臺 - 專案管理 中的“專案資訊”,
4 螢屏共享實作流程-即構螢屏共享SDK
我們需要結合 Android 系統 API 和 ZEGO Express SDK 的自定義視頻采集來進行螢屏分享,
下圖展示了 Android 平臺實作螢屏共享的資料流轉:

4.1 獲取用戶錄制螢屏授權
在錄制螢屏前需要獲取用戶的授權,不同版本下需要獲取的權限如下:
- Android 4.4 及之前版本必須獲取到 root 權限后才能實作螢屏錄制,由于目前大部分設備的系統版本都高于 4.4,該場景此處不做贅述,
- Android 5.0 及以上版本,可以使用系統提供的 MediaProjection 和 MediaProjectionManager 進行螢屏錄制,該版本下可以不獲取 root 權限,但會彈窗提示用戶是否允許應用錄制螢屏,需要用戶授權,
- Android 10.0 及以上版本,螢屏錄制使用系統 API 時需要用到前臺服務,詳情請參考 官方檔案,
public static MediaProjectionManager mMediaProjectionManager;
if (Build.VERSION.SDK_INT < 21) {
Toast.makeText(ZGVideoCaptureOriginUI.this, getString(R.string.record_request), Toast.LENGTH_SHORT).show();
finish();
} else {
// 5.0及以上版本
// 請求錄屏權限,等待用戶授權
mMediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);
startActivityForResult(mMediaProjectionManager.createScreenCaptureIntent(), REQUEST_CODE);
}
4.2 螢屏共享SDK-創建 MediaProjection 實體
- 在 AndroidManifest.xml 中添加相關配置,
為實作 Android 10.0 及以上版本應用的螢屏錄制,需要在代碼中開啟前臺服務,并在 AndroidManifest.xml 中注冊 Service,添加 foregroundServiceType 屬性,
<application>
<activity android:name="im.zego.videocapture.ui.ZGVideoCaptureDemoUI" />
<activity android:name="im.zego.videocapture.ui.ZGVideoCaptureOriginUI"></activity>
<service android:name=".service.CaptureScreenService"
android:enabled="true"
android:foregroundServiceType="mediaProjection"/>
</application>
- 用戶授權后創建 MediaProjection 實體,
- 對于 Android 10.0 以下版,直接在授權成功后獲取 MediaProjection
- 對于 Android 10.0 及以上版本,MediaProjection 實體的創建需要在前臺服務的 onStartCommand 方法中執行,
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.Q){
//Target版本高于等于10.0需要使用前臺服務,并在前臺服務的onStartCommand方法中創建MediaProjection
service=new Intent(ZGVideoCaptureOriginUI.this, CaptureScreenService.class);
service.putExtra("code",resultCode);
service.putExtra("data",data);
startForegroundService(service);
}else {
//Target版本低于10.0直接獲取MediaProjection
mMediaProjection = mMediaProjectionManager.getMediaProjection(resultCode, data);
}
}
}
創建一個類,實作 Service 介面,在 onStartCommand 中創建 MediaProjection 實體,
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class CaptureScreenService extends Service {
...
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
···
//在這里獲取MediaProjection
ZGVideoCaptureOriginUI.mMediaProjection = ZGVideoCaptureOriginUI.mMediaProjectionManager.getMediaProjection(mResultCode, Objects.requireNonNull(mResultData));
return super.onStartCommand(intent, flags, startId);
}
···
}
4.3 螢屏共享SDK-開啟 ZegoExpress SDK 的自定義視頻采集功能
呼叫 ZegoExpress SDK 的 enableCustomVideoCapture 開啟自定義采集功能,詳情請參考 自定義視頻采集,
//VideoCaptureScreen繼承IZegoCustomVideoCaptureHandler,用于監聽自定義采集onStart和onStop回呼
VideoCaptureScreen videoCapture = new VideoCaptureScreen(ZGVideoCaptureOriginUI.mMediaProjection, DEFAULT_VIDEO_WIDTH, DEFAULT_VIDEO_HEIGHT, mSDKEngine);
//監聽自定義采集開始停止回呼
mSDKEngine.setCustomVideoCaptureHandler(videoCapture);
ZegoCustomVideoCaptureConfig videoCaptureConfig=new ZegoCustomVideoCaptureConfig();
//使用SurfaceTexture型別進行自定義采集
videoCaptureConfig.bufferType=ZegoVideoBufferType.SURFACE_TEXTURE;
//開始自定義采集
mSDKEngine.enableCustomVideoCapture(true, videoCaptureConfig, ZegoPublishChannel.MAIN);
4.4 螢屏共享SDK-登錄房間并開始推流
呼叫 loginRoom 介面,傳入房間 ID 引數 “roomID” 和用戶引數 “user”,登錄房間,
呼叫 startPublishingStream 介面,傳入流 ID 引數 “streamID”,向遠端用戶發送本端的音視頻流,
/** 創建用戶 */
ZegoUser user = new ZegoUser("user1");
/** 開始登錄房間 */
mSDKEngine.loginRoom("room1", user);
/** 開始推流 */
mSDKEngine.startPublishingStream("stream1");
4.5 創建 VirtualDisplay 并給 ZEGO Express SDK 發送螢屏資料-
1、創建 ZegoVideoCaptureCallback 類繼承 IZegoCustomVideoCaptureHandler,
2、創建 VideoCaptureScreen 類繼承 ZegoVideoCaptureCallback,
當收到 onStart 回呼后,開發者可以通過 MediaProjection 創建 VirtualDisplay 實體,用于獲取螢屏資料,并發送給 ZEGO Express SDK,
3、通過 createVirtualDisplay 系統 API 將虛擬顯示幕的內容渲染到 Surface,
//ZegoVideoCaptureCallback繼承于IZegoCustomVideoCaptureHandler
class VideoCaptureScreen extends ZegoVideoCaptureCallback {
@Override
//當收到onStart回呼后,就可以通過MediaProjection創建VirtualDisplay,并給ZEGO SDK塞螢屏資料
public void onStart(ZegoPublishChannel channel) {
if (mZegoEngine != null && !mIsCapturing && mMediaProjection != null) {
mIsCapturing = true;
//通過ZEGO API getCustomVideoCaptureSurfaceTexture獲取SurfaceTexture,該介面默認使用主路通道進行推流
SurfaceTexture texture = mZegoEngine.getCustomVideoCaptureSurfaceTexture();
texture.setDefaultBufferSize(mCaptureWidth, mCaptureHeight);
//通過獲取的SurfaceTexture創建Surface
mSurface = new Surface(texture);
//通過mSurface,完成將錄屏資料塞給ZEGO SDK
mVirtualDisplay = mMediaProjection.createVirtualDisplay("ScreenCapture",
mCaptureWidth, mCaptureHeight, 1,
DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC, mSurface, null, mHandler);
}
}
}
至此,我們已完成采集螢屏資料并通過 ZegoExpress SDK 分享到遠端的操作,
5 觀看遠端螢屏共享-遠程控制
完成以上步驟之后,其他用戶可以使用 startPlayingStream 介面拉取螢屏共享流,詳細步驟可以參考 快速開始,
// 同樣的,拉流播放的用戶首先需要初始化 SDK 并登陸同一個房間
...
...
// 拉流播放,需傳入發起螢屏共享的用戶推流時所用的 streamID
mSDKEngine.startPlayingStream(streamID, new ZegoCanvas(playView));
6 獲取螢屏共享SDK更多幫助
獲取本文的Demo、開發檔案、技術支持,訪問即構檔案中心
近期有開發規劃的開發者可上即構官網查看,恰逢即構七周年全線音視頻產品1折的優惠,聯系商務獲取RTC產品優惠;
音視頻場景解決方案分享,更多詳情可搜索官網(https://zegoguanwang.datasink.sensorsdata.cn/t/pB)轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/500893.html
標籤:Android
