Есть устройство захвата 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%)
Помогите пожалуйста, сижу над этим уже месяц