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

