Использовать определенный кодек или папку ffdshow с DirectShowLib?

Я использую DirectShowLib в приложении C#, чтобы разрешить воспроизведение видео. К сожалению, не все системы предоставляют достойный видеокодек, поэтому я решил установить FFDShow как часть моей установки. К сожалению, это не работает для некоторых пользователей, так как у них либо уже установлено несколько пакетов видеокодеков, либо они используют старые версии. Или, например, Windows 7 уже не требует.

Когда я играл с libvlc некоторое время назад, они позволили мне указать путь к плагину со всеми поддерживаемыми видеокодеками, но, к сожалению, я не могу найти что-то подобное с DirectShowLib.

Есть ли способ либо упаковать необходимые библиотеки кодеков как часть моего приложения и указать на эту папку, либо установить FFDShow в определенную папку и сослаться на нее?


person Jensen    schedule 13.02.2011    source источник


Ответы (1)


Один из возможных подходов, который вы могли бы использовать, — использовать COM без регистрации. В файле манифеста вы должны указать, что используете определенную группу подкомпонентов (например, подкаталог, содержащий компоненты FFDShow). Вам также потребуется создать манифест для DLL в этом подкаталоге. Основная проблема заключается в том, что вам нужно создавать экземпляры ваших объектов из С#, как это:

DsGuid MicrosoftDemux = new DsGuid("{AFB6C280-2C41-11D3-8A60-0000F81E0E4A}");
var demux = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(MicrosoftDemux));

Когда у вас есть фильтр, вы можете добавить его на свой график, применить к другим интерфейсам или сделать что-то еще, что вы хотите сделать.

Чтобы создать файл манифеста для компонентов FFDShow, вы можете использовать regsvr42 (описанный в этом ответе: Создать файлы манифеста для бесплатной регистрации COM

Я успешно использовал это для использования фильтров DirectShow без их регистрации. Следует иметь в виду, что файлы COM должны находиться в том же каталоге, что и ваше приложение, или в подкаталоге. Иметь их в соседнем каталоге не получится.

person David Paxson    schedule 17.02.2011