Unity编辑器环境下录屏,并制作播放器播放视频

版权声明:转发,使用请留言告知 https://blog.csdn.net/qq_37310110/article/details/86502890

工程源码,插件资源地址:https://download.csdn.net/download/qq_37310110/10920054

一.录屏工具导入(Recorder)

把recorder导入unity后,Tools>Recorder> Video打开录屏设置界面

把Input跟OutPut的参数设置一下,不要忘了还有输出视频的类型,帧率等

最后点击StartRecording就会运行工程并录制mainCamera视角也即是Game界面的画面

二.制作视频播放载体

1.新建RawImage,RenderTexture

2.在RawImage上添加VideoPlayer组件,并分别拖入创建的RenderTexture

三.编写播放器脚本

#region 模块信息
// **********************************************************************
// Copyright (C) 2019 Blazors
// Please contact me if you have any questions
// File Name:             Director
// Author:                romantic
// WeChat||QQ:            at853394528 || 853394528 
// **********************************************************************
#endregion

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;

public class PlayVideo : MonoBehaviour
{
    public VideoClip[] videoClips;      // 视频的文件 参数
    public Text videoTimeText;          // 视频的当前时间 Text
    public Text videoNameText;          // 视频的总时长 Text
    public Slider videoTimeSlider;      // 视频的时间 Slider

    // 定义参数获取VideoPlayer组件和RawImage组件
    public VideoPlayer videoPlayer;
    public RawImage rawImage;
    public Texture pingBao;             // 屏保图片

    public Button playPauseButton;       //播放暂停按钮
    public Button stopButton;            //停止播放按钮
    public Button button1;
    public Button button2;
    public Button button3;
    public Button button4;

    // Use this for initialization
    void Start()
    {
        //清空文本
        videoNameText.text = "";
        videoTimeText.text = "";
        videoTimeSlider.gameObject.AddComponent<SliderEvent>().playVideo = this;
        //获取场景中对应的组件
 
        videoPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource;
        //如果有对应音频
        //videoPlayer.SetTargetAudioSource(0, this.GetComponent<AudioSource>());
        //videoPlayer.IsAudioTrackEnabled(0);
        videoPlayer.playOnAwake = false;


        playPauseButton.onClick.AddListener(PlayOrPause);
        stopButton.onClick.AddListener(StopVideo);
        button1.onClick.AddListener(delegate { ShowVideoLength(videoClips[0]); });
        button2.onClick.AddListener(delegate { ShowVideoLength(videoClips[1]); });
        button3.onClick.AddListener(delegate { ShowVideoLength(videoClips[2]); });
        button4.onClick.AddListener(delegate { ShowVideoLength(videoClips[3]); ; });
    }

    // Update is called once per frame
    void Update()
    {
        //如果videoPlayer没有对应的视频texture,则返回屏保
        if (videoPlayer.texture == null)
        {
            rawImage.texture = pingBao;
            return;
        }
        //把VideoPlayerd的视频渲染到UGUI的RawImage
        rawImage.texture = videoPlayer.texture;
        ShowVideoTime();
    }

    /// <summary>
    /// 显示当前视频的时间
    /// </summary>
    private void ShowVideoTime()
    {
        // 当前的视频播放时间
       var currentHour = (int)videoPlayer.time / 3600;
       var currentMinute = (int)(videoPlayer.time - currentHour * 3600) / 60;
       var currentSecond = (int)(videoPlayer.time - currentHour * 3600 - currentMinute * 60);
        // 把当前视频播放的时间显示在 Text 上
        videoTimeText.text = string.Format("{0:D2}:{1:D2}:{2:D2}",
            currentHour, currentMinute, currentSecond);
        // 把当前视频播放的时间比例赋值到 Slider 上
        videoTimeSlider.value = (float)(videoPlayer.time / videoPlayer.clip.length);
    }

    /// <summary>
    /// 显示视频的总时长
    /// </summary>
    /// <param name="videos">当前视频</param>
    void ShowVideoLength(VideoClip videos)
    {
        videoPlayer.clip = videos;
        videoPlayer.Play();
        videoTimeSlider.gameObject.SetActive(true);
        var clipHour = (int)videoPlayer.clip.length / 3600;
        var clipMinute = (int)(videoPlayer.clip.length - clipHour * 3600) / 60;
        var clipSecond = (int)(videoPlayer.clip.length - clipHour * 3600 - clipMinute * 60);
        videoNameText.text = string.Format("{0:D2}:{1:D2}:{2:D2} ",
             clipHour, clipMinute, clipSecond);
    }

    /// <summary>
    /// 视频播放暂停
    /// </summary>
    public void PlayOrPause()
    {
        //如果视频片段不为空,并且视频画面没有播放完毕
        if (videoPlayer.clip != null && (ulong)videoPlayer.frame < videoPlayer.frameCount)
        {
            //如果视频正在播放
            if (videoPlayer.isPlaying)
            {
                playPauseButton.GetComponentInChildren<Text>().text = "播放";
                videoPlayer.Pause();
            }
            else
            {
                playPauseButton.GetComponentInChildren<Text>().text = "暂停";
                videoPlayer.Play();
            }
        }
    }

