gpt4 book ai didi

wpf - 在 WPF 中呈现非托管视频帧的最有效方法是什么?

转载 作者:行者123 更新时间:2023-11-28 21:40:01 25 4
gpt4 key购买 nike

我正在使用 FFmpeg 库通过 UDP 以最小延迟(MediaElement 无法处理)接收和解码 H.264/MPEG-TS。

在专用的 FFmpeg 线程上,我正在提取 PixelFormats.Bgr32 视频帧进行显示。我已经尝试过 InteropBitmap:

_section = CreateFileMapping(INVALID_HANDLE_VALUE, IntPtr.Zero, PAGE_READWRITE, 0, size, null);
_buffer = MapViewOfFile(_section, FILE_MAP_ALL_ACCESS, 0, 0, size);
Dispatcher.Invoke((Action)delegate()
{
_interopBitmap = (InteropBitmap)Imaging.CreateBitmapSourceFromMemorySection(_section, width, height, PixelFormats.Bgr32, (int)size / height, 0);
this.Source = _interopBitmap;
});

然后每帧更新:

Dispatcher.Invoke((Action)delegate()
{
_interopBitmap.Invalidate();
});

但性能很差(跳帧、高 CPU 使用率等)。

我也试过 WriteableBitmap:FFmpeg is placing frames in _writeableBitmap.BackBuffer and per frame update:

Dispatcher.Invoke((Action)delegate()
{
_writeableBitmap.Lock();
});
try
{
ret = FFmpegInvoke.sws_scale(...);
}
finally
{
Dispatcher.Invoke((Action)delegate()
{
_writeableBitmap.AddDirtyRect(_rect);
_writeableBitmap.Unlock();
});
}

遇到几乎相同的性能问题(使用各种 DispatcherPriority 进行测试)。

任何帮助将不胜感激。

最佳答案

我知道为时已晚,但我为那些正在努力解决这个问题的人们写下这个答案。最近,我使用 InteropBitmap 完成了一个渲染项目,在该项目中,我能够在核心 i7 1.6 Ghz CPU +8Gb RAM 笔记本电脑上同时在 WPF 窗口中运行大约 16 个媒体播放器组件,帧率为 25fps。以下是我对性能调整采取的技巧:

首先,我没有让 GC 处理我的视频数据包。我在需要实例化视频帧的任何地方使用 Marshal.AllocateHGlobal 分配内存,并在完成渲染后立即使用 Marshal.FreeHGlobal 进行处理。

其次,我为每个单独的媒体播放器创建了一个调度程序线程。有关更多信息,请阅读“https://blogs.msdn.microsoft.com/dwayneneed/2007/04/26/multithreaded-ui-hostvisual/”。

第三,为了纵横比和调整大小,我使用了原生的 EmguCV 库。这个库在性能上帮助了我很多,而不是使用位图和覆盖等等。

我认为这些步骤可以帮助每个需要使用 InteropBitmap 等手动渲染的人。

关于wpf - 在 WPF 中呈现非托管视频帧的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19905831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com