Unity--VideoPlayer的使用案例

VideoPlayer 介绍:

Unity正式发布了5.6版本后,作为5.x版本的最后一版还是有不少给力的更新的。其中新加入了一个Video Player控件,用以取代之前的MovieTexture。

Video Player提供了多种视频渲染的方式,包括Camera Far Plane,Camera Near Plane,Render Texture,Material Override,Api Only。

Camera Far Plane:基于摄像机的渲染,渲染在摄像机的远平面上,需要设置用于渲染的摄像机,同时可以修改alpha通道的值做透明效果,可用于背景播放器。


Camera Near Plane:基于摄像机的渲染,渲染在摄像机的近平面上,需要设置用于渲染的摄像机,同时可以修改alpha通道的值做透明效果,可用作前景播放器。


Render Texture:将视频画面保存在Render Texture上,以供物体或者RawImage使用,可以用来做基于UGUI的播放器。


Material Override:将视频画面复制给所选Render的Material。需要选择具有Render组件的物体,可以选择赋值的材质属性。可制作360全景视频VR视频。


Api Only:不要在任何地方绘制视频内容,但仍可通过API中的VideoPlayer的纹理属性使其可用。

扫描二维码关注公众号,回复: 1979468 查看本文章


本地视频播放:

直接将视频拖到VideoClip上

网络视频播放:

将网络视频的链接写到URL上面

这个时候我们会发现,播放的时候没有声音。
我们只要添加一个Audio Source组件,将他赋给VideoPlayer里面的Audio Source就有声音了,如下图所示。

VideoPlayer脚本控制:

脚本控制(需引用UnityEngine.Video):
VideoPlayer的脚本控制与AudioSource相似,有常规的Play,Pause,Stop方法,也有用于进度控制的time,isPlaying,isLooping,frame,frameCount等属性。
VideoPlayer可以使用一系列事件来监听播放的各个动作:
  • errorReceived: 错误监听到时被执行。
  • frameDropped :有丢帧发生时被执行。
  • frameReady :新的一帧准备好时被执行。
  • loopPointReached :播放结束或播放到循环的点时被执行。
  • prepareCompleted :视频准备完成时被执行。
  • seekCompleted :查询帧操作完成时被执行。
  • started:在Play方法调用之后立刻调用。


下面是部分代码实现,具体工程可以点击这里下载,Unity——VideoPlayer完整运行实例

工程截图:


VideoPlayer初始化:

private void Init(string url)
    {
        show = true;
        isVideo = true;
        mute = false;
        time_Count = 0;
        time_Current = 0;
        sliderVideo.value = 0;
        //设置RenderTexture或RawImage上渲染VideoPlayer
        vPlayer.renderMode = VideoRenderMode.RenderTexture;
        //设置为URL模式
        vPlayer.source = VideoSource.Url;
        //设置播放路径
        vPlayer.url = url;
        //在视频中嵌入的音频类型
        vPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource;
        //当VideoPlayer全部设置好的时候调用,帧立即可用
        vPlayer.prepareCompleted += OnPrepareFinished;
        //准备播放所需要的资源,预加载部分或者全部要播放的视频
        vPlayer.Prepare();
    }

VideoPlayer的prepareCompleted执行回调,按照Unity官方文档,直接调用Play()方法,也会先调用Prepare()方法,等待准备完毕,才会播放:

void OnPrepareFinished(VideoPlayer player)
    {
        //把图像赋给RawImage
        image.texture = vPlayer.texture;
        //帧数/帧速率=总时长    如果是本地直接赋值的视频,我们可以通过VideoClip.length获取总时长
        sliderVideo.maxValue = vPlayer.frameCount / vPlayer.frameRate;

        time = sliderVideo.maxValue;
        hour = (int)time / 60;
        mint = (int)time % 60;
        text_Count.text = string.Format("/  {0:D2}:{1:D2}", hour, mint);

        sliderVideo.onValueChanged.AddListener(delegate { ChangeVideo(sliderVideo.value); });

        player.Play();
    }

猜你喜欢

转载自blog.csdn.net/qq826364410/article/details/80516054