2017-02-03 25 views
2

Я занимаюсь разработкой потокового приложения для камеры USB с использованием технологии MediaFoundation SourceReader. Камера имеет поддержку USB3.0 и дает 60 кадров в секунду для разрешения видеоформата MJPG 1080p.Как использовать Intel MJPEG Decoder MFT в MediaFoundation SourceReader для приложения Window Desktop?

Я использовал программное обеспечение MJPEG Decoder MFT для преобразования MJPG в кадры YUY2, а затем преобразован в рамку RGB32 для рисования на окне. Вместо 60fps я могу отображать только 30 кадров в секунду при использовании этого программного декодера. Я опубликовал вопрос на этом сайте и получил предложение использовать Intel MJPEG Decoder MFT для решения проблемы с кадром.

я столкнулся ошибка 0xC00D36B5 - MF_E_NOTACCEPTING при вызове IMFTransform :: ProcessInput() метода. Чтобы решить эту ошибку, MSDN предложила использовать интерфейс IMFTranform асинхронно. Итак, я использовал интерфейс IMFMediaEventGenerator для GetEvent для каждого примера ввода/вывода. Успешно, я могу обработать только один входной образец, а затем непрерывно. IMFMediaEventGenerator :: GetEvent() возвращает MF_E_NO_EVENTS_AVAILABLE ошибка (GetEvent() синхронно).

Я пытался настроить асинхронную функцию обратного вызова для SourceReader, а также IMFTransform но MFAsyncCallback :: Invoke метод не вызывающую, поэтому я планировал использовать метод GetEvent.

Я ничего не пропустил? Если Да, Кто-то помогает мне использовать аппаратный декодер Intel в моем проекте?

+0

Вы сначала попытались собрать топологию в topoedit? – Mgetz

+0

Благодарим вас за ответ, Mgetz.The Камера поддерживает формат видео YUY2 и MJPG. Первоначально камера воспроизводит видеоформат YUY2 и ему необходимо изменить формат MJPG. Я знаю, как построить график в DirectShow. Я не знал, как переключиться с формата YUY2 на MJPEG. Не могли бы вы рассказать мне, как собрать топологию для формата MJPG? Более того, я добавил этот декодер в топологию MediaSession, все получило успех и получило 0XC00D5212 (MF_E_TOPO_CODEC_NOT_FOUND) в этом случае. – Abi

+0

Следовательно, рекомендуется попробовать использовать утилиту topoedit, которая поставляется с SDK, чтобы собрать топологию и проверить, что она работает. Если вы не можете построить топологию в topoedit ... это, вероятно, невозможно. – Mgetz

ответ

1

Intel MJPEG Decoder MFT - это asynchronous MFT, и если вы управляете им напрямую, вы несете ответственность за применение асинхронной модели. Вы, кажется, делаете это, но вы не предоставляете информацию, которая позволяет устранить проблему. Да, вы должны использовать модель события, описанную в разделах ProcessInput, ProcessOutput, приведенных выше. Когда вы получаете первый кадр, вам следует отлаживать его дальше, чтобы он работал с плавной непрерывной обработкой.

Когда вы используете API-интерфейсы, такие как медиа-сеанс, наш источник-читатель, у вас есть Media Foundation, имеющий дело с MFT. Он способен выполнять синхронное и асинхронное потребление, когда это необходимо. В этом случае, однако, вы не делаете IMFTransform звонков, и даже из вашего смутного описания оно приходит, вы делаете это неправильно.

+0

Спасибо, что исправил мою ошибку, Роман. Я зарегистрировал асинхронный обратный вызов и попытался получить асинхронные события, но я не получил никаких событий из IMFAsyncCallback :: Invoke(). Не могли бы вы рассказать мне, как зарегистрировать асинхронный обратный вызов для SourceReader и получить доступ к Hardware MFT? – Abi

+0

Я успешно зарегистрировал обратный вызов IMFAsyncCallback для MFT.Я получил событие MFTransformNeedInput, чтобы обработать образец ввода дважды, но событие MFTransformHaveOutput не вызвано вообще. Я добавил код, который я использую в своем проекте. PFA для ссылки на мой код: https://www.dropbox.com/s/t6figfl9b2kyp6y/HwMJPEGDecoderMFT_Code_Query.txt?dl=0. Я прокомментировал метод ProcessOutputSample() в своем коде и проверил, непрерывно непрерывно регистрируя тип события MFTransformNeedInput. Не могли бы вы рассказать мне, что я делаю неправильно, и почему я не получил ProcessOutputSample? – Abi

+0

@Abika: Это всего лишь фрагмент кода, мне не нравятся несколько моментов, но важнее то, что он не работает, и я не уверен, что вызывает проблему с исходными проблемами, с которыми вы сталкиваетесь. Мне определенно не нравится то, как вы выполняете 'WaitForSingleObject' последовательно из фрагмента кода, защищенного критическим разделом. –

 Смежные вопросы

  • Нет связанных вопросов^_^