限时福利领取


移动端视频录制的性能挑战

以 4K/30fps 视频为例,未压缩的原始数据流量高达 355MB/s(3840x2160x12x30)。即使采用 H.264 High Profile 编码,比特率仍需 40-50Mbps。这对移动设备的 CPU、内存和存储子系统构成三重压力:

  • 计算压力:每帧 8.3ms 的编码时限(1s/30fps)
  • 内存压力:YUV420 帧缓冲需 12.4MB(4K 分辨率)
  • 存储压力:连续写入速度需稳定在 6MB/s 以上

视频数据流示意图

Camera2 vs Camera1:架构革新

  1. 流水线模型
  2. Camera1 采用阻塞式请求-响应模型,易导致帧延迟
  3. Camera2 引入异步会话(CaptureSession),支持并行请求处理

  4. 数据获取方式

    // SurfaceTexture 方案(适合预览)
    val surfaceTexture = SurfaceTexture(textureView.id)
    val previewSurface = Surface(surfaceTexture)
    
    // ImageReader 方案(适合录制)
    val imageReader = ImageReader.newInstance(
        width, height, ImageFormat.YUV_420_888, 3)
  5. SurfaceTexture:GPU 直接渲染,延迟低但 YUV 转换耗 CPU
  6. ImageReader:原生 YUV 数据,需注意 Image.close() 及时释放

MediaCodec 实战优化

同步/异步模式选择

  • 同步模式:代码逻辑简单,但可能阻塞 UI 线程
  • 异步模式:需实现 Callback,推荐配合 HandlerThread

环形缓冲区实现

class CircularBuffer(capacity: Int) {
    private val buffer = ArrayDeque<Frame>(capacity)
    private val lock = ReentrantLock()

    fun add(frame: Frame) = lock.withLock {
        if (buffer.size == capacity) buffer.removeFirst()
        buffer.addLast(frame)
    }
}

MediaMuxer 时间戳同步

关键步骤:

  1. 音频/视频轨道分别记录起始时间戳 startTimeUs
  2. 写入时校准:
    presentationTimeUs = systemTimeUs - startTimeUs
  3. 动态调整策略:当差值超过 100ms 时触发丢帧

时间戳同步流程图

AI 辅助优化方案

使用 ML Kit 的 ImageAnalysis 实现智能帧丢弃:

  1. 构建帧质量评估模型(基于亮度/对比度/模糊度)
  2. 动态丢弃评分低于阈值的帧
  3. 核心代码片段:
    analyzer.setAnalyzer(executor) { image ->
        val score = calculateQualityScore(image)
        if (score > THRESHOLD) {
            encoderQueue.offer(image)
        }
        image.close()
    }

生产环境 Checklist

编码器兼容性

| 厂商 | H.264 支持 | HEVC 支持 | |---------|------------|-----------| | 华为 | ✅ | 部分机型 | | 小米 | ✅ | ✅ |

低光照参数

| 光照(lux) | 帧率(fps) | ISO | 曝光(ms) | |-----------|-----------|-------|----------| | <50 | 24 | 1600 | 1/15 | | 50-200 | 30 | 800 | 1/30 |

OOM 防御措施

  • 限制 ImageReader 的缓冲池大小(建议 2-3 帧)
  • 使用 StrictMode 检测泄漏
  • 实现 CameraDevice.StateCallback 错误恢复

开放性问题

HEVC 虽能将比特率降低 50%,但编码耗时增加 30%。建议方案: - 中高端设备启用 HEVC - 动态码率控制(CBR/VBR 混合模式) - 使用 MediaCodecInfo.CodecCapabilities 检测硬件加速支持

测试数据:小米12 Pro(骁龙8 Gen1)实现 4K/60fps 录制时,HEVC 比 H.264 节省 45% 存储空间,但功耗增加 18%。

Logo

音视频技术社区,一个全球开发者共同探讨、分享、学习音视频技术的平台,加入我们,与全球开发者一起创造更加优秀的音视频产品!

更多推荐