    void StopVideo()
    {
        videoPlayer.Stop();
        playPauseButton.GetComponentInChildren<Text>().text = "播放";
        videoTimeSlider.gameObject.SetActive(false);
        videoNameText.text = "";
        videoTimeText.text = "";
    }
}
#region 模块信息
// **********************************************************************
// Copyright (C) 2019 Blazors
// Please contact me if you have any questions
// File Name:             Director
// Author:                romantic
// WeChat||QQ:            at853394528 || 853394528 
// **********************************************************************
#endregion

using UnityEngine;
using UnityEngine.Video;
public delegate void PlayEndDel(bool isloop);
public class VideoController:MonoBehaviour  {
    public static VideoController instance;
    public static VideoController GetInstance(){
        if (instance == null)
        {
            var go = new GameObject();
            instance = go.AddComponent<VideoController>();
        }
        return instance;
    }
 
    public PlayEndDel playEndDel;
    private long stopFrame;
    private bool isLooping;
   /// <summary>
   /// 播放视频
   /// </summary>
   /// <param name="videoPlayer">当前视频</param>
   /// <param name="startFrame">起始帧</param>
   /// <param name="endFrame">结束帧</param>
   /// <param name="isLoop">是否循环</param>
   /// <param name="EndDel">结束回调</param>
    public void Play(VideoPlayer videoPlayer,long startFrame, long endFrame,bool isLoop, PlayEndDel EndDel)
    {
        videoPlayer.waitForFirstFrame = false;
        videoPlayer.sendFrameReadyEvents = true;
        videoPlayer.frame = startFrame;
        stopFrame = endFrame;
        isLooping = isLoop;
        videoPlayer.frameReady += TimeEvent;
        playEndDel += EndDel;
        videoPlayer.Play();
    }
    /// <summary>
    /// 时间回调(每一帧都会执行)
    /// </summary>
    /// <param name="videoPlayer">视频</param>
    /// <param name="f">视频当前的帧</param>
    void TimeEvent(VideoPlayer videoPlayer,long f) {
        if (videoPlayer.time * videoPlayer.frameRate >= stopFrame)
        {
            Debug.Log("播放到第" + videoPlayer.time* videoPlayer.frameRate + "帧");
            videoPlayer.Stop();
            playEndDel(isLooping);
        }
    }
}

进度控制脚本

#region 模块信息
// **********************************************************************
// Copyright (C) 2019 Blazors
// Please contact me if you have any questions
// File Name:             Director
// Author:                romantic
// WeChat||QQ:            at853394528 || 853394528 
// **********************************************************************
#endregion

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class SliderEvent :  MonoBehaviour, IDragHandler, IEndDragHandler
{
    public PlayVideo playVideo;        // 视频播放的脚本

    /// <summary>
    /// 给 Slider 添加开始拖拽事件
    /// </summary>
    /// <param name="eventData"></param>
    public void OnDrag(PointerEventData eventData)
    {
        playVideo.videoPlayer.Pause();
        /// 当前的 Slider 比例值转换为当前的视频播放时间
        playVideo.videoPlayer.time = playVideo.videoTimeSlider.value * playVideo.videoPlayer.clip.length;
    }

    /// <summary>
    /// 给 Slider 添加结束拖拽事件
    /// </summary>
    /// <param name="eventData"></param>
    public void OnEndDrag(PointerEventData eventData)
    {
        playVideo.videoPlayer.Play();
        playVideo.playPauseButton.GetComponentInChildren<Text>().text = "暂停";
    }

}

这个脚本功能为播放某段视频的任意帧段

#region 模块信息
// **********************************************************************
// Copyright (C) 2019 Blazors
// Please contact me if you have any questions
// File Name:             Director
// Author:                romantic
// WeChat||QQ:            at853394528 || 853394528 
// **********************************************************************
#endregion

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Video;

public class test : MonoBehaviour {
    VideoPlayer VideoPlayer;
    long startFrame = 100;//开始帧
    long endFrame = 100;//结束帧
    // Use this for initialization
    void Start () {
        VideoPlayer = gameObject.GetComponent<VideoPlayer>();
    }
	
	// Update is called once per frame
	void Update () {
        if (Input.GetKeyDown(KeyCode.Q))
        {
            Play(true);
        }
    }
    /// <summary>
    /// 开始播放视频
    /// </summary>
    void Play(bool isLoop)
    {
        VideoController.GetInstance().Play(VideoPlayer, startFrame, endFrame, true, EndOnComplete);
    }

    void EndOnComplete(bool isLoop)
    {
        //循环
        if (isLoop)
        {
            Play(false);
        }
        VideoController.GetInstance().playEndDel -= EndOnComplete;
    }
}

工程源码,插件资源地址:https://download.csdn.net/download/qq_37310110/10920054

猜你喜欢

转载自blog.csdn.net/qq_37310110/article/details/86502890