2017-08-14 197 views
0

我做了大量的研究,但是找不到適用於Unity3d/c#的合適解決方案。我正在使用Fove-HMD並想錄制/製作集成攝像頭的視頻。到目前爲止,我管理每個更新都拍攝了相機的快照,但我找不到將這些快照合併到視頻中的方法。有人知道轉換它們的方法嗎?還是有人能指出我正確的方向,我可以繼續研究?將Texture2D轉換爲視頻

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的第一部分僅用於查找和啓用相機。在更新方法中,我將每次更新都視爲視頻的快照。

當我「停止」更新方法後,我想將收集到的Texture2D對象轉換爲視頻。

在此先感謝

回答

0

我在這裏看到了兩種方法,一種是快速實施,髒,而不是適用於所有平臺,第二個困難,但很漂亮。兩者都依靠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紋理等較低級別的數據上進行操作。

+0

您的解決方案聽起來不錯。然而,FFMPEG似乎並不適用於團結。我已經嘗試過很多版本,但是不論是否支持c#版本,或者dll都無法識別。 – Pezl

+0

我已經使用FFMPEG與Unity,但通過使用自己的C++ DLL,從來沒有與純C#。你有沒有檢查過,如果你不混合32位和64位體系結構的DLL? AForge隨附32位FFMPEG,但Unity Editor通常爲64位(由於Unity 2017只有64位,Unity 5仍可以下載爲32位https://unity3d.com/get-unity/download/archive) – R2RT

+0

我玩過AForge,看起來我忘了Unity沒有提及'System.Drawing',其中定義了'Bitmap'。處理它甚至更加骯髒(將System.Drawing.dll複製到Plugins文件夾),所以我寧願跳過該選項 – R2RT