unity 录制游戏内视频(1)

1,调用的api可以制作任何类型的视频类型(包含快照,and VR视频)

  1 using System.Collections;
  2 using System.Collections.Generic;
  3 using System.IO;
  4 using UnityEngine;
  5 
  6 public class ShotVideo : MonoBehaviour
  7 {
  8     public float ScreenShotHeight = 500;
  9     public float ScreenShotWith = 500;
 10     public string PicSavePath = "MyPhoto";
 11 
 12 
 13     [SerializeField]
 14     private Texture2D picture;
 15     private RenderTexture renderBuffer;
 16     private string Path = "";
 17     private bool IsShot = false;
 18     private static int count = 0;
 19 
 20 
 21     public string RecordPath = "";
 22     private bool IsRecord = false;
 23     private static int RecordCount= 0;
 24 
 25     // Use this for initialization
 26     void Start()
 27     {
 28         picture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGBA32, false, true);
 29         Path = Application.dataPath + "/" + PicSavePath;
 30         //Debug.LogError(Path);
 31         SetPath(Path);
 32         SetPath(RecordPath);
 33 
 34     }
 35 
 36     public void SetPath(string _s)
 37     {
 38         //path
 39         if (Directory.Exists(_s))
 40         {
 41             FileAttributes attr = File.GetAttributes(_s);
 42             if (attr == FileAttributes.Directory)
 43                 Directory.Delete(_s, true);
 44             else
 45                 File.Delete(_s);
 46         }
 47         if (!Directory.Exists(_s))
 48             Directory.CreateDirectory(_s);
 49     }
 50 
 51     // Update is called once per frame
 52     void Update()
 53     {
 54         if (Input.GetKeyDown(KeyCode.Space) && !IsShot)
 55             ShotScreen();
 56         if (Input.GetKeyDown(KeyCode.R))
 57             Record();
 58         if (Input.GetKeyDown(KeyCode.S))
 59             StopRecord();
 60 
 61     }
 62 
 63     public bool StartRecord()
 64     {
 65         IsRecord = true;
 66         return IsRecord;
 67     }
 68     public bool StopRecord()
 69     {
 70         IsRecord = false;
 71         return IsRecord;
 72     }
 73 
 74     public void Record()
 75     {
 76         StartRecord();
 77         StartCoroutine(CaptureVideo());
 78     }
 79 
 80     public void ShotScreen()
 81     {
 82         IsShot = true;
 83         StartCoroutine(CaptureScreen());
 84     }
 85     
 86 
 87     public IEnumerator CaptureScreen()
 88     {
 89         yield return new WaitForEndOfFrame();
 90         picture.ReadPixels(
 91             new Rect(0, 0, Screen.width, Screen.height), 0, 0
 92             );
 93 
 94         picture.Apply();
 95         var bytes = picture.EncodeToPNG();
 96         File.WriteAllBytes(Path + "/" + count.ToString() + ".png", bytes);
 97         count++;
 98         Debug.Log("Fin the work gender texture");
 99 
100         yield return new WaitForSeconds(0.1f);
101         IsShot = false;
102     }
103 
104     public IEnumerator CaptureVideo()
105     {
106         while (IsRecord)
107         {
108             picture.ReadPixels(
109           new Rect(0, 0, Screen.width, Screen.height), 0, 0
110           );
111 
112             picture.Apply();
113             var bytes = picture.EncodeToPNG();
114             File.WriteAllBytes(Path + "/" + RecordCount.ToString() + ".png", bytes);
115             RecordCount++;
116             Debug.Log("Fin the work CaptureVideo texture "+ RecordCount);
117             yield return new WaitForEndOfFrame();
118         }
119       
120     }
121 
122 }

一个视频的组成可以看成 每秒24 帧的连续图像组成。

后期将调用ffmpeg的库将图片拼接成视频

posted @ 2018-06-07 09:17  杨小行  阅读(4974)  评论(1编辑  收藏  举报