视频播放功能模块

终于可以静下心来写一下日志了,下面是做的一块关于视频播放的功能,主要是要用到插件AVProQuickTime,已经用过多次,还是非常不错的,不过这个项目是基于4.3版本的,比较老,属于在维护。
主摄像机上挂载AVProQuickTimeManager即可,然后新建一个对象命名为MovieObject,然后挂载AVProQuickTimeGUIDisplay,和AVProQuickTimeMovie,但是在后者中,我们对视频资源的地址进行了更改,方便后面更换,更改后代码如下:

using UnityEngine;
using System;
using System.IO;
using System.Collections;

//-----------------------------------------------------------------------------
// Copyright 2012 RenderHeads Ltd.  All rights reserverd.
//-----------------------------------------------------------------------------

[AddComponentMenu("AVPro QuickTime/Movie")]
public class AVProQuickTimeMovie : MonoBehaviour
{
    protected AVProQuickTime _moviePlayer;
    public AVProQuickTimePlugin.MovieSource _source = AVProQuickTimePlugin.MovieSource.LocalFile;

    public string _folder = "";
  // public string _filename = "Movie.mov";
    public string _filename;
    public bool _loop = false;
    public AVProQuickTimePlugin.PixelFormat _colourFormat = AVProQuickTimePlugin.PixelFormat.YCbCr_HD;
    public bool _loadOnStart = true;
    public bool _playOnStart = true;
    public bool _loadFirstFrame = true;
    public bool _editorPreview = false;
    public AVProQuickTime.UpdateMode _updateMode = AVProQuickTime.UpdateMode.UnityTexture;
    public float _volume = 1.0f;

    [NonSerializedAttribute]

    public byte[] _movieData;

    public Texture OutputTexture
    {
        get { if (_moviePlayer != null) return _moviePlayer.OutputTexture; return null; }
    }

    public AVProQuickTime MovieInstance
    {
        get { return _moviePlayer; }
    }

    public void Start()
    {

        _folder = MainMessage.folderName;

        _filename = MainMessage.videoName;

        if (null == FindObjectOfType(typeof(AVProQuickTimeManager)))
        {
            throw new Exception("You need to add AVProQuickTimeManager component to your scene.");
        }

        if (_loadOnStart)
        {
            LoadMovie();
        }
    }

    public void LoadMovie()
    {
        if (_moviePlayer == null)
            _moviePlayer = new AVProQuickTime();

        bool loaded = false;
        switch (_source)
        {
            case AVProQuickTimePlugin.MovieSource.LocalFile:
                loaded = _moviePlayer.StartFromFile(Path.Combine(_folder, _filename), _loop, _colourFormat, _updateMode);
                break;
            case AVProQuickTimePlugin.MovieSource.URL:
                loaded = _moviePlayer.StartFromURL(Path.Combine(_folder, _filename), _loop, _colourFormat, _updateMode);
                break;
            case AVProQuickTimePlugin.MovieSource.Memory:
                if (_movieData != null)
                {
                    loaded = _moviePlayer.StartFromMemory(_movieData, _filename, _loop, _colourFormat, _updateMode);
                }
                break;
        }

        if (loaded)
        {
            _moviePlayer.Volume = _volume;
        }
        else
        {
            Debug.LogWarning("[AVProQuickTime] Couldn't load movie " + _filename);
            UnloadMovie();
        }
    }

    public void Update()
    {
        _volume = Mathf.Clamp01(_volume);

        if (_moviePlayer != null)
        {
            if (_volume != _moviePlayer.Volume)
                _moviePlayer.Volume = _volume;

            if (!_moviePlayer.IsPlaying)
            {
                if (_loadFirstFrame)
                {
                    if (_moviePlayer.PlayState == AVProQuickTime.PlaybackState.Loaded)
                    {
                        _moviePlayer.Frame = 0;
                        _loadFirstFrame = false;
                    }
                }
                if (_playOnStart)
                {
                    if ((int)_moviePlayer.PlayState >= (int)AVProQuickTime.PlaybackState.Loaded && _moviePlayer.LoadedSeconds > 0f)
                    {
                        _moviePlayer.Play();
                        _playOnStart = false;
                    }
                }           
            }

            _moviePlayer.Update(false);
        }
    }

    public void Play()
    {
        if (_moviePlayer != null)
            _moviePlayer.Play();
    }

    public void Pause()
    {
        if (_moviePlayer != null)
            _moviePlayer.Pause();
    }   

    public void UnloadMovie()
    {
        if (_moviePlayer != null)
        {
            _moviePlayer.Dispose();
            _moviePlayer = null;
        }
    }

