Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2016.07.24;
Скачать: CL | DM;

Вниз

Инициализация драйвера камеры.   Найти похожие ветки 

 
Festil   (2010-07-02 17:24) [0]

Здравствуйте, проблема с инициализацией драйвера для 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. При выборе любого - сбой в инициализации драйвера.

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


 
mahab ©   (2010-07-03 02:07) [1]

Вот я делал для тюнера работало
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!!!


 
Eraser ©   (2010-07-03 10:45) [2]

> [0] Festil   (02.07.10 17:24)

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


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

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

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


 
~AQUARIUS~ ©   (2010-07-03 14:14) [4]

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


 
~AQUARIUS~ ©   (2010-07-03 15:14) [5]

Начать можно отсюда: 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 можно отрендерить по умолчанию


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

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


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

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

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-06 11:38) [8]

Жутко извиняюсь, 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:50) [9]

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


 
brother ©   (2010-07-13 09:19) [10]

http://delphimaster.net/view/8-1278518050/



Страницы: 1 вся ветка

Текущий архив: 2016.07.24;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
11-1260089096
RusSun
2009-12-06 11:44
2016.07.24
[Error] scaledemo1.pas(124)


15-1441009172
Юрий Зотов
2015-08-31 11:19
2016.07.24
Рыдал. Только не знаю от чего - от смеха или от горя...


6-1279741373
ppgrachev
2010-07-21 23:42
2016.07.24
idtcpserver как разослать сообщение всем клиентам


15-1447023946
Kerk
2015-11-09 02:05
2016.07.24
Кресло


15-1439034187
xayam from work
2015-08-08 14:43
2016.07.24
Архивирование опять сломалось?