
在各类行业数字化应用中,移动端设备正越来越多地承担“信息采集节点”的角色: 过程展示、远程协作、移动巡检、设备操作演示、培训讲解、现场可视化……这些场景都在强调同一件事——如何把终端屏幕内容与声音,以足够低的延迟、足够稳定的方式实时传输出去。
对于 Android 平台而言,要做好这件事并不轻松。屏幕采集需要在高分辨率下保持稳定输出;音频通常来自不同来源(麦克风、人声、系统音等),并且需要并行采集与混合;网络环境从 Wi-Fi 到 5G,再到企业内网,波动明显;传输方式也常常需要同时兼容外网推流(如 RTMP)与局域网的低延迟访问(如 RTSP)。
大牛直播 SDK(SmartPublisher)正是针对这些典型的行业需求,构建了屏幕采集、多路音频融合、RTMP 推流、内置轻量级 RTSP 服务的一体化能力。其 Android 端源码采用高度模块化的架构设计,并经过多行业、多场景的长期打磨,在性能、稳定性以及工程落地性上呈现出较为成熟的体系。
本文将结合大牛直播SDK屏幕采集推送的源码文件,包括:
StreamMediaDemoService.java
NTStreamMediaProjectionEngineImpl.java
NTVirtualDisplaySurfaceSinker.java
NTStreamMediaEngine.java
NTStreamMediaServiceInterface.java
NTStreamMediaBinder.java
LibPublisherWrapper.java
SmartPublisherJniV2.java
从 架构层、屏幕采集层、音频采集层、传输层、稳定性优化层 五个维度,完整、系统地解析大牛直播 SDK 在 Android 端是如何做到“高画质 + 低延迟 + 高稳定”的。
从 Demo 工程和源码组织可以看出,大牛直播 SDK 带有鲜明的三层架构:
[最上层] 业务 Service 层:StreamMediaDemoService.java
↓
[中间层] 引擎调度层:NTStreamMediaProjectionEngineImpl.java
↓
[底层] C++ Native 编解码与协议栈:SmartPublisherJniV2.so 
这种组织方式的优势非常明显:
没有把逻辑写死在 Activity 中,而是把视频链路变成“后台可持续运行的系统服务”,这是专业级 SDK 的典型特征。
在 StreamMediaDemoService.java 中,SDK 将屏幕采集、音频采集、推流引擎全部挂在 Foreground Service 上运行:
startForegroundService();
createNotificationChannelIfNeeded();
并根据系统版本动态申请:
FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION
FOREGROUND_SERVICE_TYPE_MICROPHONE
这样设计有三个关键好处:
对于屏幕采集类应用,这是工业级方案。
NTStreamMediaProjectionEngineImpl.java 是整个链路的核心,它控制:
它采用了 HandlerThread + 多线程模型:
private HandlerThread image_thread;
private HandlerThread running_thread;
并为不同任务绑定不同线程,确保:
这种线程模型是直播 SDK 的专业标配。
Android 屏幕采集的核心是 MediaProjection,但真正的工程难点在于“如何将屏幕像素高效送入编码器”。
大牛直播 SDK 采用的路径如下:
MediaProjection
↓
VirtualDisplay
↓ Surface
↓ ImageReader → RGBA
↓ JNI (底层转换:RGBA → I420/NV12)
↓ 硬件编码器 MediaCodec 
这条路径包含了多个关键工程细节。
在 NTStreamMediaProjectionEngineImpl.java 中,SDK 构造了一个专用的 Surface sinker:
NTVirtualDisplaySurfaceSinker sinker = new NTVirtualDisplaySurfaceSinker(...);
并根据用户选择动态确认输出分辨率:
RESOLUTION_LOW
RESOLUTION_MEDIUM
RESOLUTION_HIGH
这不是简单放大/缩小,而是结合屏幕实际分辨率比例进行适配,使游戏、视频类画面不会变形。
绝大多数开源方案直接输出全分辨率,会导致推流码率难以压缩、弱网下严重卡顿,而 SDK 的多档策略意味着用户在弱网环境可以动态降分辨率并维持流畅。
在 NTVirtualDisplaySurfaceSinker.java 中,核心逻辑是:
Image image = reader.acquireLatestImage();
而不是:
reader.acquireNextImage();
区别非常关键:
方法 | 行为 | 结果 |
|---|---|---|
acquireNextImage | 不丢帧,逐帧处理 | 极易堆积 → 延迟爆炸 |
acquireLatestImage | 主动丢弃旧帧,只处理最新 | 延迟最低,适合直播 |
这说明 SDK 的设计理念很明确:
直播优先实时性,而不是每一帧都要处理。
因此 SDK 默认就是 低延迟直播模式最佳实践。
图像在 Java 层是 RGBA 格式,但硬编常用的输入格式是:
COLOR_FormatYUV420Flexible
COLOR_FormatYUV420SemiPlanar
大牛直播 SDK 并不在 Java 层做繁重转换,而是直接:
stream_publisher_.PostLayerImageRGBX8888ByteBuffer(...)
交给 Native 层。C/C++ 中通常使用:
这样能让 1080p/2K 60fps 在中低端机型依然稳定。
这是专业 SDK 与普通 Demo 最大差异之一。
Android 10+ 的 AudioPlaybackCapture 让系统内录变得合法,但绝大部分开源代码在“系统音 + 麦克风”并存时会崩溃、延迟巨大、或音质糟糕。
大牛直播 SDK 在这块做了完整的工程化处理。
对应代码:
SmartPublisherOnPCMData()
采集特点:
麦克风采集是主播声音的主要来源,因此稳定性优先。
在 NTStreamMediaProjectionEngineImpl.java 中:
start_audio_playback_capture();
实现了:
并最终将 PCM 数据交给底层 Mixer:
麦克风PCM \
→ Native Mix → 编码 → 推流
系统音PCM /
混音在 C/C++ 层完成意味着:
这是工程级音频架构。

