这是我的设置:
我从 VirtualDisplay 捕获帧到 SurfaceTexture,使用 OpenGL 在纹理本身上绘制一些动画对象并将其发送到 MediaCodec 的输入表面。但是在绘制之后,我必须正确地将时间戳设置为 EGL。我尝试了两种方法:
- 设置从 SurfaceTexture 接收的时间戳。当屏幕上有内容更新时,这可以正常工作。一般来说,虚拟显示帧率在 (0 - displayRefresh) 范围内。这导致编码器在等待 SurfaceTexture 更新时可能什么都不做,我无法通过 RTMP 发送编码帧的问题。
- 使用通过 const FPS 循环计算的自定义时间戳并不断绘制。由于不正确的视频帧速度,它会导致视频滞后。
我看到了一些技巧,比如在屏幕上设置动画视图来推动 VirtualDisplay 生成帧,但它看起来不是一个好的解决方案。MediaCodec 也有一个标志 - KEY_REPEAT_PREVIOUS_FRAME_AFTER,但它不能完全工作。
在这种情况下正确计算时间戳的正确方法是什么?