Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи аудио и видеозахват в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новые коды MediaPlayer, IMFMediaEngine и Аудио/видеозахват в Media Foundation вместо DirectShowпо возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]
[Этот API не поддерживается и может быть изменен или недоступен в будущем.]
Когда Службы редактирования DirectShow (DES) выполняют рендеринг проекта редактирования видео, движок рендеринга автоматически выбирает соответствующие декодеры. Это может произойти внутри метода IRenderEngine::ConnectFrontEnd или динамически во время отрисовки.
Пользователь может установить несколько декодаторов, способных декодировать определенный файл. Если доступно несколько декодеров, DES использует алгоритм Intelligent Connect для выбора декодера.
Для приложения нет способа указать непосредственно, какой декодатор следует использовать. Однако вы можете косвенно выбрать декодировщик через интерфейс обратного вызова IAMGraphBuilderCallback. Реализуя этот интерфейс в приложении, вы можете получать уведомления во время процесса построения графа и отклонять определенные фильтры из графа.
Начните с реализации класса, экспонирующего интерфейс IAMGraphBuilderCallback:
class GraphBuilderCB : public IAMGraphBuilderCallback
{
public:
// Method declarations (not shown).
};
Затем создайте экземпляр диспетчера графов фильтров и зарегистрируйте класс, чтобы получать уведомления об обратном вызове.
// Declare an instance of the callback object.
GraphBuilderCB GraphCB;
// Create the Filter Graph Manager.
CComPtr<IGraphBuilder> pGraph;
hr = pGraph.CoCreateInstance(CLSID_FilterGraph);
if (FAILED(hr))
{
// Handle error (not shown).
}
// Register to receive the callbacks.
CComQIPtr<IObjectWithSite> pSite(pGraph);
if (pSite)
{
hr = pSite->SetSite((IUnknown*)&GraphCB);
}
Затем создайте движок отрисовки и вызовите метод IRenderEngine::SetFilterGraph с указателем на менеджера графов фильтров. Это гарантирует, что диспетчер отрисовки не создает собственный диспетчер графов фильтров, а использует экземпляр, настроенный вами для обратных вызовов.
CComPtr<IRenderEngine> pRender;
hr = pRender.CoCreateInstance(CLSID_RenderEngine);
if (FAILED(hr))
{
// Handle error (not shown).
}
hr = pRender->SetFilterGraph(pGraph);
При завершении проекта метод IAMGraphBuilderCallback::SelectedFilter приложения вызывается непосредственно перед тем, как Менеджер графиков фильтрации создаст новый фильтр. Метод SelectedFilter получает указатель на интерфейс IMoniker, который представляет собой моникер, связанный с фильтром. Проверьте имя, и если вы решили отклонить фильтр, верните код ошибки из метода SelectedFilter.
Сложно определить, какие моникеры представляют декодеры , и в частности, которые моникеры представляют декодеры, которые вы хотите отклонить. Одним из решений является следующее:
Перед отрисовкой проекта используйте метод IFilterMapper2::EnumMatchingFilters для создания списка фильтров, зарегистрированных как принимающие нужный тип входных данных. Для типов сжатия видео или звука этот список должен сопоставляться с набором декодеров.
Метод EnumMatchingFilters возвращает коллекцию моникеров. Для каждого моникера в коллекции получите свойство DisplayName, как описано в разделе Using the Filter Mapper.
Сохраните список отображаемых имен, но опустите отображаемое имя, соответствующее фильтру, который вы хотите использовать для декодирования. Отображаемые имена для фильтров программного обеспечения имеют следующую форму:
OLESTR("@device:sw:{CategoryGUID}\{FilterCLSID}");
где
CategoryGUID
GUID (глобальный уникальный идентификатор) категории фильтра
FilterCLSID
— clSID фильтра. Для DMOs формат тот же самый, но измените
sw
наdmo
.Теперь список содержит отображаемые имена для каждого фильтра, который выводит нужный тип носителя, но не является предпочитаемым фильтром.
В методе SelectedFilter получите свойство DisplayName в предлагаемом моникере и проверьте его в хранимом списке. Если отображаемое имя соответствует записи в списке, отклоните этот фильтр. В противном случае примите его, возвращая S_OK.
Связанные разделы