我正在编写一个视频处理应用程序,需要知道每帧的实际时间。
当我使用elapsedRealtime
计算时间偏移时,该应用程序起初运行良好:
long timeOffset = java.lang.System.currentTimeMillis() - android.os.SystemClock.elapsedRealtime();
long actualTime = timestamp + timeOffset;
但是当我使用其他设备时,我发现某个设备将对SurfaceTexture.timestamp使用uptimeMillis
,因此代码应为:
long timeOffset = java.lang.System.currentTimeMillis() - android.os.SystemClock.uptimeMillis();
long actualTime = timestamp + timeOffset;
所以我的问题是,是否有任何方法可以知道该设备用于SurfaceTexture的时间来源?
尽管我可以在应用程序启动时计算出最接近的时间源,但我认为这可能会导致另一起我不知道的事故。
有什么办法知道吗?
答案 0 :(得分:1)
MediaCodec没有发明时间戳。在您将presentationTimeUs
参数传递给presentationTimeUs
或使用queueInputBuffer
输入时,MediaCodec返回的缓冲区仅包含与Surface
相同的值,这些缓冲区在输入表面上设置使用eglPresentationTimeANDROID
。
因此,您需要检查实际上产生时间戳的那段代码,以了解它们使用什么时间参考。