Отображение живого видео из исходного несжатого байтового источника в формах C #: WPF и Win - PullRequest
4 голосов
/ 07 октября 2009

У меня есть живой 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.

Ответы [ 2 ]

1 голос
/ 07 октября 2009

Мой VideoRendererElement, хотя и очень эффективный, использует некоторые хакеры для его работы. Вы также можете поэкспериментировать с WriteableBitmap в .NET 3.5 SP1.

Также InteropBitmap очень быстр. Гораздо эффективнее, чем WB, поскольку он не имеет двойной буферизации. Хотя это может быть предметом разрыва видео.

1 голос
/ 07 октября 2009

Дальнейший поиск в Google дал следующее:

http://www.codeplex.com/VideoRendererElement

, который я сейчас изучаю, но, возможно, здесь правильный подход. Конечно, дальнейшие мысли / предложения по-прежнему очень приветствуются.

...