Поломали работу с веб-камерой?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Поломали работу с веб-камерой?

Сообщение GAMER » 15.07.2015 15:05:53

Работаю через pl_win_dspack.lpk (вытянутого с проекта typhon). После свн-обновлений паскаля и Лазаруса перестал рабоать код:

Код: Выделить всё
SysDev:= TSysDevEnum.Create(CLSID_VideoInputDeviceCategory);
ComboBox2.Items.Clear;
if SysDev.CountFilters > 0 then
  for i := 0 to SysDev.CountFilters - 1 do
   begin
     ComboBox2.Items.Add(SysDev.Filters[i].FriendlyName);
   end;     


SysDev.CountFilter<=0 почему-то. Кто сталкивался и победил?
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Поломали работу с веб-камерой?

Сообщение Alex2013 » 15.07.2015 22:04:32

Посмотри как сделано у меня ...
Уровень ближе к системному и хотя пока кривовато
(Постоянно "Хлопаю драйвером" и юзаю клипборд ) но может какие-то идеи появятся...)

Код: Выделить всё
// Захват кадра
function capCreateCaptureWindow
(lpszWindowName : PChar; dwStyle : Integer; x : Integer; y : Integer;
nWidth : Integer; nHeight : Integer; hWndParent : Integer; nID : Integer)
: Integer; stdcall; external 'avicap32.dll' name 'capCreateCaptureWindowA';

procedure TMainForm.Button2Click(Sender: TObject);
const
  WM_USER = $00000400;
  WM_CAP_START                    = WM_USER; //старт для сообщений
  WM_CAP_GET_CAPSTREAMPTR         = WM_CAP_START + 1;
  //описание callback ошибок
  WM_CAP_SET_CALLBACK_ERROR       = WM_CAP_START + 2;
  WM_CAP_SET_CALLBACK_STATUS      = WM_CAP_START + 3;
  WM_CAP_SET_CALLBACK_YIELD       = WM_CAP_START + 4;
  WM_CAP_SET_CALLBACK_FRAME       = WM_CAP_START + 5;
  WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + 6;
  WM_CAP_SET_CALLBACK_WAVESTREAM  = WM_CAP_START + 7;
  WM_CAP_GET_USER_DATA            = WM_CAP_START + 8;
  WM_CAP_SET_USER_DATA            = WM_CAP_START + 9;

  WM_CAP_DRIVER_CONNECT           = WM_CAP_START + 10;
  WM_CAP_DRIVER_DISCONNECT        = WM_CAP_START + 11;
  WM_CAP_DRIVER_GET_NAME          = WM_CAP_START + 12;
  WM_CAP_DRIVER_GET_VERSION       = WM_CAP_START + 13;

  WM_CAP_DRIVER_GET_CAPS          = WM_CAP_START + 14;
  WM_CAP_FILE_SET_CAPTURE_FILE    = WM_CAP_START + 20;
  WM_CAP_FILE_GET_CAPTURE_FILE    = WM_CAP_START + 21;
  WM_CAP_FILE_SAVEAS              = WM_CAP_START + 23;
  WM_CAP_FILE_SAVEDIB             = WM_CAP_START + 25;

  WM_CAP_FILE_ALLOCATE            = WM_CAP_START + 22;
  WM_CAP_FILE_SET_INFOCHUNK       = WM_CAP_START + 24;
  WM_CAP_EDIT_COPY                = WM_CAP_START + 30;
  WM_CAP_SET_AUDIOFORMAT          = WM_CAP_START + 35;
  WM_CAP_GET_AUDIOFORMAT          = WM_CAP_START + 36;
  WM_CAP_DLG_VIDEOFORMAT          = WM_CAP_START + 41;
  WM_CAP_DLG_VIDEOSOURCE          = WM_CAP_START + 42;
  WM_CAP_DLG_VIDEODISPLAY         = WM_CAP_START + 43;
  WM_CAP_GET_VIDEOFORMAT          = WM_CAP_START + 44;
  WM_CAP_SET_VIDEOFORMAT          = WM_CAP_START + 45;
  WM_CAP_DLG_VIDEOCOMPRESSION     = WM_CAP_START + 46;
  WM_CAP_SET_PREVIEW              = WM_CAP_START + 50;
  WM_CAP_SET_OVERLAY              = WM_CAP_START + 51;
  WM_CAP_SET_PREVIEWRATE          = WM_CAP_START + 52;
  WM_CAP_SET_SCALE                = WM_CAP_START + 53;
  WM_CAP_GET_STATUS               = WM_CAP_START + 54;
  WM_CAP_SET_SCROLL               = WM_CAP_START + 55;
  WM_CAP_GRAB_FRAME               = WM_CAP_START + 60;
  WM_CAP_GRAB_FRAME_NOSTOP        = WM_CAP_START + 61;

  WM_CAP_SEQUENCE                 = WM_CAP_START + 62;
  WM_CAP_SEQUENCE_NOFILE          = WM_CAP_START + 63;
  WM_CAP_SET_SEQUENCE_SETUP       = WM_CAP_START + 64;
  WM_CAP_GET_SEQUENCE_SETUP       = WM_CAP_START + 65;

  WM_CAP_SET_MCI_DEVICE           = WM_CAP_START + 66;
  WM_CAP_GET_MCI_DEVICE           = WM_CAP_START + 67;
  WM_CAP_STOP                     = WM_CAP_START + 68;
  WM_CAP_ABORT                    = WM_CAP_START + 69;

  WM_CAP_SINGLE_FRAME_OPEN        = WM_CAP_START + 70;
  WM_CAP_SINGLE_FRAME_CLOSE       = WM_CAP_START + 71;
  WM_CAP_SINGLE_FRAME             = WM_CAP_START + 72;
  WM_CAP_PAL_OPEN                 = WM_CAP_START + 80;
  WM_CAP_PAL_SAVE                 = WM_CAP_START + 81;

  WM_CAP_PAL_PASTE                = WM_CAP_START + 82;
  WM_CAP_PAL_AUTOCREATE           = WM_CAP_START + 83;
  WM_CAP_PAL_MANUALCREATE         = WM_CAP_START + 84;

  // Following added post VFW 1.1
  WM_CAP_SET_CALLBACK_CAPCONTROL  = WM_CAP_START + 85;
  CONTROLCALLBACK_PREROLL         = 1 ; //* Waiting to start capture */
  CONTROLCALLBACK_CAPTURING       = 2 ; //* Now capturing */

