Unity实现视频播放

Posted Breezee_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity实现视频播放相关的知识,希望对你有一定的参考价值。

准备工作

Untiy软件

5.6及以后的版本,作者用的是Unity2020

一段视频

Untiy要求Mp4格式的视频

制作过程

导入素材

在项目中新建 vedio文件夹,并将准备好的视频拖进去

点击视频素材,转码,这步需要一点时间

新建画布 Canvas

现实中播放视频需要载体(电视、手机),虚拟环境中也需要一个载体,把视频给放上去,就是 画布

给Canvas改个名字——PageVideo

新建一个渲染器纹理

相当于准备一个显示器

新建完成后,在vedio文件夹下多了一个东西,重命名为 renderTex

新建原始图像 Raw Image,作为画布的子部件

有了播放载体Canvas,还需要知道要往上放啥东西
所以要新建一个Raw IMage

  1. 可以调整一下尺寸,跟分辨率适应
  2. 将准备好的renderTex拖到【纹理】位置


3. 添加【视频】组件,将准备好的视频拖进去,再将 renderTex拖到【目标纹理】里边
4.添加【音频源组件】

效果展示

unity 中播放视频

Unity视频播放有很多种实现方式,可根据要求来选择适当的实现,这里总结一下:
1. MovieTexture
Unity标准接口,支持的播放视频格式有.mov、.mpg、.mpeg、.mp4、.avi和.asf。仅支持PC端的本地视频播放。
1. 在游戏对象中播放,就好比在游戏世界中创建一个Plane面对象,摄像机直直的照射在这个面上
在新建的一个plane平面,将其纹理绑定为电影纹理即可
//设置当前对象的主纹理为电影纹理
renderer.material.mainTexture = movTexture;
//设置电影纹理播放模式为循环
movTexture.loop = true;
并可通过
movTexture.Play();
movTexture.Pause();
movTexture.Stop();
来进行播放控制。
此时可以通过直接缩放plane平面来达到缩放视频的目的
至于MovieTexture的赋值,在5.0x版本上是无法通过将视频拖入Project视频来自动造成纹理的。


2. 在GUI层面播放。它其实和贴图非常相像,因为播放视频用到的MovieTexture属于贴图Texture的子类。
//绘制电影纹理
GUI.DrawTexture(newRect(0,0, Screen.width,Screen.height),movTexture,ScaleMode.StretchToFill);
播放视频的大小是屏幕的宽高,如果想动态的修改视频的宽或高直接修改new Rect()视频显示区域即可
2. Handheld.PlayFullScreenMovie
Unity标准的视频播放接口,支持的播放视频格式有.mov、.mpg、.mpeg、.mp4、.avi和.asf。支持PC/移动端播放,支持本地在线播放
url_movie = "http://dl.nbrom.cn/17051/c3e408229342723fbdf62d0bcf1d549c.mp4?fsname=Criminal_Minds_S01E01.mp4";
Handheld.PlayFullScreenMovie(url_movie, Color.black, FullScreenMovieControlMode.Full);
Handheld.PlayFullScreenMovie("test.mp4", Color.black, FullScreenMovieControlMode.CancelOnInput);
将视频文件放置在Assets/StreamingAssets/路径下
上面的方法在移动端是边下载边播放网络视频的,属于在线播放,不好的地方就是,再次观看还需要再次加载。可能在播放的时候判断是否已下载到本地如果在本地就可以播放本地,如果没有再从网上下载到本地
3. EasyMovieTexture
Unity移动端第三方视频播放插件,支持视频本地播放,支持RTSP。
1>. 初始化加载,该部分主要在Unity中将播放视频的地址(本地/URL)传送到Android,并完成MediaPlayer的初始化
2>. Android创建一个Surface,并将其与之前创建的MediaPlayer绑定
3>. 结合视频绘制载体计算图像拉伸比
4>. 根据视频宽高比创建VideoTexture并传到Android与
m_VideoTexture = new Texture2D(Call_GetVideoWidth(), Call_GetVideoHeight(), TextureFormat.RGB565, false);
Call_SetUnityTexture(m_VideoTexture.GetNativeTextureID());
5>. 设置视频窗口,完成TextureId与surface的绑定
SetWindowSize(GetVideoWidth(),GetVideoHeight(),m_iUnityTextureID ,m_bRockchip);
6>. 更新纹理
Call_UpdateVideoTexture();
m_SurfaceTexture.updateTexImage();
7>. 播放视频
使用MediaPlayer播放视频
4. MediaPlayer + SurfaceTexture
播放组件上层使用MediaPlayer来处理,在成功创建并设置好setDataSource后,需要创建GL_TEXTURE_EXTERNAL_OES格式的纹理ID来与MediaPlayer生成联系。
在这里我们需要使用SurfaceTexture的理由是,它能代替SurfaceHolder,使得当我们指定图像流的输出目标为照相机预览或视频解码时,我们在每一帧中得到的所有数据不需要直接用于显示在设备上,而是可以选择先输出到SurfaceTexture上,在上屏之前可能做一些自定义扩展。当调用updateTexImage()时,用来创建SurfaceTexture的纹理对象内容被更新为包含图像流中最近的图片。
SurfaceTexture对象可以在任何线程里创建。但updateTexImage()只能在包含纹理对象的OpenGL ES上下文所在的线程里创建。可以得到帧信息的回调可以在任何线程被调用。这一点要注意,上下文如果不一致,视频无法上屏。
这里还有个要求就是在创建纹理的时候,需要使用使用GL_TEXTURE_EXTERNAL_OES作为纹理目标,其是OpenGL ES扩展GL_OES_EGL_image_external定义的。这种纹理目标会对纹理的使用方式造成一些限制。每次纹理绑定的时候,都要绑定到GL_TEXTURE_EXTERNAL_OES,而不是GL_TEXTURE_2D。而且,任何需要从纹理中采样的OpenGL ES 2.0 shader都需要声明其对此扩展的使用,例如,使用指令”#extension GL_OES_EGL_image_external:require”。这些shader也必须使用samplerExternalOES采样方式来访问纹理。

以上是关于Unity实现视频播放的主要内容,如果未能解决你的问题,请参考以下文章

Unity实现一打开游戏就播放视频动画

Unity 视频播放

Unity3D两种方式播放视频

Unity3d 播放高质量视频解决方案

Unity实现视频播放

Unity实现Android端视频播放