将Texture2D转换为视频

时间:2017-08-14 14:50:50

标签: c# unity3d video webcam texture2d

我做了很多研究,但我找不到适合Unity3d / c#的解决方案。我使用的是Fove-HMD,想要录制/制作集成摄像头的视频。到目前为止,我管理每个更新以拍摄相机的快照,但我找不到将这些快照合并到视频中的方法。有人知道转换它们的方法吗?或者有人能指出我正确的方向,我可以继续研究吗?

public class FoveCamera : SingletonBase<FoveCamera>{

 private bool camAvailable;
 private WebCamTexture foveCamera;
 private List<Texture2D> snapshots;

 void Start ()
 {
     //-------------just checking if webcam is available
     WebCamDevice[] devices = WebCamTexture.devices;
     if (devices.Length == 0)
     {
         Debug.LogError("FoveCamera could not be found.");
         camAvailable = false;
         return;
     }

     foreach (WebCamDevice device in devices)
     {
         if (device.name.Equals("FOVE Eyes"))
             foveCamera = new WebCamTexture(device.name);//screen.width and screen.height 
     }

     if (foveCamera == null)
     {
         Debug.LogError("FoveCamera could not be found.");
         return;
     }
     //-------------camera found, start with the video

     foveCamera.Play();
     camAvailable = true;
 }

 void Update () {
     if (!camAvailable)
     {
         return;
     }

     //loading snap from camera
     Texture2D snap = new Texture2D(foveCamera.width,foveCamera.height);
     snap.SetPixels(foveCamera.GetPixels());
     snapshots.Add(snap);
 }
}

到目前为止代码工作正常。 Start-Method的第一部分仅用于查找和启用相机。在更新方法I中,我将每次更新都视为视频的快照。

在我&#34;停止&#34; Update-Method,我想将收集的Texture2D对象转换为视频。

提前致谢

1 个答案:

答案 0 :(得分:0)

我在这里看到两种方法,一种是快速实现,脏的而不适用于所有平台,第二种方法更难但很漂亮。两者都依赖于FFMPEG。

1)将每一帧保存到图像文件(snap.EncodeToPNG())中,然后调用FFMPEG从图像(FFmpeg create video from images)创建视频 - 由于许多磁盘操作而变慢。

2)通过AForge中实现的包装器使用FFMPEG,并为其VideoFileWriter类提供您拥有的图像。 Image sequence to video stream?

问题在于它使用System.Bitmap,因此为了将Texture2D转换为Bitmap,您可以使用:How to create bitmap from byte array?

所以你最终得到的结果是:

Bitmap bmp;
Texture2D snap;
using (var ms = new MemoryStream(snap.EncodeToPNG()))
{
    bmp = new Bitmap(ms);
}
vFWriter.WriteVideoFrame(bmp);

这两种方法都不是最快的方法,所以如果性能是一个问题,你可能想要操作较低级别的数据,如DirectX或OpenGL纹理。