Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Инициализация драйвера камеры. [D7, WinXP]


Festil ©   (2010-07-02 17:24:00) 

Здравствуйте, проблема с инициализацией драйвера для usb камеры. Для соединения использую

const
 AVICAPDLL   = 'AVICAP32.DLL';
 WM_CAP_SET_CALLBACK_FRAME       = WM_CAP_START + 5;
 WM_CAP_DRIVER_CONNECT           = WM_CAP_START + 10;
 WM_CAP_SET_SCALE                = WM_CAP_START + 53;
 WM_CAP_SAVEDIB                  = WM_CAP_START + 25;
 WM_CAP_SET_OVERLAY              = WM_CAP_START + 51;
var
h_cam : HDC;
vin:integer=0;
Bt    : BITMAPINFO;

function    capCreateCaptureWindowA(lpszWindowName: LPCSTR; dwStyle: DWORD; x, y: Integer;nWidth, nHeight: Integer; hwndParent: HWND;nID: Integer): HWND; stdcall; external AVICAPDLL;

procedure TForm1.ConnectClick(Sender: TObject);
begin
h_cam := capCreateCaptureWindowA('WDC', WS_CHILD or WS_VISIBLE, 2, 10, 640, 480, DC, 0);
if h_cam <> 0 then begin

if SendMessage(h_cam, WM_CAP_DRIVER_CONNECT, vin, 0) <> 0 then
 begin
   Bt.bmiHeader.biWidth    := 640;//640;
   Bt.bmiHeader.biHeight   := 480;
   Bt.bmiHeader.biSize     := SizeOf(Bt.bmiHeader);
   Bt.bmiHeader.biPlanes   := 1;  
   Bt.bmiHeader.biBitCount := 24;
   SendMessage(h_cam, WM_CAP_SET_CALLBACK_FRAME, 0, Integer(@FrameCallbackA));
   SendMessage(h_cam,WM_CAP_SET_SCALE,1,1);
   SendMessage(h_cam,WM_CAP_SET_OVERLAY,0,0);

   SendMessage(h_cam,WM_CAP_SAVEDIB,0,longint(pchar('obr.bmp')));
 end else
 begin
   MessageBox(h_cam, 'Не удалось инициализировать драйвер', nil, MB_ICONHAND);
   Exit;
 end;
 end;

end;

При вызове появляется форма - источник видео, на ней одна вкладка - источник записи, и надпись выберите устройство. В раскрывающемся box'е два источника( две камеры подключены) - EVS USB2 Digital Video Camera. При выборе любого - сбой в инициализации драйвера.

Камеры вроде даже не подключены к компьютеру, а к серверу.
Как мне произвести инициализацию. Нужно ли подключать сокеты( про них я ничего не читал пока).


brother   (2010-07-13 09:19:00) [1]

http://www.delphimaster.ru/cgi-bin/forum.pl?n=7&id=1278518050


Festil   (2010-07-06 11:50:00) [2]

Проблема в том, что информацию с камеры обрабатывает другое приложение, а я хочу, чтобы и моя прога подключилась к этой камеры, чтобы они жили дружно. Что делать в этой ситуации?


Festil   (2010-07-06 11:38:00) [3]

Жутко извиняюсь, hr в основном теле

hr:=FCaptureGraphBuilder.RenderStream(@Pin_Category_Preview,@MediaType_Video,FVi  deoCaptureFilter,nil,nil);
if Failed(hr) then
              begin        
               ShowMessage('Ошибка в построении видео для фильтра');
               Exit;
               end;


Festil   (2010-07-06 11:36:00) [4]

Чуток разобрался, однако всплыла ошибка в последней функции следующего кода

function initialVideo(Handle:THandle):hresult;
begin

ResetGraph;
ShowMessage('Шаг 2');
hr:=E_Fail;
hr:=CoCreateInstance(CLSID_FilterGraph,nil,CLSCTX_INPROC_SERVER,
IID_IGraphBuilder,FGraphBuilder);
if FaIled(hr) then
                begin
                ShowMessage('Ошибка построения графа фильтров');
                Exit;
                end;
hr:=CoCreateInstance(CLSID_CaptureGraphBuilder2,nil,CLSCTX_INPROC_SERVER,
IID_ICaptureGraphBuilder2,FCaptureGraphBuilder);
if FaIled(hr) then
                begin
                ShowMessage('Ошибка построения графа захвата');
                Exit;
                end;

hr:=FCaptureGraphBuilder.SetFiltergraph(FGraphBuilder);
if FaIled(hr) then
                begin
                ShowMessage('Ошибка задания графа фильтов в построении графа захвата');
                Exit;
                end;
////////////////////////////////////////////////////////////////////////////////////1
ShowMessage('Шаг 3');
//////////////////////////////////////////////////////////////////////////////////////1
FvideoCaptureFilter:=devices(CLSID_VideoInputDeviceCategory,VideoCaptureDeviceNa me,Nil,true);
FaudioCaptureFilter:=devices(CLSID_AudioInputDeviceCategory,AudioCaptureDeviceNa me,Nil,true);
FvideoCompressFilter:=devices(CLSID_VideoCompressorCategory,VideoCompressDeviceN ame,Nil,true);
//FaudioCompressFilter:=devices(CLSID_AudioCompressorCategory,AudioCompressDeviceN ame,Nil,true);
if FVideoCaptureFilter<>NIL then FGraphBuilder.AddFilter(FVideoCaptureFilter,'VideoCaptureFilter');
if FaudioCaptureFilter<>NIL then FGraphBuilder.AddFilter(FaudioCaptureFilter,'AudioCaptureFilter');
if FVideoCompressFilter<>NIL then FGraphBuilder.AddFilter(FVideoCompressFilter,'VideoCompressFilter');

