2016-07-12 4 views
0

Я работаю над приложением, которое анализирует видеофайлы. Будучи не экспертом по DirectShow, я использовал простой код для анализа всех фреймов (SampleGrabber, Callback и т. Д.). Это прекрасно подходит для всех медиафайлов, даже если они декодированы с помощью структуры VideoInfoHeader2 (хотя это не должно, как указано везде). Проблема заключается в захвате одного кадра. Для этого я использовал IMediaDet. И это не делает, если есть только VideoInfoHeader2, и нет VideoInfoHeader. Я пробовал модификации моего кода анализа (OneShot, Seek), но этого не делает. Все источники в Интернете по этому вопросу не очень полезны, , поскольку они указывают на примеры SDK/DX, которые больше недоступны, или они просто говорят, что модификация будет «легкой». Ну, может быть, для эксперта DX ... (Но мне нужно использовать автомобиль, а не сначала его построить ... ;-) В качестве более важного для меня вопроса & мой «обходной путь» - это перекодируйте все видео с помощью VideoInfoHeader2, , сохраните их с помощью VideoInfoHeader и выполните анализ/захват. Очень ресурсопотребляющий, и наоборот от умных ... Любая помощь оценивается.Схватывающие фреймы, когда структура VideoInfoHeader2

ответ

1

Вы указали необходимые шаги, которые по-прежнему являются самым простым решением (при условии, что вы не сдаетесь и не используете Windows API, использование библиотеки сторонних разработчиков может быть проще, но это выходит за рамки этого вопроса).

Образец Grabber и IMediaDet - это части устаревших служб редактирования DirectShow, разработка которых была остановлена ​​давно. Если вас не устраивает API-интерфейс запаса, вам нужно использовать более гибкую замену. Например, вы можете захватить исходный код аналогичного образца Grabber из старого пакета DirectX или Platform SDK и расширить его для поддержки VIDEOINFOHEADER2.

IMediaDet - не что иное, как класс COM, создающий собственный график, внутренне пытаясь декодировать видео. Он негибкий и почти каждый раз, когда ваше здание делает ваш собственный граф более надежным решением.

Ответ Microsoft на эту проблему - поскольку они отказались от разработки DirectShow - нового API Media Foundation. Однако есть причины, по которым этот «ответ» не очень хорош: ограниченная совместимость с ОС, ограниченная поддержка кодеков и форматов, совершенно новый API, который имеет мало общего с DirectShow, и вам нужно перепроектировать ваше приложение.

Все вместе вы должны найти замену образца Grabber, используя один из популярных и объясненных методов (независимо от того, как они выглядят не так много) или переключиться на другой API или стороннюю библиотеку. Или еще одно возможное решение - использовать другой фильтр/кодек, который способен декодировать в VIDEOINFOHEADER формат форматированного носителя.

+0

Благодарим вас за ответ. Схватка кадров из нового VIDEOINFOHEADER2 будет очень общей задачей, о которой я должен думать. Если ситуация такая, как вы описали, я не могу понять, почему просто не использовать исходный код, предоставляемый где-то, поскольку он очень обескураживает работу через старые (и трудно найти) образцы, получая подробные сведения о DirectShow, чтобы иметь возможность изменять это для VIDEOINFOHEADER2. – nji9

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