You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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帧等高规格录制场景

通用优化建议:

  1. 时间字符串的格式化逻辑提前在子线程完成,不要放到绘制主线程执行,避免掉帧
  2. 追求极致性能的场景可以用OpenGL绘制文字,比Canvas绘制性能高30%以上
  3. 所有绘制相关的对象(Paint、DateFormat等)全局复用,避免频繁创建销毁触发GC

内容的提问来源于stack exchange,提问作者Sandeep Dhand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 03:30:04