监控直播必备!电鱼智能 RK3399 在 Android 系统下实现多路 RTSP 视频流的稳定推流
在无人机图传、移动执法仪及机器人巡检等场景中,Android 设备常被用作视频采集与推流终端。然而,使用 CPU 软编码会导致设备过热降频,进而引发卡顿。本文解析如何利用 电鱼智能 EFISH-SBC-RK3399 的 VPU 硬件编码 引擎,结合 Android MediaCodec 底层优化,单板实现 4 路 1080P 视频的低延迟、低功耗 RTSP 推流。

什么是 电鱼智能 EFISH-SBC-RK3399?
电鱼智能 EFISH-SBC-RK3399 是一款高性能嵌入式开源硬件。它搭载 Rockchip RK3399 六核处理器(2×A72 + 4×A53),主频 1.8GHz。
在视频处理领域,它拥有一颗独立的 VPU (Video Processing Unit),支持 H.264/H.265 硬件编码。这意味着在 Android 系统下,视频压缩任务可以完全剥离 CPU,由 VPU 独立完成,从而保证了系统在高负载下的流畅度与稳定性。
为什么 Android 推流需要 RK3399 硬件加速?(痛点分析)
在普通的安卓板卡上开发多路推流 APP,开发者常遇到以下“深坑”:
1. CPU 软编“火炉”效应
痛点:使用 FFmpeg 默认的 libx264 进行 CPU 软编码,一路 1080P 就会占用 60% 以上的 CPU 资源,设备迅速发热到 80°C,导致系统强制降频,画面变成“幻灯片”。 RK3399 解决方案:VPU 硬编码。通过调用 Rockchip 专用的硬件编码接口,CPU 占用率可降至 5% 以内。即使同时推流 4 路 1080P,芯片温度依然温和,适合密闭机壳环境。
2. 多路并发的内存瓶颈
痛点:多路摄像头采集数据量巨大,Java 层的内存拷贝(GC)频繁,容易导致 OOM(内存溢出)崩溃。 RK3399 解决方案:4GB LPDDR4 大内存 + Zero-Copy 技术。电鱼提供的 Demo 演示了如何将摄像头采集的纹理(SurfaceTexture)直接送入编码器,避免数据在 CPU 和内存间反复搬运。
3. Android 后台保活难
痛点:原生 Android 系统为了省电,经常会杀掉后台推流服务,导致监控中断。 RK3399 解决方案:工业级 Android 固件。电鱼智能对系统底层进行了定制,移除了激进的省电策略,支持 APP 开机自启、守护进程保活 以及 以太网优先 策略,确保 7x24 小时推流不掉线。
系统架构与数据流 (System Architecture)
本方案构建了一个从采集到推流的全链路硬件加速系统。
拓扑逻辑
-
采集层:
-
USB 摄像头 (UVC):通过 USB 3.0 Hub 接入 4 路 1080P 摄像头。
-
MIPI 摄像头:直接通过板载 CSI 接口接入(延迟最低)。
-
HDMI IN:通过 RK3399 的 HDMI 输入接口采集外部视频源。
-
-
处理层 (RK3399 VPU):
-
App 获取原始 YUV/Texture 数据 -> MediaCodec (硬编) -> H.264/H.265 码流。
-
-
传输层:
-
封装为 RTSP/RTMP 协议 -> 千兆网口 / 4G 模组 -> 流媒体服务器 (NVR/SRS)。
-
推荐软件栈
-
OS: Android 7.1 / 10.0 (电鱼工业版固件)。
-
Library: Android MediaCodec API (调用硬件编码)。
-
Protocol: EasyPusher / FFmpeg (仅做封装,不做编码)。
关键技术实现 (Implementation)
1. 调用 MediaCodec 进行硬件编码 (Java)
关键在于选择 video/avc MIME 类型,系统会自动调用 RK3399 的 OMX.rk.video_encoder.avc 组件。
Java
// 1. 初始化编码器 (H.264, 1920x1080)
MediaFormat format = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, 1920, 1080);
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
format.setInteger(MediaFormat.KEY_BIT_RATE, 4000000); // 4Mbps
format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1); // 关键帧间隔 1s
MediaCodec encoder = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_AVC);
encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
Surface inputSurface = encoder.createInputSurface(); // 获取输入 Surface
encoder.start();
// 2. 将摄像头预览数据绘制到 inputSurface (零拷贝)
// ... OpenGLES 渲染逻辑 ...
2. RTSP 推流封装
获取编码后的 H.264 NALU 数据,打包发送。
Java
// 3. 获取编码数据
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
int outputBufferIndex = encoder.dequeueOutputBuffer(bufferInfo, 10000);
if (outputBufferIndex >= 0) {
ByteBuffer outputBuffer = encoder.getOutputBuffer(outputBufferIndex);
// 将 outputBuffer 中的 H.264 数据通过 RTSP 协议发送
rtspClient.sendFrame(outputBuffer, bufferInfo);
encoder.releaseOutputBuffer(outputBufferIndex, false);
}
性能表现
-
推流能力:
-
1路 4K @ 30fps:CPU 占用 < 10%,流畅。
-
4路 1080P @ 30fps:CPU 占用 < 25%,VPU 负载 60%,稳定运行。
-
-
延迟:在局域网环境下,端到端延迟(Glass-to-Glass)可控制在 200ms 左右。
-
网络带宽:使用 H.265 (HEVC) 编码模式,相比 H.264 节省 50% 带宽,极适合 4G/5G 移动监控场景。
常见问题 (FAQ)
Q1: 如何解决画面花屏或马赛克? A: 通常是码率设置不当或网络丢包导致。建议:
-
开启自适应码率:根据网络带宽动态调整
KEY_BIT_RATE。 -
缩短 I 帧间隔:将 I 帧间隔设为 1秒,即使丢包也能快速恢复画面。
Q2: 支持 RTMP 推流给 B站/抖音吗? A: 支持。RTSP 常用于内网监控(NVR),RTMP/SRT 常用于公网直播。底层编码逻辑是一样的,只是最后打包的协议层不同。电鱼 RK3399 性能足以支撑 RTMP 推流。
Q3: 摄像头支持热插拔吗? A: 电鱼定制的 Android 系统优化了 USB 摄像头的热插拔检测机制 (UVC Hotplug),APP 可以监听广播并在摄像头插入后自动恢复采集,无需重启应用。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)