我在播放视频时遇到丢帧问题。我们刚刚从 ICS 迁移到 KK4.4。视频非常小,320x240 分辨率。没有音频可以让事情变得简单。
Systrace 位于以下位置:https ://www.dropbox.com/s/bee6xymg3kpn4ft/mytrace2.html?dl=0
我启用了三重缓冲,并且 hwcomposer 正在为 SurfaceFlinger 生成假 vsync。
我可以看到以下问题:
三重缓冲未正确启用,因为视频解码器分配了 7 个缓冲区队列。如果三重缓冲对于从 TimedEventQueue(OnVideoEvent) 排队的每个帧都可以正常工作,那么应该出队的缓冲区应该落后 2 个插槽。例如:如果我们将 buf 4 排队,则 buf 2 应该出队,但出队的是前一个缓冲区,surfaceflinger 仅在下次有机会运行时才释放。因此延迟会导致视频的取消缓冲区赶上来。
SurfaceFlinger 本身需要一些时间才能完成。
对于 30 fps 的视频,Vsync 没有在适当的时间打开,每 33 毫秒。HWComposer 中的 vsync 生成逻辑存在问题,或者由于没有实际缓冲区排队,eventControl 未启用 vsync?
从我所做的以下评论更新:我注意到的其他事情是 async 和 mDequeueBufferCannotBlock 标志都是错误的,因此 getMinUndequeuedBufferCount() 返回 1 ,因此我们看到前一个缓冲区被要求出队,而不是缓冲区后面 2 个插槽. 请让我知道上述理解是否存在漏洞。以及我能做的任何事情来解决这个问题
任何帮助是极大的赞赏。