1 屏幕共用功能介紹 屏幕共用是指在視頻通話或互動直播過程中將屏幕內容以視頻的方式分享給其他的觀眾,以增強互動體驗,提高溝通效率。屏幕共用解決方案提升了用戶實時視頻通話的溝通效率。 屏幕共用在如下場景中應用廣泛: 視頻會議場景中,屏幕共用可以將講話者本地的文件、數據、網頁、PPT 等畫面分享給其他與 ...
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)