鸿蒙 NEXT 下的低延迟 RTMP 屏幕推送实践:基于 SmartMediaKit 构建国产化无纸化同屏能力
本文结合大牛直播SDK(SmartMediaKit)在鸿蒙 NEXT 下的 RTMP 屏幕推送模块,系统分析了国产化无纸化会议、政企移动办公、远程指挥等场景对低延迟同屏能力的需求,并从 ArkTS 页面层、Engine 编排层、屏幕采集适配层、SmartPublisher SDK 封装层等角度,介绍了 Buffer 模式、Surface 硬编码模式、系统音/麦克风采集、横竖屏热切、RTMP 推流等
一、从“能投屏”到“可集成、可交付、可国产化”的实时同屏能力
在传统音视频系统中,屏幕共享往往被理解为一个偏应用层的功能:把手机、平板或电脑画面投到大屏、会议终端或远端播放器即可。但在政企、政府办公、国产化无纸化会议、移动执法、应急指挥、智慧教育等场景下,屏幕同屏远不只是“看得见”这么简单。
真正可落地的行业级同屏系统,至少要解决几个关键问题:
- 低延迟:会议批注、远程指挥、移动演示等场景不能接受明显卡顿;
- 稳定性:横竖屏切换、后台运行、弱网波动、分辨率变化都不能轻易中断;
- 国产化适配:终端、系统、协议、服务端、播放器链路要尽量可控;
- 工程可集成:不能只停留在 Demo,要能被业务系统、会议系统、执法系统、指挥系统集成;
- 私有化部署友好:很多政企场景更倾向局域网、专网或自建服务器,而不是完全依赖公有云服务。
随着 HarmonyOS NEXT 生态进入原生应用阶段,鸿蒙在政企、政务、医疗、教育等领域的应用正在加速落地。数字中国建设峰会网站转载的《人民日报》文章提到,鸿蒙正在政务、医疗、教育等领域规模化深入应用,且截至 2025 年 9 月,已有超过 30 款国家级政务应用和近 400 款地方政务民生应用完成鸿蒙原生适配并上架。
这意味着,面向鸿蒙 NEXT 的实时音视频能力,已经不再只是移动端应用开发中的一个功能点,而是国产化终端生态、政企移动办公和行业专网系统中的基础能力之一。
在这个背景下,基于大牛直播SDK(SmartMediaKit)在鸿蒙 NEXT 下实现 RTMP 屏幕推送,就具备了非常明确的工程价值:它不是做一个“演示型录屏”,而是在鸿蒙 NEXT 终端上构建一套可用于国产化无纸化会议、政企办公同屏、远程指挥回传、教育培训演示的低延迟推流内核。
二、为什么鸿蒙 NEXT 下的无纸化同屏需要 RTMP 推流?

很多人一提到屏幕共享,第一反应可能是投屏协议或会议系统内置共享能力。但在政企和行业场景里,RTMP 仍然有非常现实的价值。
RTMP 的优势不在于“最新”,而在于它的链路清晰、部署成熟、服务器生态完善、播放器接入简单,并且非常适合“终端采集 → 服务器汇聚 → 多端播放/分发”的系统结构。
典型链路如下:
鸿蒙 NEXT 终端
↓ 屏幕采集 / 系统音 / 麦克风
大牛直播SDK RTMP 推送模块
↓
自建 RTMP 服务器 / 内网流媒体网关 / 行业平台
↓
Windows 播放器 / 大屏终端 / 录制系统 / 指挥中心 / 会议系统
对于国产化无纸化会议,这条链路非常自然:
- 会议平板或鸿蒙终端采集屏幕内容;
- 同步采集系统声音或麦克风声音;
- 通过 RTMP 推送到会议服务器;
- 主席屏、旁听终端、录制服务器或 Windows 播放器实时拉流;
- 必要时可叠加录像、轻量级 RTSP 服务、低延迟播放器等模块。
大牛直播SDK 的 RTMP 推送模块本身就是其核心推送模块,该模块始于 2015 年,覆盖 Windows、Linux、Android、iOS 等平台,支持摄像头、屏幕、麦克风、扬声器以及编码前/编码后数据对接;配合 SmartPlayer 播放器,可实现 100~200ms 量级的端到端低延迟体验。
这也是 SmartMediaKit 适配鸿蒙 NEXT 的意义所在:把已经在 Android、iOS、Windows、Linux 等平台沉淀多年的 RTMP 推流工程能力,迁移到鸿蒙 NEXT 原生环境中,让鸿蒙终端具备可交付、可集成、可私有化部署的低延迟同屏能力。
三、鸿蒙 NEXT RTMP 同屏推流的整体架构设计

