DirectShow
От: SanyaVB  
Дата: 30.07.10 14:39
Оценка:
Есть устройство захвата AVer. Подключил к нему видеокарт через HDMI. Мне нужно получить кадр по вызову метода. Поэтому использую фильтр SampleGrabber.
Граф простой: AVerMedia BDA Analog Xbar Secondary -> AVerMedia BDA Analog Capture Secondary -> SampleGrabber -> NullRenderer. (Без фильтра NullRenderer тоже работает).

SampleGrabber настраиваю как предлагали в MSDN:

private HRESULT ConfigureSampleGrabber(ref ISampleGrabber isampleGrabber)
{
   HRESULT result= HRESULT.S_OK;
   AMMediaType mediatype = new AMMediaType();
   mediatype.majorType = MediaType.Video;
   mediatype.subType = MediaSubType.RGB24;
   mediatype.formatType = FormatType.VideoInfo;
   result = (HRESULT)isampleGrabber.SetMediaType(mediatype);
   DsUtils.FreeAMMediaType(mediatype);
   mediatype = null;
   return result;
}

Сразу скажу что работаю с разрешением 1280x720.
Все работает — картинку получаю в разрешение 1280x720. Проблема в производительности. Процессор грузит на 100% даже если я не пытаюсь получить кадр. Сделал следующий эксперимент: переписал метод ConfigureSampleGrabber

private HRESULT ConfigureSampleGrabber(ref ISampleGrabber isampleGrabber)
{
   HRESULT result= HRESULT.S_OK;
   AMMediaType mediatype = new AMMediaType();
   mediatype.majorType = MediaType.Video;
   //mediatype.subType = MediaSubType.RGB24;
   mediatype.subType = MediaSubType.YVYU;
   mediatype.formatType = FormatType.VideoInfo;
   result = (HRESULT)isampleGrabber.SetMediaType(mediatype);
   DsUtils.FreeAMMediaType(mediatype);
   mediatype = null;
   return result;
}


Логично что устройство получает в формате YVYU (или YUYV и т.д.) и поэтому конвертации в RGB24 не происходит в этом случае. В результате получил загрузку процессора 50%. Хороший результат, даже программа поставляемая с устройством AVer MediaCenter грузила процессор на этом разрешении также. Но вот как получить картинку из формата YVYU я не знаю.

Как я понимаю когда граф запускается, он начинает гнать в память кадры. скорость этих кадров установлена на 59 f/sec. Решил установить скорость для наглядности на 2 f/sec. и заменил фильтр NullRenderer на VideoRenderer. Функция SetFormat(mediaType); интерфейса IAMStreamConfig с такими параметрами вернула S_OK, но визуально там явно было больше 24 кадров в секунду (мышка хорошо бегала). Попробовал установить 15 f/sec такая же тема((( Через GraphEdit меньше 50 f/sec поставить не удалось.

Подскажите пожалуйста как можно добиться большей производительности. Если кто подскажет как конвертировать YVYU в RGB24 буду очень признателен (таким способом я буду явно конвертировать с меньшей частотой чем 59 f/sec, что на мой взгляд получу загрузку процессора меньше чем 100%)

Помогите пожалуйста, сижу над этим уже месяц
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.