如何將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
如何將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
對於一個項目,我不得不這樣做。我所做的事情可能無法滿足你的所有要求,但它可能會給你一個想法。起初,我使用順序命名將本地驅動器中的每個彩色幀圖像保存起來。然後用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");
注:
希望它能幫助:)
我用你的想法親愛的Rafaf Tahsin,你的代碼是慢慢的,因爲這個代碼:'wbmp = new WriteableBitmap(bmpSource);'如果你刪除這段代碼並使用'kinectImage。 Source = bmpSource;'代替那個,這很好 –
這裏有一個大問題,這就是語音,我改變了我的問題:如何錄製和保存語音和彩色視頻作爲它們匹配在一起的流? –
我不知道如何從Kinect v2同步保存音頻和視頻。我想建議你就此提出一個新問題,希望有人會提供幫助。謝謝 –
我們可以使用VideoWriter班組長和WriteFrame功能emgucv保存視頻爲AVI文件,但這個功能不是流, –
我想開發的程序,可以節省不斷Kinect的顏色數據源文件硬而不是RAM,因爲內存不夠用 –