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

Android SurfaceTexture调用getTimestamp()始终返回0的问题

问题原因
  • 核心原因是你仅完成了SurfaceTexture的初始化配置,还没有触发帧数据的接收流程,常见的具体场景如下:
    1. 绑定的纹理ID不匹配:你步骤1生成的有效外部纹理ID存放在textures[0]中,如果步骤2初始化SurfaceTexture时传入的mGlSurfaceTexture和该值不一致,会导致SurfaceTexture无法绑定有效纹理,自然无法接收帧数据,时间戳默认返回0
    2. 没有帧数据流入:SurfaceTexture的时间戳是每一帧数据到达时由生产者(比如相机、视频解码器、画布渲染等)赋值的,没有任何帧数据写入到SurfaceTexture对应的缓冲队列时,时间戳默认返回0
    3. 没有刷新纹理数据:即使有帧数据流入,如果没有调用updateTexImage()方法将最新的帧数据更新到绑定的OpenGL纹理上,getTimestamp()也不会刷新返回值,始终保持上一次(初始为0)的结果
    4. 生产者未正常工作:如果你已经将SurfaceTexture包装成Surface给生产者使用,但生产者还没有完成第一帧的渲染写入(比如相机未启动、解码器未开始解码、虚拟屏没有内容输出),也会出现返回0的情况
解决方案
  1. 首先校验纹理ID是否匹配,确保初始化SurfaceTexture时传入的参数就是步骤1中生成的textures[0]
  2. 将SurfaceTexture包装为Surface实例,传给对应的帧生产者使用:
    // 示例:包装为Surface给生产者使用
    Surface surface = new Surface(mSurfaceTexture);
    // 后续将surface传给相机/解码器/自定义渲染线程等生产者
    
  3. 注册OnFrameAvailableListener监听器,在收到帧可用回调后先刷新纹理,再获取时间戳:
    mSurfaceTexture.setOnFrameAvailableListener(surfaceTexture -> {
        // 帧可用时先更新纹理,拉取最新的帧数据
        surfaceTexture.updateTexImage();
        // 此时再获取时间戳即可得到当前帧的正确时间
        long timestamp = surfaceTexture.getTimestamp();
    });
    
  4. 特殊场景排查:
    如果是配合VirtualDisplay录屏的场景,需要确保VirtualDisplay已经成功创建,且对应屏幕没有熄屏、没有被系统拦截画面输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:39:02