У меня есть живой 16-битный видеопоток серой шкалы, который проталкивается через кольцевой буфер в памяти в виде необработанного несжатого байтового потока (2 байта на пиксель, 2 ^ 18 пикселей / кадр, 32 кадра / с) , (Это с камеры научного уровня, через фрейм-граббер PCI). Я хотел бы сделать некоторую простую обработку видео (обрезать динамический диапазон, раскрасить, добавить наложения) и затем показать его в окне, используя C #.
У меня это работает с использованием Windows Forms & GDI (для каждого кадра создайте объект Bitmap, запишите необработанные значения 32-битных пикселей RGB на основе моих шагов постобработки, а затем нарисуйте кадр с помощью класса Graphics). Но при этом используется значительная часть процессора, которую я хотел бы использовать для других целей. Поэтому я заинтересован в использовании WPF для отображения видео с GPU-ускорением. (Я также хотел бы начать использовать WPF для его привязки данных и функций макета.)
Но я никогда раньше не использовал WPF, поэтому не уверен, как к этому подойти. Большая часть того, что я нахожу в Интернете о видео и WPF, включает чтение сжатого видеофайла с диска (например, WMV) или получение потока с камеры бытового уровня с использованием слоя драйверов, который Windows уже понимает. Так что это, кажется, не применимо здесь (но поправьте меня, если я ошибаюсь по этому поводу).
Итак, мои вопросы:
Существует ли простой, основанный на WPF способ воспроизведения видео из необработанных несжатых байтов в памяти (даже если это просто 8-битная шкала серого или 24-битный RGB)?
Нужно ли мне создавать фильтры DirectShow (или другие вещи DirectShow / Media Foundation-ish), чтобы заставить постобработку работать на GPU?
Также приветствуются любые общие советы / предложения по документации, примерам, блогам и т. Д., Которые соответствуют этим задачам. Спасибо!
Продолжение: После некоторых экспериментов я обнаружил, что WriteableBitmap
достаточно быстр для моих нужд и чрезвычайно прост в использовании: просто вызовите WritePixels()
и любые Image
элементы управления, связанные с это обновит себя. InteropBitmap
с отображенными в память разделами заметно быстрее, но мне пришлось написать p / вызывает kernel32.dll, чтобы использовать его в .NET 3.5.