【问题标题】:Frame Drop issue with video playback视频播放的丢帧问题
【发布时间】:2015-09-15 16:46:32
【问题描述】:

我在播放视频时遇到了丢帧问题。我们刚刚从 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 个插槽。请让我知道上述理解是否存在漏洞。以及我能做的任何事情来解决这个问题

非常感谢任何帮助。

【问题讨论】:

    标签: android systrace surfaceflinger audiovideoplayback


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

    2. 我看不到 SurfaceFlinger 需要很长时间才能完成的地方。查看/system/bin/surfaceflinger 行——它工作得很快。

    3. 在没有工作可做的情况下醒来并工作没有任何价值,因此如果没有任何事情发生,VSYNC 将被关闭。您的后一个假设是正确的——如果您查看SurfaceView 行,您会发现没有可用缓冲区与 SurfaceFlinger 中没有唤醒之间存在相关性。

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

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

    【讨论】:

    • 感谢您的回复。我们正在使用 OMX 编解码器和股票 android 视频播放器。现在 OnVideoEvent 需要更多时间,因为 dequeuebuffer 大部分时间都需要很长时间。现在 DequeueBuffer 需要很长时间,因为它试图出队的表面视图仍然被表面抛掷器持有。 Surface flinger 仅在获得下一个缓冲区后才在其自身的下一个实例中释放它。
    • 我注意到的其他事情是 async 和 mDequeueBufferCannotBlock 标志都是假的,因此 getMinUndequeuedBufferCount() 返回 1 ,因此我们看到前一个缓冲区被要求出队,而不是后面 2 个插槽的缓冲区。请让我知道上述理解是否存在漏洞。以及我能做的任何事情来解决这个问题。
    • 任何可以帮助我的东西.. :)
    • 在同一视频上获取 Grafika 播放器的系统跟踪(或使用选中“以 60 fps 播放”框的测试剪辑)。比较行为并尝试找出它们不同的原因。 (如果它们没有不同,那也很有趣。)如果您想查看系统在不同帧速率下的表现,“计划交换”活动可用作 SurfaceFlinger+systrace“音调发生器”。底线是可以以 60fps 的速度播放视频,所以如果不是我倾向于查看源(编解码器/解码器)而不是中间或结尾的部分。
    猜你喜欢
    • 2015-09-02
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    相关资源
    最近更新 更多