hCamCapture : Integer=0;
Var
  hHandle:HWND;
  fRefreshRate: integer;
  fViewStyle: integer;
  r: TRect;
  ID: TGUID;
  S: string;

function CapControlCallback (Hwnd, nState:dword): dword; stdcall;
  //var   pCls: THIWebCam;
begin
//   pCls := THIWebCam(GetProp(hwnd, PChar('OwnerObject')));
   Result := nState;
end;

begin
// Пока не разобраться как обойти Panel2 обычная пустая панель
// по хорошему там должно показаться превью  ...
hHandle := self.Panel2.Handle;
// Connect;
   R:= self.Panel2.ReadBounds;
   S := 'WebCam_' + intTostr(LongInt(Self));
   if hCamCapture = 0 then begin
    hCamCapture := capCreateCaptureWindow(PChar(S),
    WS_VISIBLE OR WS_CHILD OR WS_CLIPSIBLINGS,
    0, 0, r.right-r.left, r.bottom-r.top, hHandle, LongInt(self));
   SetProp(hCamCapture,PChar('OwnerObject'), integer(pointer(self)));
   SendMessage(hCamCapture, WM_CAP_DRIVER_CONNECT, 0, 0);
   SendMessage(hCamCapture, WM_CAP_SET_OVERLAY, 0, 0);
   SendMessage(hCamCapture, WM_CAP_SET_PREVIEW, 1, 0);
   SendMessage(hCamCapture, WM_CAP_SET_SCALE, fViewStyle, 0);
   SendMessage(hCamCapture, WM_CAP_SET_PREVIEWRATE, fRefreshRate, 25);
