我遇到视频播放的帧丢失问题。我们刚从ICS搬到了KK4.4。视频分辨率非常小,为320x240。没有音频可以使事情变得简单。
Systrace位于以下位置:https://www.dropbox.com/s/bee6xymg3kpn4ft/mytrace2.html?dl=0
我启用了三重缓冲,而hwcomposer正在为SurfaceFlinger生成假的vsync。
我可以看到以下问题:
由于videodecoder分配7个缓冲区队列,因此未正确启用三重缓冲。如果三重缓冲对于从TimedEventQueue(OnVideoEvent)排队的每个帧都工作正常,那么应该出列的缓冲区应该是后面的2个插槽。对于Ex:如果我们排队buf 4那么buf 2应该出列但是什么是出队的是前一个缓冲区,只有当它有机会下次运行时,surfaceflinger才会释放。因此,延迟会导致视频的取消缓冲能够赶上。
SurfaceFlinger本身需要一些时间才能完成。
Vsync在适当的时间没有开启,每30分钟视频播放时间为33分钟。由于没有实际的缓冲区被排队,因此HWComposer或vsync中的vsync生成逻辑没有被eventControl启用的问题?
从我做出的以下评论中更新: 我注意到的其他事情是async和mDequeueBufferCannotBlock标志都是false,因此getMinUndequeuedBufferCount()返回1,因此我们看到前一个缓冲区被要求出列而不是后面的缓冲区2个槽。如果上述理解存在漏洞,请告诉我。还有我可以做些什么来解决这个问题
非常感谢任何帮助。
答案 0 :(得分:1)
视频编解码器决定了他们需要多少缓冲区。 BufferQueue配置是一种协商。
我没看到SurfaceFlinger需要很长时间才能完成。查看/system/bin/surfaceflinger
行 - 它正在快速工作。
当没有工作要做时,醒来和工作没有任何价值,所以如果没有任何事情发生,VSYNC会被关闭。您的后一个假设是正确的 - 如果您查看SurfaceView
行,您可以看到没有可用缓冲区与SurfaceFlinger中没有唤醒之间的相关性。
我看到SurfaceView
BufferQueue上的帧到达之间的180ms,大约是5.5fps。 mediaserver过程中有一些很长的onVideoEvent
部分 - 您使用的编解码器是什么?
您将此描述为“丢帧”问题 - 您正在使用哪个播放器?