1

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

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

  • 我的窗口中使用了一个 Image 控件,它的 Source 属性数据绑定到一个名为 VideoPreviewSource 的 BitmapSource

  • 我设置了一个 System.Threading.TimerCallback 来更新我的预览。计时器回调函数分派到一个线程,该线程可以更新 UI(使用 this.Dispatcher.BeginInvoke),该线程调用 UpdatePreview()

  • UpdatePreview() 向 C++ DLL 请求视频帧。对 DLL 的调用将图像的原始数据放入 byte[] _rawImageData,我在窗口的构造函数中分配了一次。

  • UpdatePreview() 然后将 VideoPreviewSource 设置为:BitmapSource.Create(width, height, 96, 96, pf, null, _rawImageData, width * 4); 最后 OnPropertyChanged("VideoPreviewSource") 被调用。

似乎如果我让计时器更频繁,垃圾收集的调用频率就会降低,而且基本上看起来像是内存泄漏。

有更好的视频预览方法吗?

4

2 回答 2

0

我尝试了一个名为 Ozeki SIP SDK 的 SDK,以下http://www.voip-sip-sdk.com/p_93-introduction-to-ozeki-voip-sip-sdk-voip.html提供了有关如何制作视频的信息称呼。

希望我能帮助你。

问候

于 2012-03-21T09:43:37.853 回答
0

我写的这个InteropBitmapRenderer可能会对你有所帮助。虽然我对 RGBA(32 位)进行了硬编码。不确定它如何与 RGB24 一起工作,因为我认为 WPF pre-3.51 存在 24 位问题。

如果您的网络摄像头支持 DirectShow,您可以使用我的WPF MediaKit并使用 VideCaptureElement 来显示网络摄像头。

于 2010-02-07T01:46:22.150 回答