Проблемы с захватом с Media Foundation и Windows 8 в C++
Это будет мой первый вопрос в Stackru через несколько дней в поисках объяснения. Пожалуйста, будьте осторожны со мной, потому что я знаю, что моя проблема немного странная, чтобы быть общей проблемой.
Я сделал MF-приложение для захвата видео, основанное на примере Microsoft "CaptureToFile". Это работало на Windows 7 x64. Я обновился до Visual Studio 2013 без проблем. Проблемы возникли, когда я попытался поместить все разработки на машину с Windows 8.1 x64.
Приложение компилируется и выполняется без ошибок, но НЕВОЗМОЖНО захватывать сэмплы, используя m_pReader->ReadSample() в асинхронном режиме; только первые два образца поступают в метод OnReadSample; и должны быть "контрольные" выборки, потому что IMFSample во всех них равен нулю. После этого приложение зависает в ожидании данных.
Я попробовал оригинальный образец MFCaptureToFile с такими же печальными результатами.
Конечно, я думаю, что аппаратное и программное обеспечение схожи (одна и та же карта захвата с одинаковой версией драйвера, оба являются настольными ПК...)
Знаете ли вы возможную причину такого поведения? в Win7 все работает без нареканий! Или, по крайней мере, если бы вы могли осветить меня немного о новых путях для выяснения, что происходит
заранее спасибо
ОБНОВЛЕНИЕ: в игре есть еще один "игрок". Глядя на потоки, я вижу, что рабочий поток находится в RTWorkQ.dll, контейнере рабочей очереди в реальном времени, специфичном только для Windows 8. Я продолжу исследовать. А пока, если у вас есть идеи, чем-то поделиться, я буду рад вас услышать.
ОБНОВЛЕНИЕ 2: я изменил образец MFCaptureToFile, чтобы получить образцы видео синхронно, потому что я думал, что проблема может быть из-за асинхронного поведения; связанные с очередями. Я должен сказать, что проблема сохраняется даже с этим изменением. Во второй раз, когда он пытается прочитать образец, приложение "зависает" в ожидании чтения, которое никогда не приходит.
ОБНОВЛЕНИЕ 3: я попробовал с примером приложения CaptureEngine, которое использует другой способ MF для захвата видео (MFCaptureEngine). Он создает и работает безупречно, но не показывает никаких изображений при запуске "предварительного просмотра" и не записывает никаких полезных, только не воспроизводимых файлов.
ОБНОВЛЕНИЕ 4: Я установил Visual Studio 2010 Ultimate в Windows 8 PRO. Образец MFCaptureToFile снова терпит неудачу в образце. Невозможно прочитать 2-й пример из фрейм-граббера. Я начинаю думать, что это может быть несовместимость между платой захвата (Datapath VisionRGB-E1S) и Windows 8 PRO, несмотря на то, что драйвер гарантирует, что он отлично работает на этой платформе, а тестовая программа показывает изображения. Завтра я собираюсь попробовать тест с внешней веб-камерой USB.
3 ответа
Наконец, я выяснил причину этой проблемы.
С выпуском Windows 8.1 Microsoft представила новые интерфейсы AVStream для Windows 8.1 В структуре KS_FRAME_INFO есть небольшое, но очень важное изменение - новый член FrameCompletionNumber.
Идентификационный порядковый номер для кадра в завершенной очереди. Этот номер используется для проверки правильности порядка кадров. Когда это значение равно 0, кадр был отменен. Этот участник доступен начиная с Windows 8.1.
DirectShow не заботится об этом числе. И MediaFoundation заботится.
Таким образом, вы не можете просто исправить это на стороне пользовательского режима. Разработчики производства должны выпустить обновление. Кстати, у меня есть две веб-камеры - Logitech C270 и Creative Live Socialize HD. Logitech поддерживает Metro, а Creative - нет.
Я успешно обновил свой драйвер с помощью всего лишь нескольких строк кода (для правильной настройки FrameCompletionNumber).
UPD. аналогичная тема http://www.osronline.com/showthread.cfm?link=255004
У меня была такая же проблема:
IMFSourceReader
был получен успешноreader->SetCurrentMediaType()
не сообщили об ошибке.reader->ReadSample()
Был успешен.
затем OnReadSample()
был вызван только один раз и hrStatus
аргумент 0x80070491
Для меня проблема была в том, что я изменил подтип видео IMFMediaType
, затем применяется к читателю в качестве текущего типа носителя.
Это должна быть проблема захвата кадра Datapath VisionRGB-E1S. Я пробовал использовать совершенно новую USB веб-камеру LifeCam Studio, и все работало нормально.
Я оставлю для другой будущей темы, почему это непарное поведение между Windows 8 и Windows 7, но это может быть что-то, связанное с доступом в пользовательском режиме...