大牛直播 SDK 最大亮点之一是:
手机端既能推流,也能自己变成 RTSP 服务器。
下面分别来看。
RTMP 推流在 LibPublisherWrapper.java 中进行了全封装,支持:
启动推流逻辑如:
lib_publisher_.SmartPublisherStartPublisher(handle, rtmp_url);
并可以动态控制:
SmartPublisherSetVideoEncoderType(handle, 1 or 2);
SmartPublisherSetSwVBRMode(handle, vbr_mode);
意味着 SDK 能够根据网络情况自动选择最合理的码率模式。
RTSP 服务启动流程(摘自 LibPublisherWrapper.java):
OpenRtspServer();
SetRtspServerPort();
StartRtspServer();
AddRtspStreamServer();
StartRtspStream();
简单说:
比如大牛直播SDK的SmartPlayer:
rtsp://192.168.1.8:8554/stream1
非常适合:
不需要 SRS/Nginx-RTMP 服务器——这是工业级移动端极为少见的能力。
大牛直播 SDK 在稳定性相关的代码细节非常多,下面列出最关键的几项。
在 LibPublisherWrapper.java 变量可见:
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
读锁:
写锁:
这保证了:
推流过程中不会因状态切换导致 Native 层崩溃。
这是专业级 SDK 的基本功,也是很多开源项目缺乏的地方。
函数 estimate_video_hardware_kbps 会根据:
动态给出建议码率。
示例:
分辨率 | FPS | H.264 推荐码率 | H.265 推荐码率 |
|---|---|---|---|
720p | 30 | 1800–2500 kbps | 1200–1800 kbps |
1080p | 60 | 4200–5500 kbps | 2800–3800 kbps |
这样避免了两个常见坑:
自动化就是工程化。
SDK 在 Native 层支持:
在实际 4G/5G 场景非常有帮助。