结合当前鸿蒙 NEXT 屏幕推送 Demo 的 ETS 代码结构,可以将整个 RTMP 同屏推流模块拆成以下几层:
SmartScreenPublisherPage
│
▼
PublisherScreenEngineV2
│
├── SmartPublisherScreenWrapper
│ │
│ ▼
│ SmartPublisherNative
│ │
│ ▼
│ libSmartPublisher.so
│
└── ArktsScreenCaptureAdapterImpl
│
▼
ScreenCaptureSourceNative
│
▼
OH_AVScreenCapture / 系统屏幕采集能力
这套结构的关键点在于:页面不直接操作底层 SDK,采集不直接关心 RTMP,推送模块不直接绑定 UI 状态。
这种分层非常适合行业 SDK 工程化交付:
SmartScreenPublisherPage:负责 UI、参数选择、按钮状态、日志显示;PublisherScreenEngineV2:负责业务编排,包括准备采集、启动推流、停止推流、分辨率热切、后台任务;ArktsScreenCaptureAdapterImpl:负责屏幕采集适配,包括 Buffer 模式、Surface 模式、横竖屏热更新;SmartPublisherScreenWrapper:负责 SmartPublisher SDK 的高层封装;SmartPublisherNative:负责 ArkTS 到 nativelibSmartPublisher.so的接口映射;ScreenCaptureSourceNative:负责屏幕采集 native source 的创建、启动、停止、resize、回调。
这种分层带来的好处是:后续如果要把 RTMP 推送、轻量级 RTSP 服务、本地录像、系统音采集、麦克风采集、横竖屏切换、后台保活等能力组合起来,不需要把所有逻辑堆在页面里,而是通过 Engine 做统一编排。
四、页面层:面向行业场景的参数控制,而不是简单 Demo
在 SmartScreenPublisherPage.ets 中,页面层已经不是一个简单的“开始/停止”按钮,而是围绕屏幕同屏推流场景做了较完整的配置入口。
例如编码器选择:
private readonly encoderSelectOptions: SelectOption[] = [
new PageSelectOption('软编 H.264'),
new PageSelectOption('硬编 H.264'),
new PageSelectOption('硬编 H.265'),
new PageSelectOption('硬编 H.264(Surface)'),
new PageSelectOption('硬编 H.265(Surface)'),
]
音频选择:
private readonly audioSelectOptions: SelectOption[] = [
new PageSelectOption('静音'),
new PageSelectOption('仅麦克风'),
new PageSelectOption('仅系统音'),
new PageSelectOption('系统音 + 麦克风'),
]
分辨率选择:
private readonly resolutionSelectOptions: SelectOption[] = [
new PageSelectOption('原始分辨率'),
new PageSelectOption('标准分辨率'),
new PageSelectOption('普通分辨率'),
]
这些选项不是为了“功能堆砌”,而是对应行业场景中的真实需求。
比如:
- 无纸化会议中,通常希望采集系统音,用于同步播放会议材料中的音视频内容;
- 远程培训中,可能需要系统音 + 麦克风,既保留课件声音,也保留讲解声音;
- 移动执法或现场巡检中,可能更关注低码率、稳定性、弱网可用性;
- 政企会议中,可能更倾向H.264 硬编码 Surface 模式,减少 CPU 拷贝,提升长时间运行稳定性;
- 内部测试和兼容性验证阶段,则可以保留软编、硬编 Buffer、硬编 Surface 多种路径,方便定位问题。
这也是行业 SDK Demo 和普通演示 Demo 的区别:普通 Demo 是“跑起来”,行业 Demo 是“把后续可能遇到的问题提前留出工程开关”。
鸿蒙NEXT无纸化同屏端到端时延测试
五、Engine 层:把采集、推流、录像、RTSP 服务统一编排

