Android 视频录制过程中添加时间戳的实现方案求助(不使用FFmpeg)
Android 视频录制实时叠加时间戳(无FFmpeg)实现方案
所有实现逻辑的核心都是在视频帧送入编码器之前,将时间戳绘制到原始帧上,属于录制前预处理,完全不需要FFmpeg做后期处理,下面给出3种不同复杂度的可行方案:
方案1:Jetpack CameraX 实现(新手优先推荐)
CameraX是谷歌官方推出的Jetpack相机组件,封装了绝大多数相机兼容逻辑,代码量最低,适配Android 5.0及以上设备:
- 引入CameraX核心、预览、视频录制依赖
- 配置VideoCapture实例时,自定义帧处理逻辑:拿到相机输出的每一帧Bitmap,用原生Canvas绘制时间戳后再送入编码器
- 绘制时间戳参考代码:
// 全局复用Paint对象,避免频繁创建触发内存抖动 private val timePaint = Paint().apply { color = Color.WHITE textSize = 48f isAntiAlias = true // 添加阴影避免浅色背景下时间戳看不清 setShadowLayer(2f, 1f, 1f, Color.BLACK) } // 帧处理回调中执行绘制 fun drawTimeStamp(bitmap: Bitmap) { val canvas = Canvas(bitmap) val timeStr = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()) .format(System.currentTimeMillis()) // 绘制在画面左下角,可根据需求调整坐标 canvas.drawText(timeStr, 50f, bitmap.height - 50f, timePaint) }
- 优点:无需处理相机兼容问题,API简单易上手,出错概率低
方案2:Camera2 API + ImageReader 实现(高定制需求场景)
如果需要更底层的相机控制,可以用原生Camera2 API实现:
- 配置ImageReader监听相机输出的YUV帧数据,Android 8.0以上可直接通过系统API将YUV帧转为Bitmap
- 按照上述Canvas绘制逻辑叠加时间戳
- 将处理后的帧送入MediaCodec/MediaRecorder的编码Surface完成录制
- 注意点:自行处理YUV转RGB时要注意色彩空间对齐,避免出现画面偏色
方案3:自定义SurfaceView 实现(高性能场景)
对录制帧率要求高的场景可以用该方案,不需要做帧格式转换,渲染效率最高:
- 自定义SurfaceView承载相机预览,在每次刷新预览画面时,额外在Canvas上绘制当前时间戳
- 配置MediaRecorder时,直接将该SurfaceView的Surface设置为编码输入源,编码器拿到的帧已经自带时间戳
- 优点:渲染开销极低,适合4K/60帧等高规格录制场景
通用优化建议:
- 时间字符串的格式化逻辑提前在子线程完成,不要放到绘制主线程执行,避免掉帧
- 追求极致性能的场景可以用OpenGL绘制文字,比Canvas绘制性能高30%以上
- 所有绘制相关的对象(Paint、DateFormat等)全局复用,避免频繁创建销毁触发GC
内容的提问来源于stack exchange,提问作者Sandeep Dhand
相关产品推荐
相关产品推荐

