Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2016.07.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2016.07.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.005 c
15-1444838876
aka
2015-10-14 19:07
2016.07.24
Топологическая сортировка


4-1277230542
Отшельник
2010-06-22 22:15
2016.07.24
Изменить значение в памяти чужой программы которое берется из INI


15-1446240602
Юрий
2015-10-31 00:30
2016.07.24
С днем рождения ! 31 октября 2015 суббота


15-1446991183
K-1000
2015-11-08 16:59
2016.07.24
Какую версию Delphi вы используете и почему?


15-1444249810
sniknik
2015-10-07 23:30
2016.07.24
Сохранился у кого "раритет"?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский