Android Camera2 + MediaCodec + MediaMuxer 高效视频录制实战:从 API 解析到 AI 辅助优化
·
移动端视频录制的性能挑战
以 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:架构革新
- 流水线模型
- Camera1 采用阻塞式请求-响应模型,易导致帧延迟
-
Camera2 引入异步会话(CaptureSession),支持并行请求处理
-
数据获取方式
// SurfaceTexture 方案(适合预览) val surfaceTexture = SurfaceTexture(textureView.id) val previewSurface = Surface(surfaceTexture) // ImageReader 方案(适合录制) val imageReader = ImageReader.newInstance( width, height, ImageFormat.YUV_420_888, 3) - SurfaceTexture:GPU 直接渲染,延迟低但 YUV 转换耗 CPU
- 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 时间戳同步
关键步骤:
- 音频/视频轨道分别记录起始时间戳
startTimeUs - 写入时校准:
presentationTimeUs = systemTimeUs - startTimeUs - 动态调整策略:当差值超过 100ms 时触发丢帧

AI 辅助优化方案
使用 ML Kit 的 ImageAnalysis 实现智能帧丢弃:
- 构建帧质量评估模型(基于亮度/对比度/模糊度)
- 动态丢弃评分低于阈值的帧
- 核心代码片段:
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%。
更多推荐


所有评论(0)