无论是企业内部的移动终端、工业现场终端,还是各类智能设备,在“将设备屏幕内容实时传输出去”这件事上,都有高度一致的需求特征:低延迟、稳定性、跨网络环境的适配能力。
基于大牛直播SDK提供的屏幕采集 + 多路音频 + RTMP/RTSP 双模架构,可以覆盖大量传统行业的典型场景。
许多行业需要将设备的实时画面共享给现场同事或远程中心,例如:
这些应用要求:
依托 RTMP 或内置 RTSP 服务,不需要专门部署大型流媒体服务器,即可完成跨部门的实时协作。
在工业设备、运维终端或车载设备上,屏幕往往承载着关键的运行状态,需要在后台或监控中心实时查看:
这些设备通常运行在封闭网络或专网中,使用 RTSP 的局域网低延迟传输模式能大幅降低部署成本,让移动端直接充当“可推可拉”的微型视频节点。
在一些组织内部培训、操作演示、技术讲解场景中,常常需要讲解者直接共享移动终端的屏幕内容:
使用 SDK 内置的 RTSP 服务,可在局域网内同时提供多个拉流端进行实时观看,延迟可稳定维持在较低区间,不需要额外部署流媒体服务器。
传统行业中常见的“封闭系统”“内网设备”“专网终端”,往往不便安装大型流媒体服务。
大牛直播 SDK 的 RTSP 内置服务让移动端可以直接变成:
一台可即开即用的轻量级流媒体节点
适用于:
无需外网,无需中心服务器。
在上述类型的传统行业场景中,屏幕采集 + 多路音频融合 + RTSP/RTMP 双模传输形成了一种非常通用且工程化的实时链路能力。 既能满足跨网络的灵活传输,也能适应封闭环境中的本地低延迟回传,是很多行业场景构建“移动视频节点能力”的基础模块。
综合全文可以看到,大牛直播 SDK的SmartServicePublisherV2 demo实例,在移动端屏幕采集链路上的优势并不是某一个点,而是来自多个层面的体系化能力:
这种分层方式让屏幕采集、音频处理、推流逻辑与 UI 层完全隔离,具备:
这也是许多生产级 SDK 与普通 Demo 的核心差异。
SDK 使用 VirtualDisplay + RGBA 直投 Native 方式,避免 Java 层重度像素处理。 丢弃旧帧、只保留最新帧的策略,使采集链路天然具备低延迟特性,适合实时展示类业务。
SDK 同时支持麦克风采集与系统播放音采集,并由 Native 层完成混音。 这为许多需要“操作演示 + 背景音”的传统行业场景提供了良好的技术基础,减少了业务方在音频链路上的开发负担。
除了常见的 RTMP 推流外,SDK 还能在设备上直接启动 RTSP 服务,将终端变成轻量级流媒体节点。
这对需要在局域网或专网内做低延迟屏幕共享的行业十分关键,例如移动巡检、运维终端、可视化工具、内部培训等,部署成本极低。
这些细节让 SDK 能够在更复杂的环境下长期运行,可用于真正的生产环境,而不仅是概念验证。
在实际业务选型中,建议重点关注以下几个方面:
高版本系统对 MediaProjection、麦克风权限、前台服务类型都有收紧,对 SDK 的适配能力要求更高。
不同区域(例如园区 Wi-Fi、办公楼、地铁、室外 5G)网络质量差异巨大, 可以实际测试码率收敛速度、丢包时的画面恢复能力等指标。
如果你的业务在企业内网、专网或封闭环境下运行, 内置 RTSP 服务能大幅简化部署,但也需要测试:
国内 Android 厂商定制系统繁多, 重点评估:
你可以直接使用 SDK 自带 Demo,在自己的业务场景中做:
与常见的开源方案相比,大牛直播 SDK 在“工程可用性”“长期稳定性”“弱网适应能力”上往往会有更明显的优势。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。