Android MediaCodec 录屏实战:高帧率低延迟的实现与避坑指南
·
在移动端实现高性能录屏功能时,Android 开发者常遇到帧率跳水、延迟飙高等头疼问题。最近通过一个直播推流项目,我深度折腾了 MediaCodec 的硬编码方案,这里把踩坑经验和优化心得整理成实战指南。

一、为什么选择 MediaCodec 硬编码?
先看两组数据对比:
- 在小米10 Pro上录制1080P视频时:
- MediaCodec 硬编码:平均延迟 120ms,功耗 380mA
-
FFmpeg 软编码:平均延迟 450ms,功耗 620mA
-
兼容性方面:
- MediaCodec 支持 Android 4.1+(API 16)
- FFmpeg 需要单独集成 so 库
硬编码最大优势是调用 GPU 加速,但要注意这些坑:
- 不同厂商芯片组对 ColorFormat 支持差异大
- 缓冲区管理不当会导致 GL 线程阻塞
- 华为 EMUI 存在特殊的 Surface 释放问题
二、核心实现四步走
1. 初始化配置(关键参数示例)
val format = MediaFormat.createVideoFormat("video/avc", width, height).apply {
setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface)
setInteger(MediaFormat.KEY_BIT_RATE, 6_000_000) // 6Mbps
setInteger(MediaFormat.KEY_FRAME_RATE, 60)
setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 2) // 关键帧间隔
}
val codec = MediaCodec.createEncoderByType("video/avc")
codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE)
val surface = codec.createInputSurface() // 获取编码Surface
2. 异步帧处理(Coroutine实现)
lifecycleScope.launch(Dispatchers.Default) {
val bufferInfo = MediaCodec.BufferInfo()
while (isActive) {
val outIndex = codec.dequeueOutputBuffer(bufferInfo, 10_000)
when {
outIndex >= 0 -> {
val buffer = codec.getOutputBuffer(outIndex)
// 这里处理编码后的H.264数据
codec.releaseOutputBuffer(outIndex, false)
}
outIndex == MediaCodec.INFO_TRY_AGAIN_LATER -> delay(1)
else -> {/* 处理格式变化等特殊情况 */}
}
}
}
3. 动态比特率调节
fun adjustBitrate(newBitrate: Int) {
val params = Bundle().apply {
putInt(MediaCodec.PARAMETER_KEY_VIDEO_BITRATE, newBitrate)
}
codec.setParameters(params)
}
4. 内存优化技巧
- 使用双缓冲队列避免 GL 阻塞
- 及时释放 EGL 上下文
- 监控
onFrameAvailable回调间隔

三、厂商特调方案
华为设备必看
- EMUI 9+ 需要手动设置 surface.setFrameRate
- 遇到花屏时尝试
COLOR_FormatYUV420Flexible
小米设备注意
- 关闭 MIUI 优化(开发者选项)
- 避免使用
SurfaceTexture.getTimestamp()
四、性能验证方法
- 使用 systrace 观察关键阶段:
python systrace.py -a com.your.package gfx video -o trace.html - 通过
dumpsys media.codec检查编码状态 - 用 Perfetto 分析帧提交间隔
五、待解难题
目前我们在 Redmi K40 上实现了 1080P@60FPS 稳定录制,但遇到几个新挑战: 1. 4K 录制时 SurfaceFlinger 耗时暴涨 2. HDR 内容出现色偏 3. 多音频轨混合的场景同步问题
欢迎在评论区分享你的解决方案,特别是遇到这些机型问题时: - 三星 OneUI 的色域问题 - OPPO ColorOS 的后台录制限制 - 一加手机的 Buffer 溢出 Bug
(所有代码均已在 Android 12 的 Pixel 6 和 MIUI 13 设备验证通过)
更多推荐


所有评论(0)