帧丢失问题与视频播放

时间:2015-09-15 16:46:33

标签: android systrace surfaceflinger audiovideoplayback

我遇到视频播放的帧丢失问题。我们刚从ICS搬到了KK4.4。视频分辨率非常小,为320x240。没有音频可以使事情变得简单。

Systrace位于以下位置:https://www.dropbox.com/s/bee6xymg3kpn4ft/mytrace2.html?dl=0

我启用了三重缓冲,而hwcomposer正在为SurfaceFlinger生成假的vsync。

我可以看到以下问题:

  1. 由于videodecoder分配7个缓冲区队列,因此未正确启用三重缓冲。如果三重缓冲对于从TimedEventQueue(OnVideoEvent)排队的每个帧都工作正常,那么应该出列的缓冲区应该是后面的2个插槽。对于Ex:如果我们排队buf 4那么buf 2应该出列但是什么是出队的是前一个缓冲区,只有当它有机会下次运行时,surfaceflinger才会释放。因此,延迟会导致视频的取消缓冲能够赶上。

  2. SurfaceFlinger本身需要一些时间才能完成。

  3. Vsync在适当的时间没有开启,每30分钟视频播放时间为33分钟。由于没有实际的缓冲区被排队,因此HWComposer或vsync中的vsync生成逻辑没有被eventControl启用的问题?

  4. 从我做出的以下评论中更新: 我注意到的其他事情是async和mDequeueBufferCannotBlock标志都是false,因此getMinUndequeuedBufferCount()返回1,因此我们看到前一个缓冲区被要求出列而不是后面的缓冲区2个槽。如果上述理解存在漏洞,请告诉我。还有我可以做些什么来解决这个问题

    非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

  1. 视频编解码器决定了他们需要多少缓冲区。 BufferQueue配置是一种协商。

  2. 我没看到SurfaceFlinger需要很长时间才能完成。查看/system/bin/surfaceflinger行 - 它正在快速工作。

  3. 当没有工作要做时,醒来和工作没有任何价值,所以如果没有任何事情发生,VSYNC会被关闭。您的后一个假设是正确的 - 如果您查看SurfaceView行,您可以看到没有可用缓冲区与SurfaceFlinger中没有唤醒之间的相关性。

  4. 我看到SurfaceView BufferQueue上的帧到达之间的180ms,大约是5.5fps。 mediaserver过程中有一些很长的onVideoEvent部分 - 您使用的编解码器是什么?

    您将此描述为“丢帧”问题 - 您正在使用哪个播放器?