ISampleGrabber обратный вызов не вызывается - PullRequest
1 голос
/ 13 сентября 2011

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

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

  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, пытаясь найти правильный ответ, но мне не повезло.

Есть идеи?

Приветствия. Джанлука.

Ответы [ 2 ]

1 голос
/ 29 июля 2013

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

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

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

0 голосов
/ 16 сентября 2011

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

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

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

...