PublisherScreenEngineV2 是这套架构里最关键的一层,它把“屏幕采集”和“大牛直播SDK推送”解耦,同时又负责把它们组织成一个稳定的工作流。
启动 RTMP 推流的核心逻辑可以抽象为:
async startPublish(config: ScreenPublishConfig): Promise<boolean> {
const next: ScreenPublishConfig = this.cloneConfig(config)
next.enableRecorder = false
const preparedOk = await this.prepare(next)
if (!preparedOk) {
return false
}
const effective = this.lastConfig ? this.cloneConfig(this.lastConfig) : next
effective.enableRecorder = false
const ok = this.publisher.startPublish(effective)
this.callbacks.onLog?.(`engine: publisher.startPublish ret=${ok}`)
this.callbacks.onConfigUpdated?.(this.cloneConfig(effective))
return ok
}
这个设计有一个非常重要的思想:推流之前先 prepare 采集管线,而不是每次启动 RTMP 都重新初始化所有资源。
在行业场景中,这一点很关键。因为同一套屏幕采集数据,未来可能同时服务于:
- RTMP 推流;
- 本地 MP4 录像;
- 轻量级 RTSP 服务;
- 快照;
- 状态监测;
- 远端低延迟播放。
如果每启动一个输出就重开一次采集,会带来权限弹窗、资源重建、编码器重启、画面闪断、音频中断等问题。Engine 层统一管理采集生命周期,可以让 RTMP、录像、RTSP 服务成为同一个 Publisher 实例上的不同输出,而不是互相割裂的多个流程。
HarmonyOS 鸿蒙NEXT无纸化同屏时延测试
六、Buffer 模式与 Surface 模式:鸿蒙 NEXT 下屏幕推送的两条技术路线
在鸿蒙 NEXT 下做屏幕采集推流,核心路径大体可以分为两种:
1. Buffer 模式
Buffer 模式下,屏幕采集模块把视频帧以 RGBA/RGBX 等格式回调到上层,然后由 SmartPublisher SDK 进行编码前数据接入。
在 Engine 中可以看到类似逻辑:
this.capturer.setVideoFrameCallback((frame: ScreenVideoFrame) => {
if (!this.isPrepared() || !this.publisher.isMediaInputActive()) {
return
}
if (this.lastConfig !== null && this.useSurfaceInput(this.lastConfig)) {
return
}
if (this.shouldDropFrameDuringTransition(frame)) {
return
}
this.publisher.postScreenVideoRGBA(
frame.buffer,
frame.rowStride,
frame.width,
frame.height
)
})
这条路径的优势是灵活:可以在编码前做图像处理、叠加、裁剪、旋转、缩放、水印或 AI 分析。对于一些需要自定义画面处理的行业场景,Buffer 模式很有价值。
2. Surface 模式
Surface 模式则更偏向性能优先。屏幕采集模块不再把每一帧通过 ArkTS Buffer 回调出来,而是直接写入底层编码器 Surface,减少内存拷贝和格式转换。
当前代码中,Surface 模式的准备逻辑非常清晰:
const surfaceId: string =
this.publisher.prepareEncoderInputSurface(
next.width,
next.height,
next.fps
)
this.capturer.setEncoderSurfaceId(surfaceId)
随后采集侧通过:
ret = session.source.startWithSurface(this.encoderSurfaceId)
把屏幕采集输出直接接到编码器输入 Surface。
这条路径适合长时间、低功耗、低延迟的同屏推流场景,例如:
- 政企无纸化会议;
- 会议平板同屏;
- 现场指挥终端;
- 教育大屏同步;
- 专网内低延迟屏幕共享。
Surface 模式的工程重点不在“能不能推起来”,而在于横竖屏切换、分辨率变化、编码器 Surface 重建、关键帧请求、权限复用等细节处理。
HarmonyOS鸿蒙NEXT下RTMP播放器时延测试
七、音频采集:系统音、麦克风与混音能力
无纸化会议和远程演示场景里,屏幕画面只是第一步,音频同样重要。
当前设计中支持四种音频模式:
export enum ScreenAudioOutputType {
NONE = 0,
MIC = 1,
SYSTEM = 2,
SYSTEM_AND_MIC = 3,
}
也就是说,可以根据业务需要选择:
- 静音推屏;
- 仅采集麦克风;
- 仅采集系统声音;
- 系统声音 + 麦克风混音。
华为官方文档中,AudioCapturer 被定位为用于录制 PCM 音频数据的音频采集器,适合有音频开发经验的开发者实现更灵活的录制功能。
在当前 Engine 中,音频进入 SmartPublisher SDK 前,会先做 10ms 分帧:
this.innerFramer.push(chunk.buffer, (
frame: ArrayBuffer,
sr: number,
ch: number,
pcs: number
) => {
this.publisher.postSystemAudioPCM(frame, sr, ch, pcs)
})
麦克风音频则根据是否混音走不同路径:
if (route === ScreenAudioOutputType.SYSTEM_AND_MIC) {
return this.nativePublisher.onMixPCMData(
1,
pcm10ms,
0,
pcm10ms.byteLength,
sampleRate,
channels,
perChannelSamples
) === DANIULIVE_RETURN_OK
}
return this.nativePublisher.onPCMData(
pcm10ms,
pcm10ms.byteLength,
sampleRate,
channels,
perChannelSamples
) === DANIULIVE_RETURN_OK
10ms 分帧的好处是:音频进入编码器和推流模块时更加稳定,也更符合实时音频处理的常见节奏。对于低延迟 RTMP 推送来说,音频分帧越规整,后续编码、打包、同步处理越可控。
八、SmartPublisherScreenWrapper:把 RTMP 推流能力封装成可复用模块
SmartPublisherScreenWrapper 是大牛直播SDK 在鸿蒙 NEXT 屏幕推送场景下的核心封装层。它负责把上层传入的 ScreenPublishConfig 转换成底层 SmartPublisher SDK 的一系列参数设置。
例如:
const retSetUrl: number =
this.nativePublisher.setURL(resolved.pushUrl)
const retRtmpType: number =
this.nativePublisher.setRtmpPublishingType(resolved.rtmpPublishingType)
const retGop: number =
this.nativePublisher.setGopInterval(resolved.gop)
const retFps: number =
this.nativePublisher.setFps(resolved.fps)
编码器配置则根据软编、硬编 H.264、硬编 H.265、Surface 输入模式进行区分:
if (!useSurface) {
switch (config.videoEncoderType) {
case PublisherVideoEncoderType.HW_H264:
ok = this.nativePublisher.enableVideoHWEncoder(
config.videoHwKbps
) === DANIULIVE_RETURN_OK && ok
break
case PublisherVideoEncoderType.HW_H265:
ok = this.nativePublisher.enableVideoHevcHWEncoder(
config.videoHwKbps
) === DANIULIVE_RETURN_OK && ok
break
case PublisherVideoEncoderType.SOFT_H264:
default:
ok = this.nativePublisher.setSwVideoBitRate(
config.videoSwAvgKbps,
config.videoSwMaxKbps
) === DANIULIVE_RETURN_OK && ok
break
}
return ok
}
Surface 模式则单独处理:
ok = this.nativePublisher.setOHOSEncoderInputMode(1) === DANIULIVE_RETURN_OK && ok
switch (config.videoEncoderType) {
case PublisherVideoEncoderType.HW_H265:
ok = this.nativePublisher.enableVideoHevcHWEncoder(
config.videoHwKbps
) === DANIULIVE_RETURN_OK && ok
break
case PublisherVideoEncoderType.HW_H264:
default:
ok = this.nativePublisher.enableVideoHWEncoder(
config.videoHwKbps
) === DANIULIVE_RETURN_OK && ok
break
}
这种清晰隔离非常重要。因为在鸿蒙 NEXT 的实际工程中,Buffer 模式和 Surface 模式面对的问题完全不同。如果强行复用同一套逻辑,往往会引入很难排查的编码异常、花屏、绿条、方向错乱或无视频问题。
九、RTMP 推流模块的行业价值:不是替代会议系统,而是成为音视频底座
大牛直播SDK 的价值,并不是要替代所有会议系统、办公系统或指挥系统,而是提供底层音视频能力。
在国产化无纸化同屏场景中,一个完整系统往往包括:
鸿蒙 NEXT 终端
├── 屏幕采集
├── 系统音采集
├── 麦克风采集
├── RTMP 推流
├── 本地录像
└── 轻量级 RTSP 服务
会议/指挥/办公平台
├── 流媒体服务器
├── 播放端
├── 录制归档
├── 权限控制
├── 会议管理
└── 业务系统集成
SmartMediaKit 更适合承担其中的音视频内核角色:
- 负责低延迟采集;
- 负责编码参数控制;
- 负责 RTMP 推送;
- 负责音频接入;
- 负责异常状态回调;
- 负责录像和 RTSP 扩展;
- 负责跨平台播放器协同。
大牛直播SDK 的 RTMP 推送模块支持 SDK 接口化调用、状态 Event 回调、断网自动重连、网络状态监听等工程化需求,并且推送、录像、内置轻量级 RTSP 服务等模块可以解耦组合。
这正是行业客户最需要的能力:不是一个封闭播放器,也不是一个固定 App,而是一套可以被集成进会议系统、政务系统、执法系统、教育系统的实时音视频 SDK。
十、国产化无纸化会议中的典型应用方式
在国产化无纸化会议场景中,鸿蒙 NEXT 终端可以作为会议材料展示端、移动批注端或主持人控制端。通过 SmartMediaKit RTMP 同屏推送模块,可以把终端画面低延迟推送到会议服务器。
典型流程如下:
1. 会议终端打开无纸化会议 App
2. 用户选择“开始同屏”
3. App 调用鸿蒙屏幕采集能力
4. 大牛直播SDK 接收屏幕帧和音频帧
5. SDK 编码并推送 RTMP 流
6. 会议大屏或 Windows 播放端实时拉流
7. 如需留档,可同步启动本地录像或服务端录像
这种方案的特点是:
- 不依赖外部互联网会议平台;
- 可部署在政企内网或专网;
- 可与现有会议管理系统集成;
- 播放端可以是 Windows、Linux、Android、鸿蒙或大屏终端;
- 可根据场景选择 RTMP、RTSP、录像等组合能力;
- 对国产化终端和信创系统更友好。
对于很多政府、央国企、教育、医疗等用户来说,他们真正关心的不是“用了什么热门协议”,而是系统能否稳定运行、能否私有部署、能否和现有业务系统打通、能否长期维护。
RTMP 在这里的价值就在于:成熟、简单、稳定、可控。
十一、为什么这套设计适合鸿蒙 NEXT 生态长期演进?
HarmonyOS NEXT 不是 Android 兼容层上的简单迁移,而是面向原生鸿蒙生态重新构建应用能力。华为在 HDC 2024 中介绍,HarmonyOS NEXT 基于 OpenHarmony 打造,强调全场景、鸿蒙原生智能、原生安全等体验;同时,HarmonyOS NEXT 从操作系统内核、文件系统、编程语言、编译器/运行时、编程框架、设计系统、开发环境等多个层面进行了更新。
对于实时音视频 SDK 来说,这意味着不能简单照搬 Android 的 MediaProjection + MediaCodec 逻辑,而是要重新适配鸿蒙 NEXT 的采集、权限、Surface、音频、后台任务、NAPI/native 接口等机制。
当前这套 SmartMediaKit 鸿蒙 NEXT RTMP 屏幕推送模块,比较有价值的地方在于:
- 保留 Android 端成熟经验
例如 SetUrl 与 Start 分离、采集管线和输出模块分离、同一 Publisher 复用、事件回调机制等。 - 适配鸿蒙 NEXT 原生机制
通过 ArkTS + NAPI + native so 的方式,把鸿蒙屏幕采集、音频采集、Surface 输入、后台任务等能力接入到 SDK。 - 兼顾 Buffer 和 Surface 两种路线
Buffer 路线适合调试、叠加、处理;Surface 路线适合低延迟、低拷贝、长时间推流。 - 重视横竖屏和分辨率热切
不以“调用了接口”为准,而以“真实帧稳定”为准,降低播放端异常概率。 - 面向行业组合能力设计
RTMP 推流不是孤立功能,后续可以自然扩展到录像、轻量级 RTSP 服务、快照、低延迟播放、服务端转发等模块。
十二、结语:鸿蒙 NEXT 下的 RTMP 同屏推流,是国产化音视频底座的一块关键拼图
国产化无纸化会议、政企移动办公、应急指挥、远程培训、移动执法等场景,对鸿蒙 NEXT 终端提出了越来越明确的音视频能力要求。
这些场景需要的不只是一个“能录屏”的 API,也不是一个只能在 Demo 中跑通的推流按钮,而是一套真正可集成、可维护、可调优、可私有化部署的实时音视频 SDK 能力。
大牛直播SDK(SmartMediaKit)在鸿蒙 NEXT 下的 RTMP 屏幕推送模块,正是围绕这个方向展开:上层通过 ArkTS 进行页面控制和业务编排,中间通过 Engine 管理采集、推流、音频、分辨率热切和后台任务,底层通过 SmartPublisher SDK 完成编码、打包和 RTMP 推送。
对于国产化无纸化同屏来说,它的价值不只是“把屏幕推到服务器”,而是让鸿蒙 NEXT 终端真正具备行业级低延迟同屏能力:
屏幕可采集
音频可同步
编码可选择
分辨率可切换
推流可私有化
播放可低延迟
系统可集成
能力可交付
当鸿蒙 NEXT 逐步进入政企、政府、教育、医疗、能源、交通等行业场景时,类似 SmartMediaKit 这样的底层音视频 SDK,将不再只是应用开发中的辅助模块,而会成为国产化实时音视频系统建设中的基础组件。
📎 CSDN官方博客:音视频牛哥-CSDN博客
更多推荐




所有评论(0)