Я использую библиотеку FFmpeg для приема и декодирования H.264/MPEG-TS через UDP с минимальным латентностью (что-то MediaElement не может обрабатывать).Каков наиболее эффективный способ визуализации неуправляемых видеокадров в WPF?
На выделенном потоке 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();
});
Но производительность очень плохо (пропуск кадров, высокая загрузка процессора и т.д.).
Я также попытался 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).
Любая помощь будет принята с благодарностью.