Воскресенье, 22.10.2017, 05:31
Приветствую Вас Гость

Не ошибается тот, кто ничего не делает.
Но и ничего не делать - ошибка.

Эмиль Кроткий

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум » Delphi » DirectShow и Delphi. » Видео плеер (Подключение внешнего фильтра.)
Видео плеер
GnomДата: Пятница, 09.03.2012, 13:48 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 3
Репутация: 0
Статус: Offline
Подключение внешнего фильтра.

Вопрос решен, спасибо за помощь.


Сообщение отредактировал Gnom - Пятница, 09.03.2012, 13:49
 
xaramamburuДата: Пятница, 09.03.2012, 20:05 | Сообщение # 2
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Gnom, мог бы и решение выложить. Вдруг кому то пригодится.)))
 
GnomДата: Пятница, 09.03.2012, 20:47 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 3
Репутация: 0
Статус: 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;
Ну и гуиды нужные добавить. поскольку у меня только один формат, то развивать дальше не стал. в идеале - можно создать массив гуидов, сканировать папку плагинов и получать гуиды прямо из фильтров, эмулируя регистрацию в системе, либо еще как то. В общем, для меня - слабо smile Я успокоился на достигнутом, за неимением необходимости большего - еще один КМплеер писать не вижу смысла.
 
BLACK_CRAFTER666Дата: Понедельник, 30.09.2013, 10:36 | Сообщение # 4
Сержант
Группа: Пользователи
Сообщений: 31
Репутация: 0
Статус: 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
Репутация: 26
Статус: 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');

Да, неплохо бы еще добавить проверку на наличие фильтра в реестре. А вдруг он уже зарегистрирован?
smile
 
GnomДата: Вторник, 01.10.2013, 07:36 | Сообщение # 6
Рядовой
Группа: Пользователи
Сообщений: 3
Репутация: 0
Статус: 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
Репутация: 0
Статус: 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;

не получается передать путь к файлу из переменной.
 
Форум » Delphi » DirectShow и Delphi. » Видео плеер (Подключение внешнего фильтра.)
Страница 1 из 11
Поиск:


Copyright MyCorp © 2017Конструктор сайтов - uCoz