2010-02-05 121 views
1

我有一个摄像头捕捉应用程序,我试图在我的WPF UI中实现视频预览。捕获发生在C++ DLL中。我有一个最新的解决方案,但我不太满意。主要目标是UI中的视频预览不会干扰C++ DLL,因为它必须压缩视频帧并将它们写入磁盘。我将无法显示每一帧,因为压缩相当CPU密集型。在C中的视频预览#

我目前的视频预览的解决方案是:

  • 的图像控制在我的窗口中使用,它的来源属性是数据绑定到一个的BitmapSource称为VideoPreviewSource

  • 我建立了一个系统.Threading.TimerCallback更新我的预览。定时器回调函数调度到一个可以更新UI的线程(使用this.Dispatcher.BeginInvoke),它调用UpdatePreview()向C++ DLL询问视频帧,它调用UpdatePreview()

  • UpdatePreview对DLL的调用将图像的原始数据放入byte [] _rawImageData中,我在窗口的构造函数中分配一次。然后UpdatePreview()将VideoPreviewSource设置为:BitmapSource.Create(width,height,96,96,pf,null,_rawImageData,width * 4);最后调用OnPropertyChanged(“VideoPreviewSource”)。

看起来好像如果我让计时器更频繁,垃圾收集被调用的次数更少,它基本上看起来像内存泄漏。

任何更好的方法来预览视频?

+0

您需要释放C++ DLL为您提供的数据吗? – 2010-02-05 22:46:18

回答

0

This InteropBitmapRenderer我写的可能会帮助你。虽然我把它硬编码为RGBA(32位)。不知道它如何与RGB24协同工作,因为我认为WPF 3.51之前版本在24位版本方面存在问题。

如果您的摄像头支持DirectShow中,你可以使用我WPF MediaKit并使用VideCaptureElement显示一个摄像头。