一、从“能投屏”到“可集成、可交付、可国产化”的实时同屏能力

在传统音视频系统中,屏幕共享往往被理解为一个偏应用层的功能:把手机、平板或电脑画面投到大屏、会议终端或远端播放器即可。但在政企、政府办公、国产化无纸化会议、移动执法、应急指挥、智慧教育等场景下,屏幕同屏远不只是“看得见”这么简单。

真正可落地的行业级同屏系统,至少要解决几个关键问题:

  1. 低延迟:会议批注、远程指挥、移动演示等场景不能接受明显卡顿;
  2. 稳定性:横竖屏切换、后台运行、弱网波动、分辨率变化都不能轻易中断;
  3. 国产化适配:终端、系统、协议、服务端、播放器链路要尽量可控;
  4. 工程可集成:不能只停留在 Demo,要能被业务系统、会议系统、执法系统、指挥系统集成;
  5. 私有化部署友好:很多政企场景更倾向局域网、专网或自建服务器,而不是完全依赖公有云服务。

随着 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 到 native libSmartPublisher.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 屏幕推送模块,比较有价值的地方在于:

  1. 保留 Android 端成熟经验
    例如 SetUrl 与 Start 分离、采集管线和输出模块分离、同一 Publisher 复用、事件回调机制等。
  2. 适配鸿蒙 NEXT 原生机制
    通过 ArkTS + NAPI + native so 的方式,把鸿蒙屏幕采集、音频采集、Surface 输入、后台任务等能力接入到 SDK。
  3. 兼顾 Buffer 和 Surface 两种路线
    Buffer 路线适合调试、叠加、处理;Surface 路线适合低延迟、低拷贝、长时间推流。
  4. 重视横竖屏和分辨率热切
    不以“调用了接口”为准,而以“真实帧稳定”为准,降低播放端异常概率。
  5. 面向行业组合能力设计
    RTMP 推流不是孤立功能,后续可以自然扩展到录像、轻量级 RTSP 服务、快照、低延迟播放、服务端转发等模块。

十二、结语:鸿蒙 NEXT 下的 RTMP 同屏推流,是国产化音视频底座的一块关键拼图

国产化无纸化会议、政企移动办公、应急指挥、远程培训、移动执法等场景,对鸿蒙 NEXT 终端提出了越来越明确的音视频能力要求。

这些场景需要的不只是一个“能录屏”的 API,也不是一个只能在 Demo 中跑通的推流按钮,而是一套真正可集成、可维护、可调优、可私有化部署的实时音视频 SDK 能力。

大牛直播SDK(SmartMediaKit)在鸿蒙 NEXT 下的 RTMP 屏幕推送模块,正是围绕这个方向展开:上层通过 ArkTS 进行页面控制和业务编排,中间通过 Engine 管理采集、推流、音频、分辨率热切和后台任务,底层通过 SmartPublisher SDK 完成编码、打包和 RTMP 推送。

对于国产化无纸化同屏来说,它的价值不只是“把屏幕推到服务器”,而是让鸿蒙 NEXT 终端真正具备行业级低延迟同屏能力:

屏幕可采集
音频可同步
编码可选择
分辨率可切换
推流可私有化
播放可低延迟
系统可集成
能力可交付

当鸿蒙 NEXT 逐步进入政企、政府、教育、医疗、能源、交通等行业场景时,类似 SmartMediaKit 这样的底层音视频 SDK,将不再只是应用开发中的辅助模块,而会成为国产化实时音视频系统建设中的基础组件。


📎 CSDN官方博客:音视频牛哥-CSDN博客 

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