【问题标题】:How to clear SurfaceTexture after using it with a MediaPlayer?与 MediaPlayer 一起使用后如何清除 SurfaceTexture?
【发布时间】:2014-12-08 22:25:19
【问题描述】:

我正在使用带有 TextureView 子级的 ListView。 TextureView 使用 MediaPlayer 播放视频。当 TextureView 被回收时,最后一帧会保留在表面上,直到下一个 MediaPlayer 使用它。

“清除”TextureView 的表面(例如黑色)以使旧框架不出现的最简单方法是什么?

【问题讨论】:

    标签: android textureview


    【解决方案1】:

    经过一段时间的努力,我想出了几个可能的解决方案:

    a) 使用 GLES 清除表面。您可以在Grafika 中看到一个示例(查看 clearSurface() 方法)。我个人不喜欢这个,因为我不认为向黑色的不和谐过渡看起来特别好,如果你还没有使用 GL 代码,这会产生相当多的技术开销。此外,这似乎只适用于 API 17+。

    b) 我选择的解决方案是在每次我想播放视频时简单地创建一个新的 TextureView 并将其添加到适当的视图中,而不是重复使用旧的。我会犹豫是否称这是一个好的解决方案,但这是我能找到的最不可怕的解决方案。

    c) 如果您再次播放同一视频,您可以做的一件事是在视频播放完毕后尝试寻找视频的第一帧。然后下一次最后一帧闪烁时,它将不可见,因为它将与视频的开头相同。我在这方面取得了一些成功,但无法让它在所有设备上可靠地工作。这也很明显是一个 hack。

    祝你好运,尝试解决这个问题非常令人沮丧。

    【讨论】:

    • 还有(d)在TextureView之上添加一个空白View。播放视频时隐藏,播放停止时显示。
    • 至少我发现的问题是视频会在播放开始时闪烁第一帧,即使在 MediaPlayer onPrepared 调用之后也是如此。我找不到确定纹理何时真正准备好的方法!如果有这样的事情我很想知道。
    • 我知道这是旧的,但你能分享你的 b) 代码吗?不幸的是,我无法找到任何可靠工作的解决方案。
    • 不幸的是我不能分享代码,但它的要点很简单。我的解决方案是使用 XML 中定义的空 ViewGroup(在我的情况下,FrameLayout 工作正常)。当需要播放视频时,我会实例化一个新的 TextureView,并将其作为子项添加到该 ViewGroup,在视频播放完成或发生视图回收时将其删除。那或fadden在纹理顶部的空白视图的解决方案应该能够满足您的需求。
    【解决方案2】:

    2020 最简单的方法是简单地将纹理视图的 alpha 设置为 0。

    mTextureView.setAlpha(0);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-25
      • 2013-06-08
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 2020-10-29
      • 2016-12-20
      相关资源
      最近更新 更多