我有一个网络摄像头捕获应用程序,我正在尝试在我的 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") 被调用。
似乎如果我让计时器更频繁,垃圾收集的调用频率就会降低,而且基本上看起来像是内存泄漏。
有更好的视频预览方法吗?