Форум: "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.006 c