    public void OnDestroy()
    {
        UnloadMovie();
    }
}

最后是关于视频快进暂停,进度条的相关控制,只需要下面的一个脚本就行,然后给相应的变量赋值,直接在inspector中拖到对应位置比较方便。

using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;

public class AVProQuickTimePlayVideoDemo : MonoBehaviour
{
    public AVProQuickTimeMovie _movie;
    public AVProQuickTimeGUIDisplay _display;
    private bool isPlay = true;
    public GUISkin mySkin;
    private bool isShow = false;
    private float oldScreenWidth = 1920;
    private float oldScreenHeight = 1080;
    private float sliderWidth;
    private float sliderHeitht;
    public Texture2D backLabel;
    public Texture2D replay;
    public Texture2D back;
    public Texture2D pause;

    private bool isQuite=false;

    private bool isShowSlider = false;



    void Awake()
    {
        sliderWidth = (Screen.width / oldScreenWidth) * 1200;
        sliderHeitht = (Screen.height / oldScreenHeight) * 30;        
    }

    void Update()
    {
        AVProQuickTime moviePlayer = _movie.MovieInstance;

        if (Input.mousePosition.y < 40.0f)
        {
            isShowSlider = true;
        }
        else
            isShowSlider = false;

        if (Input.GetMouseButtonDown(1))
        {
            isQuite = !isQuite;
        }
        if (isQuite)
        {
            moviePlayer.Pause();
        }

        if (Input.GetMouseButtonDown(0) && isShow == false && (Input.mousePosition.y > 40.0f))
        {
            isPlay = !isPlay;
        }
        if (isPlay == true)
        {
            moviePlayer.Play();
        }
        if (isPlay == false)
        {
          //  moviePlayer.Pause();
        }                                      // 暂停功能

        if (Input.GetKey(KeyCode.LeftArrow))
        {
            isShowSlider = true;
            moviePlayer.Pause();
            if (moviePlayer.Frame > 0)
                moviePlayer.Frame-=15;
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            isShowSlider = true;
            moviePlayer.Pause();
            moviePlayer.Frame+=10;
        }


        if (moviePlayer.Frame!=0)
        {
            if (moviePlayer.Frame == moviePlayer.FrameCount || moviePlayer.Frame == moviePlayer.FrameCount - 1)
        {
            moviePlayer.Pause();
            isShow = true;
        }
        else
            isShow = false;        
        }
    }

    public void OnGUI()
    {
        GUI.skin=mySkin;
        AVProQuickTime moviePlayer = _movie.MovieInstance;
        float position = moviePlayer.PositionSeconds;
        if (isShowSlider)
        {
            float newPosition = GUI.HorizontalSlider(new Rect(Screen.width / 2 - sliderWidth / 2, Screen.height - sliderHeitht, sliderWidth, sliderHeitht), position, 0.0f, moviePlayer.DurationSeconds, "SliderOld", "");   //返回时间
            float xnewPosition = GUI.HorizontalSlider(new Rect(Screen.width / 2 - sliderWidth / 2, Screen.height - sliderHeitht, newPosition * (sliderWidth / moviePlayer.DurationSeconds), sliderHeitht), position, 0.0f, moviePlayer.DurationSeconds, "SliderNew", "");

            if (position != newPosition)
            {
                moviePlayer.PositionSeconds = newPosition;
                moviePlayer.Play();
                moviePlayer.Update(true);
            }
        }

        if (isShow || isQuite)
        {
            isShowSlider = true;

            GUI.Label(new Rect(Screen.width / 2 - backLabel.width/2, Screen.height / 2 - backLabel.height/2,backLabel.width,backLabel.height), "", "backLabel");

            if (GUI.Button(new Rect(Screen.width / 2 + replay.width/4, Screen.height / 2 - replay.height/2,replay.width, replay.height), "", "Replay"))
            {
                isQuite = false;
                moviePlayer.Frame = 1;
            }
            if (GUI.Button(new Rect(Screen.width / 2 -back.width*1.25f, Screen.height / 2 - back.height/2, back.width,back.height), "", "Return"))
            {
               Application.LoadLevel("FrontInterface");
            }

        }

        if (isPlay == false && isQuite==false)
        {
            isShowSlider = true;
            moviePlayer.Pause();
            GUI.Label(new Rect(Screen.width / 2 - pause.width/2, Screen.height / 2-pause.height/2, pause.width, pause.height), "", "Pause");            // 暂停弹出Pause
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瓜皮肖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值