Как вы можете догадаться из названия вопроса, мы должны декодировать и отображать несколько (например, восемь) видео в формате H.264 одновременно (и синхронизировать их все время, но это уже другой вопрос в другой раз),Видео, как правило, со скоростью 25 кадров в секунду с разрешением 640x480.
Я собираюсь предоставить немного фона, прежде чем я пойму суть проблемы.
Функция должназапекаться в довольно большое приложение C # 3.5 (WinForms).Видео будут занимать прямоугольники в приложении - управляемый код должен быть в состоянии указать, где каждое видео рисуется, а также его размер.
Мы получаем пакеты H264 в C # и запускаем их в собственный декодер H264чтобы получить данные изображения YUV12.
Ранняя попытка состояла в том, чтобы преобразовать изображения YUV12 в RGB24 и передать их BitBlt в HWND, переданный в собственный код из C #.Несмотря на то, что все функции BitBlt'а работали, они должны были происходить в потоке пользовательского интерфейса, что приводило к его замедлению при отображении более пары видео (на 2.6 GHZ core 2 duo).
Текущая попытка ускоряется на однуthread-per-cpu-core при запуске и загрузке балансирует декодирование / отображение видео между этими потоками.Производительность этого потрясающая (мне кажется, что просмотр диспетчера задач гораздо интереснее, чем показ видео).В пользовательском интерфейсе это оставляет желать лучшего.
За миллисекунду, которую мы начали рисовать в HWND, созданном в потоке пользовательского интерфейса (например, панели, закрепленной в элементе управления WinForms) из потока, не являющегося пользовательским интерфейсом, мыиз-за неконтролируемости потоков WinForms начал получать всевозможные забавные действия.Это привело к тому, что мы создали HWND в нативном коде и обратились к ним, причем C # предоставляет прямоугольники, к которым они должны быть обращены в экранных координатах.
Гах!CanOfWorms.Open ().
Проблема: Когда приложение C # получает фокус, оно переходит в начало Z-порядка и скрывает окна видео.Решение. Поместите окна видео всегда сверху.
Проблема: Когда пользователь переключается на другое приложение, окна видео все еще находятся сверху.Решение: Определите активацию и деактивацию приложения C # и соответственно отобразите / скрыте окна видео.
Проблема: пользователь говорит: «Я хочу, чтобы мои видео воспроизводились на одном мониторе, а я редактировал документ Word на другом!»Решение: Скажите пользователю, чтобы он заткнулся, и Word все равно отстой.
Проблема: меня уволили.
и т. Д.и т.д.
Полагаю, суть проблемы в том, что у нас есть HWND, созданные в потоке, не являющемся пользовательским интерфейсом, и мы хотим «смоделировать» те, которые встроены в приложение C #./ предложения?Полностью ли я здесь пообедаю?
Я более чем готов принять совершенно другой подход, если таковой существует (Этот проект потребовал много обучения - выигрыш в лотерею имел бы большую вероятность, чем я выбраллучший подход на каждом шагу вдоль дороги).