什么是 电鱼智能 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)

本方案构建了一个从采集到推流的全链路硬件加速系统。

拓扑逻辑

  1. 采集层

    • USB 摄像头 (UVC):通过 USB 3.0 Hub 接入 4 路 1080P 摄像头。

    • MIPI 摄像头:直接通过板载 CSI 接口接入(延迟最低)。

    • HDMI IN:通过 RK3399 的 HDMI 输入接口采集外部视频源。

  2. 处理层 (RK3399 VPU)

    • App 获取原始 YUV/Texture 数据 -> MediaCodec (硬编) -> H.264/H.265 码流。

  3. 传输层

    • 封装为 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: 通常是码率设置不当或网络丢包导致。建议:

  1. 开启自适应码率:根据网络带宽动态调整 KEY_BIT_RATE

  2. 缩短 I 帧间隔:将 I 帧间隔设为 1秒,即使丢包也能快速恢复画面。

Q2: 支持 RTMP 推流给 B站/抖音吗? A: 支持。RTSP 常用于内网监控(NVR),RTMP/SRT 常用于公网直播。底层编码逻辑是一样的,只是最后打包的协议层不同。电鱼 RK3399 性能足以支撑 RTMP 推流。

Q3: 摄像头支持热插拔吗? A: 电鱼定制的 Android 系统优化了 USB 摄像头的热插拔检测机制 (UVC Hotplug),APP 可以监听广播并在摄像头插入后自动恢复采集,无需重启应用。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