oynix

于无声处听惊雷,于无色处见繁花

Unity使用VideoPlayer

https://docs.unity3d.com/cn/2021.1/Manual/class-VideoPlayer.html

官方使用文档,参数不多,且介绍的很详细,一般来说,都是使用VideoClip的方式,照着文档来就可以正常走通。但是,如果把视频资源打进AssetBundle里,当在Android 9及更低版本的手机上时,就会一片黑色,无法正常播放。

查看系统log,会找到一个报错,说的是无法找到该视频。这大概是控件自身的兼容问题,在更高版本的系统上是可以正常播放的。虽然这个版本的设备已经很少,在我们的产品里,只占零点几个点,但还是要兼容一下。

这个时候就不能使用VideoClip的方式。而是将视频文件以.bytes扩展名打进AssetBundle中,在播放的时候,以TextAsset的形式把视频文件提取出来,再以.mp4的扩展存储到本地一份,然后通过VideoPlayer控件的URL模式来播放本地的视频文件,这样就正常了。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 获取组件
public RenderTexture texture;
public VideoPlayer videoPlayer;
public RawImage rawImage;

// 视频资源name.bytes的地址
public string videoPath = "";

private IEnumerator Play()
{
// 初始化组件
var rect = (RectTransform) rawImage.transform;
texture = RenderTexture.GetTemporary((int) rect.width, (int) rect.height);
videoPlayer.targetTexture = _texture;
rawImage.texture = _texture;

// 加载图片资源
var h = Addressables.LoadAssetAsync<TextAsset>(videoPaty);
yield return h;

// 转换到本地
var path = Path.Combine(Application.persitentDataPath, "LocalVideo.mp4");
if (!File.Exists(path))
{
File.WriteAllBytes(path, h.Result.bytes);
}

Addressables.Release(h);

// 播放本地视频文件
videoPlayer.url = url;
videoPlayer.isLooping = false;
videoPlayer.loopPointReached += OnFinish;
videoPlayer.Play();
}

private void OnFinish()
{
RenderTexture.ReleaseTemporary(texture);
}

(完)

------------- (完) -------------
  • 本文作者: oynix
  • 本文链接: https://oynix.com/2023/11/aacc07153e25/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道