我正在使用 FFmpeg 库通过 UDP 以最小的延迟接收和解码 H.264/MPEG-TS(这是 MediaElement 无法处理的)。
在一个专用的 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 将帧放入 _writeableBitmap.BackBuffer 并按帧更新:
Dispatcher.Invoke((Action)delegate()
{
_writeableBitmap.Lock();
});
try
{
ret = FFmpegInvoke.sws_scale(...);
}
finally
{
Dispatcher.Invoke((Action)delegate()
{
_writeableBitmap.AddDirtyRect(_rect);
_writeableBitmap.Unlock();
});
}
遇到几乎相同的性能问题(使用各种 DispatcherPriority 进行测试)。
任何帮助将不胜感激。