上一篇 Android设备管控开发实战:普通三方 APK 如何实现远程截屏?Accessibility 与 MediaProjection 怎么选 我们解决了"远程截一张图"。但管理员要的往往不是一张图,而是"把这台设备的画面持续给我看"——家长想看孩子平板正在发生什么,门店运维想远程确认现场画面。这就是从"单次截屏"到"连续画面采集"的跨越。
先说结论:连续采集的本质不是"更快地截图",而是把画面当成一条编码后的视频流传输。我最初的实现是循环截屏 + 定时上传,真机上直接失败:一张 720p PNG 两三百 KB,2 秒一张就是 1Mbps 持续上行,平板半小时就烫手,管理员看到的还是 0.5fps 的幻灯片。循环截屏还有个更深的缺陷——没有背压机制,网络差时帧照样堆在上传队列里,画面越来越旧,代码却毫无感知。
边界说明:MediaProjection 授权流程、Android 14+ 每次会话强制重新授权、前台服务声明,上一篇已交付,本文不再重复。
一、选型:为什么是 WebRTC
| 路线 | 延迟 | 代价 |
|---|---|---|
| 循环截屏 + 上传 | 1-3 秒 | 带宽大、无降级手段 |
| MediaRecorder 录文件 | 分钟级 | 是"回看"不是"看" |
| WebRTC 推流 | 亚秒级 | 需要信令服务器 |
WebRTC 一次性解决三个问题:VP8/H.264 硬编码把带宽压到几百 kbps,码率自适应内建,ICE 断线有明确的状态回调。内网/局域网场景,它是普通三方 APK 做连续画面采集的唯一合理路线。
二、采集:帧率与分辨率封顶
WebRTC SDK 自带 ScreenCapturerAndroid,内部用 MediaProjection 创建 VirtualDisplay,直接对接编码管线,不需要再碰 ImageReader:
// ScreencastEngine.kt
fun start(projectionData: Intent) {
ensureFactoryInitialized() // PeerConnectionFactory + EglBase 进程级单例
// isScreencast=true 让编码器进入屏幕内容模式,对文字更友好
videoSource = factory.createVideoSource(/* isScreencast = */ true)
surfaceTextureHelper =
SurfaceTextureHelper.create("screencast-tex", eglBase.eglBaseContext)
capturer = ScreenCapturerAndroid(projectionData, projectionCallback)
capturer.
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/qq_19703985/article/details/164117407



