我做了很多研究,但是找不到适合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);
}
}
该代码到目前为止有效。启动方法的第一部分仅用于查找和启用摄像机。在“更新方法”中,我将每次更新视频的快照。
“停止”更新方法后,我想将收集的Texture2D对象转换为视频。
提前感谢
我在这里看到两种方法,一种方法实现速度快,很脏,并且不适用于所有平台,第二种方法更难但很漂亮。两者都依赖FFMPEG。
1)将每一帧保存到图像文件(snap.EncodeToPNG()
)中,然后调用FFMPEG从图像创建视频(FFmpeg create video from images)-由于许多磁盘操作,速度很慢。
2)通过AForge中实现的包装器使用FFMPEG,并为其VideoFileWriter
类提供您拥有的图像。Image sequence to video stream?
问题在于它使用了System.Bitmap
,因此,为了将Texture2D转换为位图,您可以使用: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纹理之类的较低级别的数据进行操作。
由于我无法评论(doh),所以这里有一些代码的链接,这些代码可以转换为位图,这将有助于实现上述FFMPEG。 https://gist.github.com/DashW/74d726293c0d3aeb53f4