1

我在播放视频时遇到丢帧问题。我们刚刚从 ICS 迁移到 KK4.4。视频非常小,320x240 分辨率。没有音频可以让事情变得简单。

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

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

我可以看到以下问题:

  1. 三重缓冲未正确启用,因为视频解码器分配了 7 个缓冲区队列。如果三重缓冲对于从 TimedEventQueue(OnVideoEvent) 排队的每个帧都可以正常工作,那么应该出队的缓冲区应该落后 2 个插槽。例如:如果我们将 buf 4 排队,则 buf 2 应该出队,但出队的是前一个缓冲区,surfaceflinger 仅在下次有机会运行时才释放。因此延迟会导致视频的取消缓冲区赶上来。

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

  3. 对于 30 fps 的视频,Vsync 没有在适当的时间打开,每 33 毫秒。HWComposer 中的 vsync 生成逻辑存在问题,或者由于没有实际缓冲区排队,eventControl 未启用 vsync?

从我所做的以下评论更新:我注意到的其他事情是 async 和 mDequeueBufferCannotBlock 标志都是错误的,因此 getMinUndequeuedBufferCount() 返回 1 ,因此我们看到前一个缓冲区被要求出队,而不是缓冲区后面 2 个插槽. 请让我知道上述理解是否存在漏洞。以及我能做的任何事情来解决这个问题

任何帮助是极大的赞赏。

4

1 回答 1

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

  2. 我没有看到 SurfaceFlinger 需要很长时间才能完成的地方。看看这/system/bin/surfaceflinger条线——它工作得很快。

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

我看到SurfaceViewBufferQueue 上的帧到达之间有 180 毫秒,大约为 5.5fps。onVideoEventmediaserver 进程中有一些很长的部分——你使用的是什么编解码器?

您将此描述为“丢帧”问题——您使用的是哪个播放器?

于 2015-09-16T17:57:50.353 回答