Я разрабатываю настольное приложение для потоковой передачи через USB-камеру, используя технику MediaFoundation SourceReader. Камера имеет поддержку USB 3.0 и обеспечивает 60 кадров в секунду для разрешения видео формата 1080p MJPG.
Я использовал Software MJPEG Decoder MFT для преобразования кадров MJPG в YUY2, а затем преобразовал их в кадр RGB32 для рисования в окне. Вместо 60 кадров в секунду, я могу рендерить только 30 кадров в секунду при использовании этого программного декодера. Я разместил вопрос на этом сайте и получил предложение использовать Intel Hardware MJPEG Decoder MFT для решения проблемы пропуска кадров.
Я столкнулся с ошибкой 0xC00D36B5 — MF_E_NOTACCEPTING при звонке IMFTransform :: ProcessInput () метод. Чтобы устранить эту ошибку, MSDN предложил использовать интерфейс IMFTranform в асинхронном режиме. Итак, я использовал IMFMediaEventGenerator интерфейс для GetEvent для каждого образца In / Out. Успешно, я могу обработать только один входной образец, а затем непрерывно возвращает методы IMFMediaEventGenerator :: GetEvent () MF_E_NO_EVENTS_AVAILABLE ошибка (GetEvent () является синхронным).
Я попытался настроить асинхронный обратный вызов для SourceReader, а также IMFTransform, но MFAsyncCallback :: Invoke Метод не вызывается, поэтому я планировал использовать метод GetEvent.
Я что-то упустил? Если да, кто-то подсказывает мне использовать аппаратный декодер Intel в моем проекте?
Аппаратное обеспечение Intel MJPEG Decoder MFT является асинхронный MFT и если вы управляете им напрямую, вы несете ответственность за применение асинхронной модели. Вы, кажется, делаете это, но вы не предоставляете информацию, которая позволяет решить проблему. Да, вы должны использовать модель событий, описанную в ProcessInput
, ProcessOutput
разделы статьи связаны выше. Как только вы получите первый кадр, вы должны продолжить отладку, чтобы он работал с непрерывной непрерывной обработкой.
Когда вы используете такие API, как media session, наш читатель исходного кода, у вас есть Media Foundation, который занимается MFT. Он способен выполнять синхронное и асинхронное потребление, когда это необходимо. В этом случае, однако, вы не делаете IMFTransform
звонки и даже из вашего смутного описания приходит, вы делаете это неправильно.
Других решений пока нет …