Видео плеер
|
|
Gnom | Дата: Пятница, 09.03.2012, 13:48 | Сообщение # 1 |
Рядовой
Группа: Пользователи
Сообщений: 3
Статус: Offline
| Подключение внешнего фильтра.
Вопрос решен, спасибо за помощь.
Сообщение отредактировал Gnom - Пятница, 09.03.2012, 13:49 |
|
| |
xaramamburu | Дата: Пятница, 09.03.2012, 20:05 | Сообщение # 2 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Gnom, мог бы и решение выложить. Вдруг кому то пригодится.)))
|
|
| |
Gnom | Дата: Пятница, 09.03.2012, 20:47 | Сообщение # 3 |
Рядовой
Группа: Пользователи
Сообщений: 3
Статус: Offline
| Решение было в той статье. http://www.progdigy.com/forums....f1cba31 . http://forum.doom9.org/archive/index.php/t-87182.html . Все, что нужно - это перевести ее в дельфи. примерно вот так выглядит: Code var DllGetClassObject: function(const CLSID, IID: TGUID; var Obj): HResult; stdcall; ClassF: IClassFactory; base: IBaseFilter; LibHandle: Integer ............................. begin LibHandle:= LoadLibrary('xvid.ax'); DllGetClassObject:= GetProcAddress(LibHandle, 'DllGetClassObject'); DllGetClassObject(CLSID_XVID, IClassFactory, ClassF); ClassF.CreateInstance(nil, IID_IBaseFilter, base);
FilterGraph.AddFilter(base, 'Xvid Decoder') end; Ну и гуиды нужные добавить. поскольку у меня только один формат, то развивать дальше не стал. в идеале - можно создать массив гуидов, сканировать папку плагинов и получать гуиды прямо из фильтров, эмулируя регистрацию в системе, либо еще как то. В общем, для меня - слабо Я успокоился на достигнутом, за неимением необходимости большего - еще один КМплеер писать не вижу смысла.
|
|
| |
BLACK_CRAFTER666 | Дата: Понедельник, 30.09.2013, 10:36 | Сообщение # 4 |
Сержант
Группа: Пользователи
Сообщений: 31
Статус: Offline
| Gnom, Я пробовал данным способом подключать Haali media splitter, предварительно удалив все кодеки и сплиттеры из системы. Если верить кодам ошибок, то haali успешно загружается и добавляется в граф. Но при подключении его к источнику, возвращается ошибка VFW_E_CANNOT_CONNECT. Окно настроек фильтра открыть тоже нельзя. Вызывал из консоли типа
Код C:\Windows\System32\rundll32.exe C:\haali\splitter.ax,Configure Зарегистрировал фильтр вручную:
Код regsrv32.exe c:\haali\splitter.ax Окно настроек начало открываться, но по прежнему ошибка VFW_E_CANNOT_CONNECT. никто не подскажет, почему?
|
|
| |
xaramamburu | Дата: Понедельник, 30.09.2013, 23:32 | Сообщение # 5 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Да, так у меня тоже ничего не вышло. Если верить кодам ошибок, то фильтр успешно загружается и добавляется в граф, но фильтр остается недоступен, при попытке обращения к нему вылетает ошибка доступа к памяти.
Я попробовал так: Var DllRegisterServer: function : HResult; stdcall; DllUnregisterServer: function : HResult; stdcall; LibHandle: HMODULE; ............................... ............................... //для регистрации LibHandle:= LoadLibrary('xvid.ax'); DllRegisterServer:=GetProcAddress(LibHandle, 'DllRegisterServer'); DllRegisterServer; CoCreateInstance(CLSID_XVID_Decoder, nil, CLSCTX_INPROC, IID_IBaseFilter, XVID); pGraph.AddFilter(XVID, 'Xvid Decoder'); //вот не знаю стоит ли освобождать сразу или потом? FreeLibrary(LibHandle);
//для удаления LibHandle:= LoadLibrary('xvid.ax'); //ну и соответственно если освободили при регистрации то грузим снова DllUnregisterServer:=GetProcAddress(LibHandle ,'DllUnregisterServer'); DllUnregisterServer; FreeLibrary(LibHandle);
(Код приведен без проверки ошибок.)
Не знаю на сколько этот код оправданный и можно ли так делать? Почитайте здесь про функции DllRegisterServer и DllUnregisterServer: http://delphi.scps.ru/com/com5115.htm http://delphi.scps.ru/com/com5116.htm Но это работает.)))
Зарегистрировать фильтр можно также выполнив функцию:
RegisterComServer('xvid.ax');
Да, неплохо бы еще добавить проверку на наличие фильтра в реестре. А вдруг он уже зарегистрирован?
|
|
| |
Gnom | Дата: Вторник, 01.10.2013, 07:36 | Сообщение # 6 |
Рядовой
Группа: Пользователи
Сообщений: 3
Статус: Offline
| Код function GetFilterFromLibrary(ALibrary: WideString; AClassID: TGuid): IBaseFilter; type TDllGetClassObject = function(const CLSID, IID: TGUID; var Obj): HResult; stdcall; var lib: Cardinal; dll: TDllGetClassObject; factory: IClassFactory; begin Result := nil; lib := CoLoadLibrary(PWideChar(ALibrary), True); if lib = 0 then Exit; dll := GetProcAddress(lib, 'DllGetClassObject'); if not Assigned(dll) then Exit;
if dll(AClassID, IClassFactory, factory) <> S_OK then Exit;
if factory.CreateInstance(nil, IID_IBaseFilter, Result) <> S_OK then Exit; end; Код не мой и пилить его еще и пилить, но болванка правильная, пользуйтесь. И да, в AClassID нужно указать правильный GUID фильтра. Это важно.
|
|
| |
BLACK_CRAFTER666 | Дата: Воскресенье, 16.02.2014, 16:50 | Сообщение # 7 |
Сержант
Группа: Пользователи
Сообщений: 31
Статус: Offline
| Извините за задержку, товарищи. Оба способа работают только с фильтрами LAV. Haali splitter грузится, но даёт ошибку VFW_E_CANNOT_CONNECT. FFDShow вообще не удалось загрузить. Фэйлит на этой строчке: Код if factory.CreateInstance(nil, IID_IBaseFilter, Result) <> S_OK then Exit; Может, я гуйд не тот указываю? Эти фильтры имеют по нескольку гуйдов.Добавлено (16.02.2014, 16:50) --------------------------------------------- И еще трабл Цитата Gnom ( ) function GetFilterFromLibrary(ALibrary: WideString; AClassID: TGuid): IBaseFilter; не получается передать путь к файлу из переменной.
|
|
| |
|