更新记录
1.0.0(2026-11-15)
- 新增面向 HarmonyOS 平板整屏采集并发布到 SRS/RTMP 的稳定版插件合同,保留 H.264 Surface 编码、可选麦克风 AAC、事件和诊断能力。
- 修复带
?txSecret、?auth_key等 SRS 签名查询参数的 RTMP 地址被公共校验拒绝的问题,并统一端口范围校验。 - 修复启动与停止请求关联编号可能重复的问题,补齐 DNS、握手、连接和断开失败到统一 RTMP 错误码的映射。
- 优化 uni-app x 示例的根入口类型导入和宿主诊断标记,统一 Harmony HAR、配置和构建元数据为 1.0.0。
平台兼容性
uni-app(5.34)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| - | √ | - | - | √ | - | - | - | √ |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
uni-app x(5.34)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| - | - | - | - | √ | - |
lizhao-screen-push Harmony 屏幕 RTMP 推流 UTS 插件
介绍
lizhao-screen-push 面向 uni-app Vue3 与 uni-app x 的 HarmonyOS 宿主,把用户确认的系统屏幕采集直接编码并发布到 SRS 等 RTMP 服务;默认无音频,可选麦克风音频,源码与验证状态以本说明为准。
功能特色
| 功能 | 解决的问题 | API、配置或事件 |
|---|---|---|
| 系统屏幕采集 | 不需要把屏幕帧逐帧传到 JS | startScreenPush、Harmony AVScreenCapture |
| H.264 Surface 编码 | 避免 MP4 中转和页面层编码 | width、height、fps、videoBitrate |
| SRS RTMP 发布 | 一号平板推流,其他设备沿用已有拉流链路 | url、getScreenPushCapabilitiesSync().pushProtocols |
| 可选音频 | 默认关闭;需要时只请求麦克风 | audioSource: 'none' | 'microphone'、Harmony 麦克风权限 |
| 生命周期与事件 | 授权、连接、推流、错误和停止均可观察 | stopScreenPush、onScreenPushEvent、offScreenPushEvent |
| 脱敏诊断 | 复现一次后复制完整报告排查 | getScreenPushDiagnosticsSync、示例页分段复制 |
适合哪些场景
| 场景 | 推荐能力 | 使用边界 |
|---|---|---|
| 局域网 Pad 同屏 | 每台 Pad 使用独立 RTMP 流名推送到 SRS | 需要自行分配流名并防止多个设备覆盖同一路径 |
| 教室或展厅演示 | 默认无音频的屏幕推流 | 当前要求页面前台运行,锁屏和后台长期保活未承诺 |
| 带讲解的投屏 | 选择 audioSource: 'microphone' |
只采集麦克风;系统内录音频列为后续扩展 |
现有 lizhao-live 项目迁移 |
复用已有 SRS/拉流地址管理 | lizhao-live 的相机采集和预览组件不能直接替代屏幕采集 |
下载与导入
| 宿主 | 示例代码位置 |
|---|---|
| uni-app | uni_modules/lizhao-screen-push/example/uniapp/index.vue |
| uni-app x | uni_modules/lizhao-screen-push/example/uniappx/index.uvue |
从基础到进阶:按业务模块使用
模块一:检查能力并启动
页面只从插件根入口导入。url 是接入方准备的实际 SRS 地址,不会由插件猜测或内置。地址可以带 SRS 常见的签名查询参数,例如 ?txSecret=...&txTime=...,插件会在诊断和报告中脱敏。Harmony 首次启动会出现系统录屏确认,用户拒绝时 Promise 会以 9392005 失败。
import { getScreenPushCapabilitiesSync, startScreenPush } from '@/uni_modules/lizhao-screen-push'
const capabilities = getScreenPushCapabilitiesSync()
if (!capabilities.supported) {
console.error(capabilities.verification)
} else {
startScreenPush({
url: 'rtmp://192.168.1.10/live/pad-1',
audioSource: 'none'
}).then((session) => {
console.log(session.sessionId, session.urlHost, session.width, session.height, session.fps)
}).catch((error) => {
console.error(error.errSubject, error.errCode, error.errMsg)
})
}
模块二:可选麦克风与事件
麦克风是显式选择项,默认值为 none。启用后由 Harmony 系统请求 ohos.permission.MICROPHONE;权限失败不会伪装成无声推流成功。
import { onScreenPushEvent, offScreenPushEvent, startScreenPush } from '@/uni_modules/lizhao-screen-push'
const listenerId = onScreenPushEvent((event) => {
console.log(event.type, event.state, event.errCode, event.detail)
})
startScreenPush({ url: 'rtmp://192.168.1.10/live/pad-1', audioSource: 'microphone', audioBitrate: 64000 })
.catch((error) => console.error(error.errCode, error.errMsg))
// 页面退出或不再需要事件时释放监听器。
offScreenPushEvent(listenerId)
模块三:停止与重启
停止操作应使用启动成功返回的 sessionId。启动尚未返回 sessionId 前没有可取消的公开句柄,页面应在启动 Promise 完成后再允许停止;页面销毁时对已返回的会话调用 stopScreenPush。重复停止、页面已经没有活跃会话时返回 state: 'stopped' 的幂等结果;释放失败会保留原生错误,不能根据按钮点击推断远端已经停止。
import { stopScreenPush } from '@/uni_modules/lizhao-screen-push'
stopScreenPush(sessionId).then((result) => {
console.log(result.state, result.dataJSON)
}).catch((error) => {
console.error('停止结果未知', error.errSubject, error.errCode, error.errMsg)
})
模块四:诊断报告与复制
示例页底部的“一键复制日志”会固定一次快照,包含插件版本、源码构建标记、宿主运行信息、能力结果、会话和有界脱敏操作日志。报告超过剪贴板长度时使用“复制下一段”;只有剪贴板回读与固定段完全一致后才推进段号。回读失败时使用手动文本入口,不提示伪成功。
import { getScreenPushDiagnosticsSync } from '@/uni_modules/lizhao-screen-push'
const snapshot = getScreenPushDiagnosticsSync()
console.log(snapshot.pluginId, snapshot.version, snapshot.buildMarker, snapshot.entries.length)
API 用途速查
| API | 用途与返回值 |
|---|---|
startScreenPush(options) |
请求录屏授权、建立编码与 RTMP 发布;返回 Promise<ScreenPushSession> |
stopScreenPush(sessionId) |
停止采集、编码和发布;返回 Promise<ScreenPushResult>,无活跃会话时幂等成功 |
getScreenPushCapabilitiesSync() |
同步返回平台、协议、音频源、授权和实现校验信息 |
onScreenPushEvent(listener) |
注册持续事件监听,返回监听器 ID |
offScreenPushEvent(listenerId) |
移除指定监听器,重复调用安全 |
getScreenPushDiagnosticsSync() |
返回版本、源码标记、活跃会话和有界脱敏日志快照 |
startScreenPush 参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
url |
string |
是 | 完整 rtmp:// 地址,必须包含主机、应用名和流名;流名可带 SRS 签名查询参数 |
无 | 长度不超过8192,端口1–65535 |
width |
number |
否 | 偶数视频宽度,范围160–1920 | 1280 | 以设备编码器能力为准 |
height |
number |
否 | 偶数视频高度,范围160–1920 | 720 | 以设备编码器能力为准 |
fps |
number |
否 | 整数帧/秒,范围1–60 | 24 | 以设备编码器能力为准 |
videoBitrate |
number |
否 | 视频码率,单位bps,范围100000–12000000 | 1200000 | 以设备编码器能力为准 |
audioSource |
'none' \| 'microphone' |
否 | 音频来源;当前不采集系统内录音频 | none |
microphone |
audioBitrate |
number |
否 | 麦克风音频码率,单位bps | 64000 | 16000–320000 |
timeoutMs |
number |
否 | 授权、连接和初始化超时,单位毫秒 | 15000 | 1000–60000 |
followRotation |
boolean |
否 | 是否跟随旋转重新配置屏幕采集 | true |
当前设备实际旋转行为以 Harmony 回调为准 |
返回值、回调和事件
ScreenPushSession 包含 sessionId、state、脱敏后的 urlHost、实际尺寸、帧率、音频源和 startedAt。ScreenPushResult 包含 sessionId、requestId、state、dataJSON;原生清理细节只放在 dataJSON 和诊断日志中。
ScreenPushEvent 包含 sessionId、requestId、type、state、时间、errCode、errMsg 和 detail。当前原生事件类型包括 connected、screen-started、capturing、video-written、audio-written、mediaReady 和 error;原生错误事件会触发一次异步资源释放,业务仍应先读取错误字段和诊断,再决定是否重新启动。启动尚未完成时再次调用 startScreenPush 也会返回 9392004,避免两个编码会话并发进入原生层。事件监听器不会自动释放,页面退出时调用 offScreenPushEvent。
错误码说明
errSubject 固定为 lizhao-screen-push。Promise 失败对象包含 errSubject、errCode、errMsg、operation、sessionId、requestId、nativeType、nativeStack;采集不到的原生字段为空字符串。超时、取消和远端结果未知不会被当作确定成功或确定失败。
| 错误码 | 含义 | 处理建议 |
|---|---|---|
| 9392001 | RTMP 地址格式无效 | 检查协议、主机、应用名和流名 |
| 9392002 | 屏幕推流参数无效 | 检查偶数尺寸、帧率、码率、音频源和超时 |
| 9392003 | 当前平台不支持 | 先读取能力;非 Harmony 端使用真实降级或停止 |
| 9392004 | 已有活跃会话 | 先停止旧会话,再启动新流 |
| 9392005 | 用户取消或未授予屏幕采集 | 按系统提示授权后由用户重新启动 |
| 9392006 | Harmony 屏幕采集初始化或启动失败 | 检查系统录屏能力、占用和原生诊断 |
| 9392007 | 视频编码器或 Surface 不可用 | 降低规格或更换设备;保留原生错误 |
| 9392008 | RTMP DNS、连接或发布失败 | 检查局域网、SRS 端口、流名和鉴权 |
| 9392009 | 麦克风权限或采集失败 | 关闭音频重试,或授权麦克风后重试 |
| 9392010 | 操作超时,媒体结果可能未知 | 查询 SRS 状态;不要盲目重复有副作用的发布 |
| 9392011 | 会话已停止或释放 | 创建新会话,不复用旧 sessionId |
| 9392012 | 录屏被来电、切换或其他录屏打断 | 读取事件与诊断,必要时重新授权启动 |
| 9392013 | 原生回调合同无效 | 核对插件源码、HAR 和自定义基座版本 |
| 9392014 | 资源释放失败 | 保留 nativeStack,重启前确认系统资源状态 |
| 9392015 | 诊断报告序列化失败 | 使用页面手动文本并保留原始日志 |
| 9392016 | 原生屏幕推流实现异常 | 提交完整报告,不能只提供“操作失败” |
注意事项
平台与宿主支持范围
| 平台/宿主 | 状态 | 边界 |
|---|---|---|
| uni-app Vue3 | 提供示例与公共 API | Harmony App 需要匹配原生自定义基座;Web/小程序返回明确不支持 |
| uni-app x | 提供 .uvue 示例与公共 API |
Harmony App 需要匹配原生自定义基座;其他端不宣称屏幕 RTMP 能力 |
| HarmonyOS | 当前目标平台 | 使用系统录屏授权、Surface 编码和自有 RTMP/HAR;完成编译后再做真机验收 |
| Android / iOS | 未实现 | 不复制 Harmony 代码冒充支持,后续单独接入平台原生采集链 |
| Web | 明确不支持 | 不使用浏览器 getDisplayMedia 伪装成 App 屏幕推流 |
| 小程序 | 明确不支持 | 不把平台直播组件或拉流能力冒充本插件推流 |
权限、隐私与生命周期
Harmony 模块声明网络权限;选择麦克风时才需要麦克风权限。屏幕采集由系统录屏确认处理,不申请与本能力无关的权限。屏幕内容和音频只发送到调用方提供的媒体地址,诊断默认只保存在本地内存并脱敏,不自动上传。
当前要求用户在应用前台启动并维持推流;系统内录音频、后台长期保活、锁屏继续推流和自动恢复列为后续扩展。页面隐藏或销毁时先调用 stopScreenPush,再解除事件监听;停止 Promise 未确认前不要立即启动同一路流名。
原生 ETS/C++、本地 HAR、权限、资源或 module.json5 变化后必须重新原生联编并制作匹配自定义基座;WGT 或 appResource 不能把新原生代码注入旧基座。没有 DevEco/Harmony 工具链、匹配自定义基座或真机时,只能报告静态和编译结果,不能把它描述成真机同屏通过。
资源与地址限制
RTMP 地址由接入方准备;日志会把完整媒体地址、查询参数和凭据统一脱敏。SRS 应为每台 Pad 分配不同流名,拉流端沿用现有播放链路。网络失败、DNS 超时、服务端拒绝或流名冲突都通过错误码与诊断报告返回,不会显示伪成功。启动阶段的授权、DNS 和 RTMP 发布握手仍在等待时,调用方尚未拿到 sessionId,只能等待 Promise 成功或失败;需要停止时使用成功结果中的会话编号。
作者系列 UTS 插件
| 插件 | 能力方向 | 插件市场 |
|---|---|---|
lizhao-alipay-kit |
支付宝授权登录、App 支付与脱敏诊断 | 查看插件 |
lizhao-app-keepalive |
应用保活、唤醒、自愈与报告 | 查看插件 |
lizhao-apple-iap |
苹果内购、交易恢复、订阅管理与服务端验签参考 | 查看插件 |
lizhao-apple-login |
苹果授权登录、凭证状态与撤销监听 | 查看插件 |
lizhao-bg-audio |
背景音频播放、队列、倍速与事件 | 查看插件 |
lizhao-ble |
BLE 扫描、连接、读写、通知与自动重连 | 查看插件 |
lizhao-call-kit |
电话、短信、通讯录原生能力 | 查看插件 |
lizhao-camera-pro |
原生相机、拍照录像、水印与媒体保存 | 查看插件 |
lizhao-cast-screen |
DLNA 投屏、AirPlay 路由入口 | 查看插件 |
lizhao-choose-file |
原生文件选择、上传、进度与取消 | 查看插件 |
lizhao-device-id |
设备标识、隐私策略与诊断 | 查看插件 |
lizhao-dingtalk |
钉钉授权登录、内容分享与回执诊断 | 查看插件 |
lizhao-doc-corrector |
文档扫描、矫正、增强与识别 | 查看插件 |
lizhao-douyin-kit |
抖音授权登录、内容分享与回执诊断 | 查看插件 |
lizhao-emu-detect |
模拟器环境检测、风险评分与证据 | 查看插件 |
lizhao-float-window |
悬浮窗、画中画、权限与诊断 | 查看插件 |
lizhao-gallery-pro |
相册媒体分页、筛选、缩略图与导出 | 查看插件 |
lizhao-google-login |
Google 授权登录、会话管理与脱敏诊断 | 查看插件 |
lizhao-hce-card |
NFC 虚拟卡、APDU 交互与 NDEF 标签模拟 | 查看插件 |
lizhao-health |
健康数据授权、查询、统计与写入 | 查看插件 |
lizhao-http-server |
本地 HTTP 服务、文件传输与实时通信 | 查看插件 |
lizhao-icon-pro |
SVG 图标组件、多主题与缓存 | 查看插件 |
lizhao-id-photo |
证件照制作、尺寸换算、换底色与模板换装 | 查看插件 |
lizhao-img-eraser |
图片去水印、局部修复与原生编辑器 | 查看插件 |
lizhao-live-activity |
实时活动、系统胶囊与普通通知降级 | 查看插件 |
lizhao-live-photo |
实况照片选取、展示预览与原件处理 | 查看插件 |
lizhao-map |
高德地图、定位、地点搜索、路线规划与导航 | 查看插件 |
lizhao-meta |
Facebook 登录分享、应用事件与深链 | 查看插件 |
lizhao-nfc-pro |
NFC 标签读写、NDEF、IsoDep 与诊断 | 查看插件 |
lizhao-notify-pro |
本地通知、点击动作、进度与定时提醒 | 查看插件 |
lizhao-novel-reader |
原生小说阅读、仿真翻页与段落评论 | 查看插件 |
lizhao-office-view |
Office 与 PDF 文件预览、进度与缓存管理 | 查看插件 |
lizhao-pdf-pro |
PDF 阅读、签批、真实写回与页面处理 | 查看插件 |
lizhao-play-billing |
Google Play 商品购买、订阅、恢复与确认消耗 | 查看插件 |
lizhao-qq-share |
QQ 授权码登录、QQ 与 QQ 空间分享 | 查看插件 |
lizhao-qrcode |
二维码生成、Logo 与样式配置、批量生成及导出 | 查看插件 |
lizhao-scan-pro |
原生扫码、连续扫码、相册识别 | 查看插件 |
lizhao-serial-port |
路径串口、USB 串口、多会话收发与诊断 | 查看插件 |
lizhao-share-plus |
系统分享、远程文件下载后分享 | 查看插件 |
lizhao-smart-tts |
系统 TTS、云端合成、听书方案 | 查看插件 |
lizhao-sqlite-pro |
原生 SQLite、迁移、备份与诊断 | 查看插件 |
lizhao-sse-pro |
SSE、Line、JSONL 与 Raw 流式请求 | 查看插件 |
lizhao-tcp-pro |
TCP 客户端、服务端、多连接与诊断 | 查看插件 |
lizhao-usb-storage |
U 盘、移动硬盘文件浏览、读写与批量复制 | 查看插件 |
lizhao-video-editor |
视频裁剪、压缩、取帧与 FFmpeg/FFprobe | 查看插件 |
lizhao-video-feed |
短视频上下滑、短剧选集与分页加载 | 查看插件 |
lizhao-video-player |
原生视频播放器、清晰度与播放交互 | 查看插件 |
lizhao-video-thumb |
视频封面、批量取帧与 Base64 返回 | 查看插件 |
lizhao-vpn-pro |
企业 VPN、IKEv2、安全接入与脱敏诊断 | 查看插件 |
lizhao-wechat-kit |
微信登录、分享、支付、小程序与客服 | 查看插件 |
lizhao-wecom |
企业微信授权登录、内容分享与脱敏诊断 | 查看插件 |
lizhao-xhs-share |
小红书图文视频分享与回执诊断 | 查看插件 |

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 6486
赞赏 5
下载 12765807
赞赏 1959
赞赏
京公网安备:11010802035340号