Обратный вызов ISampleGrabber не вызывается

Я использую DirectShow.Net и пытаюсь реализовать ISampleGrabberCB в классе.

Чтобы настроить Grabber на графике, я следую этому контрольному списку:

  1. Создайте объект SampleGrabber

  2. Определите формат MediaType (AMMediaType: Video, Rgb, VideoInfo) и задайте его в объекте SampleGrabber. HRESULT равен 0, поэтому я думаю, что все в порядке.

  3. Я установил обратный вызов с помощью sampleGrabber.SetCallback(this, 0). Я передаю «это», потому что ISampleGrabber реализован и определен в самом классе; второй параметр равен 0, потому что я хочу, чтобы вызывался метод SampleCB.

  4. Наконец, я добавляю фильтр к графику. HRESULT снова равен 0.

Однако метод ISampleGrabber.SampleCB не вызывается.

Есть ли у вас какие-либо идеи о причине этого плохого поведения?

[Изменить]

Я узнал, что здесь происходит! Но все же мне нужна помощь. Обе веб-камеры, которыми я владею, возвращают видеоформат подтипа YUY2. Как указано выше, код, который я использую, устанавливает для MediaType значение RGB24. Во время выполнения я вижу, что HResult равен 0, поэтому все в порядке. Но поскольку они «несовместимы», Sample Callback никогда не вызывается. Если я удалю явное определение подтипа, будет выполнен обратный вызов. Однако я получаю кадр YUY2; это не действительный растровый рисунок, и по этой причине он выглядит «поврежденным», «искаженным».

На данный момент я хотел бы знать, как я могу успешно принудительно использовать формат RGB24 или как я могу преобразовать видеокадр в формат RGB24.

Я провел довольно много времени в Google, пытаясь найти правильный ответ, но мне не повезло.

Любая идея?

Ваше здоровье. Джанлука.


person Anthares    schedule 13.09.2011    source источник
comment
@Goz: код обширен и разделен на несколько функций. Какую часть вы хотели бы увидеть?   -  person Anthares    schedule 16.09.2011
comment
Ну, в свете вашего редактирования, вероятно, было бы неплохо увидеть часть, где вы подключаете фильтры.   -  person Goz    schedule 16.09.2011


Ответы (2)


Вы никогда не упоминаете, что подключаете Sample Grabber к графу, а это, очевидно, необходимо. Поскольку в какой-то момент у вас есть обратный вызов, вы, конечно, каким-то образом подключаете его, и все же, когда вы устраняете неполадки в своем медиаконвейере, то, как вы подключаетесь, и эффективная топология графа фильтра — это первое, что вы хотите проверить.

24-битный подтип RGB является своего рода «общим знаменателем» типов мультимедиа, поэтому вы почти всегда можете получить его на граббере сэмплов. Чтобы достичь этого, вы инициализируете формат захвата сэмпла с основным типом и подтипом. Однако вам не нужно делать тип формата. Декодеры для RGB 24 будут предоставлены автоматически.

В общем, если что-то не работает, вы хотите знать топологию, которую вы в конечном итоге получите, и Sample Grabber нуждается в правильной инициализации.

person Roman R.    schedule 29.07.2013

Вам нужно добавить преобразователь YUY2 в RGB.

Найдите набор Color Converter DSP. входной контакт на YUY2 и установите выходной контакт на RGB32. После этого добавьте захват сэмплов.

Поскольку приведенный выше фильтр является фильтром DMO, вам необходимо использовать Оболочка DirectShow DMO. По ссылке есть хороший пример его использования.

person Goz    schedule 16.09.2011
comment
Спасибо за ответ! Делая первые шаги в DirectShow, я не знаю, как делать то, что вы говорите. Не могли бы вы указать какую-нибудь ссылку, которая могла бы мне помочь, или дать мне какой-нибудь фрагмент? Заранее спасибо! - person Anthares; 16.09.2011
comment
@Джанлука Колуччи: Не знаю, что делать? - person Goz; 16.09.2011
comment
Мне удалось заставить его работать с: grpBuilder.RenderStream(PinCategory.Capture, MediaType.Video, this.capDev, null, (IBaseFilter)smpGrabber). Без него граббер не подключался, да и вообще не понимаю как он работал. Ниже у меня есть: hr = grpBuilder.RenderStream(PinCategory.Preview, MediaType.Video, this.capDev, null, Renderer); Оно работает. Но так ли это концептуально? - person Anthares; 19.09.2011