Конференция "WinAPI" » Инициализация драйвера камеры. [D7, WinXP]
 
  • Festil (02.07.10 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 © (03.07.10 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 © (03.07.10 10:45) [2]
    > [0] Festil   (02.07.10 17:24)

    это устаревшая технология.
  • Festil (03.07.10 12:21) [3]
    Eraser а можно ссылку на новую, или с чего начинать оформлять.

    mahab спс, попробую и так.
  • ~AQUARIUS~ © (03.07.10 14:14) [4]
    Новая - это DirectShow. Надо построить граф, источником данных указать камеру, добавить необходимые encoder'ы и направить поток в файл или рендерер
  • ~AQUARIUS~ © (03.07.10 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 (03.07.10 15:36) [6]
    ~AQUARIUS~
    Спасибо за совет, попробую разобраться с этим, правда у меня сейчас доступ ограничен к этой системе и не знаю, когда будет результат.
  • Festil (06.07.10 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 (06.07.10 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 (06.07.10 11:50) [9]
    Проблема в том, что информацию с камеры обрабатывает другое приложение, а я хочу, чтобы и моя прога подключилась к этой камеры, чтобы они жили дружно. Что делать в этой ситуации?
  • brother © (13.07.10 09:19) [10]
 
Конференция "WinAPI" » Инициализация драйвера камеры. [D7, WinXP]
Есть новые Нет новых   [134431   +11][b:0][p:0.008]