【发布时间】:2015-09-15 16:46:32
【问题描述】:
我在播放视频时遇到了丢帧问题。我们刚刚从 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 个插槽。请让我知道上述理解是否存在漏洞。以及我能做的任何事情来解决这个问题
非常感谢任何帮助。
【问题讨论】:
标签: android systrace surfaceflinger audiovideoplayback