与 MediaPlayer 一起使用后如何清除 SurfaceTexture?

Posted

技术标签:

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

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

“清除”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);

【讨论】:

以上是关于与 MediaPlayer 一起使用后如何清除 SurfaceTexture?的主要内容,如果未能解决你的问题,请参考以下文章

将 tailwindcss 与 React 一起使用,清除后大小不会减小

UITextField 清除按钮与屏幕动画一起使用

Android 2.2 MediaPlayer 与一个 SHOUTcast URL 一起工作正常,但与另一个不兼容

Android Multimedia框架总结C++中MediaPlayer的C/S架构

Android MediaPlayer+SurfaceView播放视频(附Demo)

Android Multimedia框架总结C++中MediaPlayer的C/S架构补充及MediaService介绍