2015-06-23 87 views
5

如何將Kinect中的Kinect顏色視頻保存爲流式Kinect SDK 2中的Kinect彩色視頻? ?如何在WPF中使用Kinect SDK 2將Kinect SDK 2中的Kinect顏色視頻保存爲流式視頻

我讀此鏈接:Save Kinect's color camera video stream in to .avi video

+0

我們可以使用VideoWriter班組長和WriteFrame功能emgucv保存視頻爲AVI文件,但這個功能不是流, –

+0

我想開發的程序,可以節省不斷Kinect的顏色數據源文件硬而不是RAM,因爲內存不夠用 –

回答

4

對於一個項目,我不得不這樣做。我所做的事情可能無法滿足你的所有要求,但它可能會給你一個想法。起初,我使用順序命名將本地驅動器中的每個彩色幀圖像保存起來。然後用ffmpeg將這些連續圖像轉換爲視頻文件,在我的情況下是mp4視頻,而不是avi。

爲了節省彩色圖像幀順序,則可以編碼像下面,

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using Microsoft.Kinect; 
using System.IO; 
using System.Drawing; 
using System.Drawing.Imaging; 

namespace Kinect_Video_Recorder 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     KinectSensor ks; 
     ColorFrameReader cfr; 
     byte[] colorData; 
     ColorImageFormat format; 
     WriteableBitmap wbmp; 
     BitmapSource bmpSource; 
     int imageSerial; 

     public MainWindow() 
     { 
      InitializeComponent(); 
      ks = KinectSensor.GetDefault(); 
      ks.Open(); 
      var fd = ks.ColorFrameSource.CreateFrameDescription(ColorImageFormat.Bgra); 
      uint frameSize = fd.BytesPerPixel * fd.LengthInPixels; 
      colorData = new byte[frameSize]; 
      format = ColorImageFormat.Bgra; 
      imageSerial = 0; 

      cfr = ks.ColorFrameSource.OpenReader(); 
      cfr.FrameArrived += cfr_FrameArrived; 
     } 

     void cfr_FrameArrived(object sender, ColorFrameArrivedEventArgs e) 
     { 
      if (e.FrameReference == null) return; 

      using (ColorFrame cf = e.FrameReference.AcquireFrame()) 
      { 
       if(cf == null) return; 
       cf.CopyConvertedFrameDataToArray(colorData, format); 
       var fd = cf.FrameDescription; 

       // Creating BitmapSource 
       var bytesPerPixel = (PixelFormats.Bgr32.BitsPerPixel)/8; 
       var stride = bytesPerPixel * cf.FrameDescription.Width; 

       bmpSource = BitmapSource.Create(fd.Width, fd.Height, 96.0, 96.0, PixelFormats.Bgr32, null, colorData, stride); 

       // WritableBitmap to show on UI 
       wbmp = new WriteableBitmap(bmpSource); 
       kinectImage.Source = wbmp; 

       // JpegBitmapEncoder to save BitmapSource to file 
       // imageSerial is the serial of the sequential image 
       JpegBitmapEncoder encoder = new JpegBitmapEncoder(); 
       encoder.Frames.Add(BitmapFrame.Create(bmpSource)); 
       using (var fs = new FileStream("./img/" + (imageSerial++) + ".jpeg", FileMode.Create, FileAccess.Write)) 
       { 
        encoder.Save(fs); 
       }  
      } 
     } 
    } 
} 

上面的例子以JPEG格式保存圖像。如果您需要將其保存爲png格式,請使用PngBitmapEncoder

現在我們已將順序圖像保存在硬盤驅動器中。要將這些連續圖像轉換爲視頻文件,您可以使用ffmpeg。您也可以使用Aforge.net。但我從來沒有用過它。在我的情況下,我從下面的C#程序中調用了ffmpeg.exe進程。

Process.Start("ffmpeg.exe", "-framerate 10 -i ./img/%d.jpeg -c:v libx264 -r 30 -pix_fmt yuv420p kinect_video.mp4");

注:

  1. 讓您的構建目標64。這會增加程序的內存限制。
  2. 我已經編寫了一個基本的implementation這個。你可以看看你是否想要。

希望它能幫助:)

+1

我用你的想法親愛的Rafaf Tahsin,你的代碼是慢慢的,因爲這個代碼:'wbmp = new WriteableBitmap(bmpSource);'如果你刪除這段代碼並使用'kinectImage。 Source = bmpSource;'代替那個,這很好 –

+0

這裏有一個大問題,這就是語音,我改變了我的問題:如何錄製和保存語音和彩色視頻作爲它們匹配在一起的流? –

+0

我不知道如何從Kinect v2同步保存音頻和視頻。我想建議你就此提出一個新問題,希望有人會提供幫助。謝謝 –