// SendMessage(hCamCapture, WM_CAP_SET_CALLBACK_CAPCONTROL
// , 0, longint(@CapControlCallback));
end;
SendMessage(hCamCapture, WM_CAP_EDIT_COPY, 0, 0);
// Захватывает в Imag1.. (Обычный TImage)
Imag1.Picture.Bitmap.LoadFromClipboardFormat(2);
// .LoadFromClipboardFormat (ctClipboard);
// Тормоз тут ...
SendMessage(hCamCapture, WM_CAP_DRIVER_DISCONNECT, 0, 0);
DestroyWindow(hCamCapture);
hCamCapture := 0;
// ...но для захвата одного кадра нормально   
end;


ЗЫ
На всяк случай мой uses..

uses

Windows, Classes, SysUtils, FileUtil, {uPSComponent, ну это для скриптов} Forms, Controls, Graphics,
Dialogs, ExtCtrls, StdCtrls, Buttons, ComCtrls,LCLType;
Последний раз редактировалось Alex2013 15.07.2015 22:50:55, всего редактировалось 5 раз(а).
Alex2013
долгожитель
 
Сообщения: 3138
Зарегистрирован: 03.04.2013 11:59:44

Re: Поломали работу с веб-камерой?

Сообщение GAMER » 15.07.2015 22:14:19

Под виндовс 7 без проблем работает? А то у меня уже второй вариант со временем перестает работать :)
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Поломали работу с веб-камерой?

Сообщение Alex2013 » 15.07.2015 22:30:19

GAMER писал(а):Под виндовс 7 без проблем работает? А то у меня уже второй вариант со временем перестает работать :)

Да с хп по идее тоже ...
К веб-камерам часто идут древние и глючные дрова ..
Иногда нужно отключать камеру или перегружать ОСь
(Но выше указанный "тупой" метод "открыл габнул закрыл" обычно работает железно )
За
ДА еще дрова ОЧЕНЬ "не любят" нескольких экземпляров программы !
(Как-то в впопыхах запустил так несчастная ось птичкой влетела с ррроскошным BSD-ом .. :mrgreen:
До этого БСоДов я уже несколько лет не видел ! )
Alex2013
долгожитель
 
Сообщения: 3138
Зарегистрирован: 03.04.2013 11:59:44

Re: Поломали работу с веб-камерой?

Сообщение скалогрыз » 15.07.2015 22:58:34

Alex2013 писал(а):Посмотри как сделано у меня ...
Уровень ближе к системному и хотя пока кривовато
(Постоянно "Хлопаю драйвером" и юзаю клипборд ) но может какие-то идеи появятся...)

грустно же! получается, приложеие легко похерит содержимое clipboard-а? чем capVideoStremCallback не устроил?

Кстати, вот тут один господин хвастался, что у него камеры скоростные. этак может он что-нить посоветует?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Поломали работу с веб-камерой?

Сообщение Alex2013 » 15.07.2015 23:35:41

Пока просто не разобрался как следует ...( Сделал по принципу "Живая рыба" то есть функция работает ? Ну и пока привет ! :mrgreen: )
Как я уже писал "Код выдран без особого понимания сути "
ЗЫ
Может у кого-нибудь есть готовый кусок ? ( С нормальной "теневой" записью кадра в TBitmap )
А функция записи в клипборд работает почему-то значительно стабильнее прочих ...
Зы Зы
Заметил что если инициализировать драйвер при создании формы все летает как надо ...
(Но во беда МНЕ так не надо :roll: ... Глюки в отсутствии вебкамеры мне ненужны совершенно )
Зы Зы Зы
capVideoStreamCallback ? Гм, попробую !
Alex2013
долгожитель
 
Сообщения: 3138
Зарегистрирован: 03.04.2013 11:59:44

Re: Поломали работу с веб-камерой?

Сообщение GAMER » 07.09.2015 11:11:27

После некоторого времени видать пофиксили, в последних ревизиях - работает.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Поломали работу с веб-камерой?

Сообщение vitaly_l » 11.09.2015 11:58:59

скалогрыз писал(а):capVideoStremCallback

StretchDIBits - выводит BMP только 16 бит и меньше с перевёрнутым сильно зашумлённым изображением. При минимизации окна - процесс останавливается, соответственно в эту сторону (мне) можно не копать. Мне нужно, чтобы можно было получить картинку без отображения её на экране.


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22

Рейтинг@Mail.ru
cron