gpt4 book ai didi

android - 视频播放的掉帧问题

转载 作者:行者123 更新时间:2023-11-30 01:53:45 26 4
gpt4 key购买 nike

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

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

我启用了三重缓冲,并且 hwcomposer 正在为 SurfaceFlinger 生成伪造的垂直同步。

我可以看到以下问题:

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

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

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

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

非常感谢任何帮助。

最佳答案

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

  2. 我没有看到 SurfaceFlinger 在哪里需要很长时间才能完成。查看 /system/bin/surfaceflinger 行——它运行很快。

  3. 在没有工作可做时起床工作没有任何值(value),因此如果没有任何事情发生,VSYNC 就会关闭。您的后一个假设是正确的——如果您查看 SurfaceView 行,您可以看到没有可用缓冲区与 SurfaceFlinger 没有唤醒之间的相关性。

我看到 SurfaceView BufferQueue 上的帧到达之间有 180 毫秒,大约是 5.5fps。媒体服务器进程中有一些很长的 onVideoEvent 部分 -- 您使用的是什么编解码器?

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

关于android - 视频播放的掉帧问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32591437/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com