MediaPlayer 播放视频出现上一帧图像问题处理

MediaPlayer + SurfaceView 播放视频的时候,播放下一个视频时 surface 会停留在上一帧图像,正常播放情况无影响,因为马上新的视频帧就会输出上去。

但是有时候部分视频格式支持有问题,导致只能输出音频流,没有视频帧输出,就会出现问题。因为这时候 surface 上的图像是上一个视频文件的,但其实播放的是现在的视频文件。这就需要我们清空 surface 内容设置为黑色了。循着这条思路在网上搜索了一圈找到一些方法如下。

https://www.cnblogs.com/roger-yu/p/14963069.html

https://zhuanlan.zhihu.com/p/361812100

这里面的方法都是通过 GLES 来做清除操作,因为直接在 surface 上面操作的话会导致后续的 mediaplayer 播放报错。但是我在 android10 上面使用并没有效果。这条路没法通了。

后续找到 ExoPlayer 也存在相关问题,见问题链接https://github.com/google/ExoPlayer/issues/1942 看解决方案是设置一个黑色占位 View,等待视频渲染后隐藏即可。接着按照这条方法继续寻找,发现 surface 和 mediaplayer 里面并没有直接提供获取渲染第一帧相关的方法。但是MediaPlayer有一个setOnVideoSizeChangedListener 方法是可以做到的。这个方法注释是Register a callback to be invoked when the video size is known or updated. 。在视频帧不可用的时候是不会被调用的,而且方法会调用两次,分别是onPrepared回调前后,这样我们就可以实现在播放视频前,展示一个黑色界面遮盖Surface,视频开始播放且有视频帧时隐藏这个界面。这样从用户视角上来讲,这个上一帧的图像也就完全不可见了。我们也就解决了这个问题。

现在发现不少问题都是这样,并不能从根本上去解决,但是从发现方用户方入手,从体验上解决这个问题,这也不失为一个好的解决思路。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Unity中使用UniversalMediaPlayer 2.0.3版本视频流插件获取第一帧并将其显示在UI上,您可以使用以下步骤: 1. 在Unity Asset Store中下载并导入UniversalMediaPlayer插件。 2. 在Unity场景中创建一个空GameObject并将UniversalMediaPlayer组件附加到它上面。 3. 在UniversalMediaPlayer组件中设置视频流的URL或本地视频文件的路径。 4. 在Unity场景中创建一个UI RawImage元素,用于显示视频流的第一帧。 5. 创建一个C#脚本并将其附加到空GameObject上,以便在运行时获取视频流的第一帧并将其显示在UI RawImage上。 以下是示例脚本: ```csharp using UnityEngine; using UnityEngine.UI; using System.Collections; public class VideoPlayerController : MonoBehaviour { public UniversalMediaPlayer mediaPlayer; public RawImage rawImage; IEnumerator Start() { // 开始播放视频mediaPlayer.Play(); // 等待几秒钟,确保第一帧已经加载完成 yield return new WaitForSeconds(3f); // 获取第一帧图像 Texture2D texture = mediaPlayer.GetTexture(0); // 将图像显示在UI RawImage上 rawImage.texture = texture; } } ``` 在此示例中,我们通过调用UniversalMediaPlayer组件的Play()方法来开始播放视频流。然后,我们等待几秒钟,以确保第一帧已经加载完成。最后,我们使用GetTexture()方法获取第一帧图像,并将其显示在UI RawImage上。 请注意,为了确保视频流的第一帧已经加载完成,我们在Start()方法中使用了一个协程来等待几秒钟。您可以自行调整等待时间,以确保第一帧已经加载完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值