版权声明:转发,使用请留言告知 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;
}
}