ShowMessage('Шаг 4');
hr:=FCaptureGraphBuilder.RenderStream(@Pin_Category_Preview,@MediaType_Video,FVi deoCaptureFilter,nil,nil);
if Failed(hr) then
               begin        
                ShowMessage('Ошибка в построении видео для фильтра');
                Exit;
                end;
-------------------------------------------------------
функция поиска устройств
function devices(const clsidDeviceClass:TGUID;DevName:WIdestring;DevList:Tstrings;
           GetFirst:boolean):IBaseFilter;
var
DeviceName: OleVariant;
PropertyName: IPropertyBag;
pDevEnum: ICreateDevEnum;
pEnum:IEnumMoniker;
pFilter: IBaseFilter;
pMoniker: IMoniker;
hr: Hresult;
begin
pMoniker:=NIL;
pFilter:=NIL;
PropertyName:=NIL;
pDevEnum:=NIL;
pEnum:=NIL;
Result:=Nil;
hr:=CoCreateInstance(CLSID_SystemDeviceEnum,NIL,CLSCTX_INPROC_SERVER,IID_ICreate DevEnum,pDevEnum);
if Failed(hr) then Exit;
hr:=pDevEnum.CreateClassEnumerator(clsidDeviceClass,pEnum,0);
if (hr<>S_OK) then Exit;
While (S_OK=pEnum.Next(1,pMoniker,Nil)) do
begin
 if not GetFirst then
 begin
 hr:=pMoniker.BindToStorage(NIL,NIl,IPropertyBag,PropertyName);
 if Failed(hr) then Continue;
 hr:=PropertyName.Read('FriendlyName',DeviceName,NIL);
 if Failed(hr) then Continue;
 if DevList<>Nil then DevList.Add(DeviceName);
 end
 else begin
 if DevName<>'' then
 begin
   hr:=pMoniker.BindtoStorage(nil,nil,IPropertyBag,PropertyName);
   if Failed(hr) then Continue;
   hr:=PropertyName.read('FriendlyName',DeviceName,Nil);
   if Failed(hr) then Continue;
   if (DeviceName<>DevName) then Continue;
 end;
 hr:=pMoniker.BindToObject(nil,nil,IID_IBaseFilter,pFilter);
 if SuCCeeded(hr) then
   begin
   result:=pFilter;
   pEnum:=nil;
   pDevenum:=NIL;
   pMoniker:=nil;
   PropertyName:=nil;
   Exit;
 end;
end;
end;
pEnum:=nil;
pDevenum:=NIL;
pMoniker:=nil;
PropertyName:=nil;
pFilter:=NIl;
end;

последний hr фэйлит. По идее не должен, может кто подскажет, в чем ошибка,
Аудиокомпресс я убиваю, тк ошибки при подключении.


Festil   (2010-07-03 15:36:00) [5]

~AQUARIUS~
Спасибо за совет, попробую разобраться с этим, правда у меня сейчас доступ ограничен к этой системе и не знаю, когда будет результат.


~AQUARIUS~   (2010-07-03 15:14:00) [6]

Начать можно отсюда: http://directshow.wonderu.com/статьи
Еще очень желательно скачать утилиту GraphEdit.

Граф для захвата у меня получился со второго раза - надо добавить по фильтру из категории Video Capture Sources и Audio Capture Sources, еще фильтр для записи в файл (я использовал WM ASF Writer (DirectShow Filters) - он поддерживает несколько форматов, в т.ч. .wmv, .avi и .mkv). Выходной пин видеоисточника надо присоединить к входному Video Input WM ASF Writer'а, а выходной аудиоситочника к соотествующему входному Writer'а (что и куда - поймете из названий пинов). Если захочете еще и просматривать видео во время захвата (или звук), то добавьте еще фильтры Smart Tee - они предназначены для рассчепления потока данных. Их пины Capture нужно присоединить к WM ASF Writer'у, а Preview можно отрендерить по умолчанию


~AQUARIUS~   (2010-07-03 14:14:00) [7]

Новая - это DirectShow. Надо построить граф, источником данных указать камеру, добавить необходимые encoder'ы и направить поток в файл или рендерер


Festil   (2010-07-03 12:21:00) [8]

Eraserа можно ссылку на новую, или с чего начинать оформлять.

mahabспс, попробую и так.


Eraser   (2010-07-03 10:45:00) [9]

> [0] Festil   (02.07.10 17:24)

это устаревшая технология.


mahab   (2010-07-03 02:07:00) [10]

Вот я делал для тюнера работало
procedure TForm1.BitBtn1Click(Sender: TObject);// Вкл
begin
hWndC := capCreateCaptureWindowA('My Own Capture Window',
   WS_CHILD or WS_VISIBLE,
   Panel1.Left,
   Panel1.Top,
   Panel1.Width,
   Panel1.Height,
   Form1.Handle,
   0);
 if hWndC <> 0 then
capDriverConnect (hWndC, 0);

capoverlay(hWndC,true);

end;
procedure TForm1.Button2Click(Sender: TObject);//Выкл
begin
if hWndC <> 0 then
 begin
   SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
   hWndC := 0;
 end;

end;

Только нужен VFW.pas!!!


Наверх

Титульная страница Поиск, карта сайта Написать письмо