我做了很多研究,但我找不到适合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对象转换为视频。
提前致谢
答案 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纹理。