Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2017, 18:38   #1
Legeardo
Пользователь
 
Регистрация: 04.10.2016
Сообщений: 76
Вопрос фото с вебкамеры

Дайте пж пример делания фото с вебкамеры, предварительно выбрав нужное устройство. К примеру если на компе 2 вебки, нужно их отобразить, и потом выбрать 1 из них. Желательно сделать именно фото, без записи видео. Спасибо.
Legeardo вне форума Ответить с цитированием
Старый 22.03.2017, 18:46   #2
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

cейчас не могу, но смогу позже
BLACK_RAIN вне форума Ответить с цитированием
Старый 22.03.2017, 19:14   #3
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Есть компонент TVideoGrabber, он работает с разными источниками видео
http://tvideograbber-video-sdk.soft1.../download.html
http://infrm-center.ru/index.php?opt...2-24&Itemid=47

И компонент PasLibVlc тоже работает с разными источниками видео
http://decoding.dax.ru/download/component/mm/mm.html

Ну или работать с DirectShow
http://basicsprog.ucoz.ru/publ/6
Учимся работать с Web камерой в DirectShow
http://basicsprog.ucoz.ru/publ/6-1-0-28

Последний раз редактировалось Aliens_wolfs; 22.03.2017 в 22:00.
Aliens_wolfs вне форума Ответить с цитированием
Старый 22.03.2017, 20:39   #4
Legeardo
Пользователь
 
Регистрация: 04.10.2016
Сообщений: 76
По умолчанию

первые 2 ссылки не рабочие
Legeardo вне форума Ответить с цитированием
Старый 22.03.2017, 21:43   #5
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Извиняюсь исправил проверьте

Вот еще ссылка с темами DirectShow на этом форуме, там есть много полезного и интересного
http://www.programmersforum.ru/searc...archid=2044655

Последний раз редактировалось Aliens_wolfs; 22.03.2017 в 22:05.
Aliens_wolfs вне форума Ответить с цитированием
Старый 23.03.2017, 07:46   #6
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

внесу свои 5 копеек

перечисление камер
Код:
function TForm2.go: HResult;
var
  enum : ICreateDevEnum;
  eMon : IEnumMoniker;
  monAr : array of IMoniker;
  pMoniker : IMoniker;
  DeviceName:OleVariant;
  PropertyName:IPropertyBag;
begin
  Result:=CoCreateInstance(CLSID_SystemDeviceEnum, NIL, CLSCTX_INPROC_SERVER,
  IID_ICreateDevEnum, Enum);
  if Result<>S_OK then EXIT;

  Result:=Enum.CreateClassEnumerator(CLSID_videoInputDeviceCategory, eMon, 0);
  if FAILED(Result) then EXIT;
  setlength(monAr,0);

  while (S_OK=emon.Next(1,pMoniker,Nil)) do
  begin
    setlength(monAr,length(monAr)+1);
    monAr[length(monAr)-1]:=pMoniker;
    Result:=pMoniker.BindToStorage(NIL, NIL, IPropertyBag, PropertyName);
    if FAILED(Result) then Continue;
    Result:=PropertyName.Read('FriendlyName', DeviceName, NIL);
    if FAILED(Result) then Continue;

    ListBox1.Items.Add(DeviceName);
  end;
end;
каждый моникер в массиве monAr соответствует камере. Выбираем нужную и делаем:
Код:
var
  fCamera : IBaseFilter;
  
    Result := monAr[n].BindToObject(nil,nil,IID_IBaseFilter,fCamera);
потом ставим fCamera первым в цепочку Графа фильтров.


Далее:
Код:
    pGrabber: ISampleGrabber = nil;
    fGrabber : IBaseFilter = nil;

  CoCreateInstance(CLSID_SampleGrabber,nil,CLSCTX_INPROC,
                    IID_IBaseFilter,fGrabber);
  Result := pGraphBuilder.AddFilter(fGrabber,'Sample Grabber');
  if Result = s_ok then
  begin
    fGrabber.QueryInterface(IID_ISampleGrabber,pGrabber);
    ZeroMemory(@DesiredMT,SizeOf(DesiredMT));
    DesiredMT.majortype := MEDIATYPE_Video;
    DesiredMT.subtype := MEDIASUBTYPE_RGB24;
    DesiredMT.formattype := FORMAT_VideoInfo;
    Result := pGrabber.SetMediaType(DesiredMT);
    if Result = s_ok then
    begin
      pGrabber.SetOneShot(False);
      pGrabber.SetBufferSamples(True);
    end else
    begin
      //error
      Exit;
    end;
    pCaptureGraphBuilder.RenderStream(@pin_category_preview,@mediatype_video,
                                     FVideoCaptureFilter,fGrabber,nil);
    pCaptureGraphBuilder.RenderStream(@pin_category_preview,@mediatype_audio,
                                     fAudioCaptureFilter,nil,nil);
  end;
//процедура снятия скриншота
//граф должен быть на паузе!!!!
Код:
function MakeScreenshot(var bmp: TBitmap; var ErrorCode: Integer):Boolean;
const
  nl = #13#10;
var
  BufferSize : Integer;
  vih : TVideoInfoHeader;
  mt : TAMMediaType;
  BMPInfo : TBitmapInfo;
  Buffer : Pointer;
  tmp : array of Byte;
  hr : HRESULT;
  hbmp : hbitmap;
Begin
  Result := False;
  ErrorCode := -1;
  hr := pGrabber.GetCurrentBuffer(BufferSize,nil);
  ZeroMemory(@mt,SizeOf(tammediatype));
  hr := pGrabber.GetConnectedMediaType(mt);
  vih := tvideoinfoheader(mt.pbFormat^);
  ZeroMemory(@bmpinfo,SizeOf(tbitmapinfo));
  CopyMemory(@bmpinfo.bmiheader,@vih.bmiheader,SizeOf(tbitmapinfoheader));
  Buffer := nil;
  hbmp := CreateDIBSection(0,BMPInfo,DIB_PAL_COLORS,Buffer,0,0);
  case hbmp of
    0:
    begin
      MoFreeMediaType(@mt);
{      MessageBox(form1,PChar('?? ??????? ??????? ????????!'+nl+'?????????? HBMP = 0'),
                       PChar('??????!'), MB_ICONERROR);}
      ErrorCode := 0;
      Exit;
    end;
    ERROR_INVALID_PARAMETER:
    begin
      MoFreeMediaType(@mt);
{      MessageBox(form1,PChar('?? ??????? ??????? ????????!'+nl+
                             '??? ??????: ERROR_INVALID_PARAMETER'),
                       pchar('??????!'), MB_ICONERROR);}
      ErrorCode := ERROR_INVALID_PARAMETER;
      Exit;
    end;
  end;
  bmp.Handle := hbmp;
  SetLength(tmp,BufferSize);
  pGrabber.GetCurrentBuffer(BufferSize,@tmp[0]);
  CopyMemory(Buffer,@tmp[0],mt.lSampleSize);
  SetLength(tmp,0);
  MoFreeMediaType(@mt);
  Result := True;
end;

кнопка
Код:
        pMediaControl.Pause;
        bmp := TBitmap.Create;
        if MakeScreenshot(bmp,n) then
        begin
          fn := FormatDateTime('"C:\"yyyy-mm-dd, hh-mm-ss".bmp"',Now);
          bmp.SaveToFile(fn);
        end;
        bmp.Free;
        pMediaControl.Run;
В этот код надо добавить обработчики возможных ошибок. Проверяйте возвращаемый результат каждого метода и функции.

Последний раз редактировалось BLACK_RAIN; 23.03.2017 в 08:01.
BLACK_RAIN вне форума Ответить с цитированием
Старый 23.03.2017, 08:59   #7
Legeardo
Пользователь
 
Регистрация: 04.10.2016
Сообщений: 76
По умолчанию

Спасибо большое за приведенный код! Но у меня есть пару вопросов.
что делать строка
ZeroMemory(@bmpinfo,SizeOf(tbitmapi nfo));
CopyMemory(@bmpinfo.bmiheader,@vih. bmiheader,SizeOf(tbitmapinfoheader) );
и
DesiredMT.majortype := MEDIATYPE_Video;
DesiredMT.subtype := MEDIASUBTYPE_RGB24;
DesiredMT.formattype := FORMAT_VideoInfo;

DesiredMT что это?
Legeardo вне форума Ответить с цитированием
Старый 23.03.2017, 09:53   #8
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Legeardo Посмотреть сообщение
что делать строка
ZeroMemory(@bmpinfo,SizeOf(tbitmapi nfo));
Забивает все поля структуры bmpinfo нулями

Цитата:
Сообщение от Legeardo Посмотреть сообщение
CopyMemory(@bmpinfo.bmiheader,@vih. bmiheader,SizeOf(tbitmapinfoheader) );
копирует все значения структуры vih.bmiheader в bmpinfo.bmiheader

Цитата:
Сообщение от Legeardo Посмотреть сообщение
DesiredMT.majortype := MEDIATYPE_Video;
DesiredMT.subtype := MEDIASUBTYPE_RGB24;
DesiredMT.formattype := FORMAT_VideoInfo;
Точно не знаю, но по-идее это указывает SampleGrabber'у в каком формате у нас видео.
По-идее, эти параметры надо брать из MediaType какого-то пина в каком-то фильтре графа, а не указывать их вручную. Иначе можно не угадать формат видео. Это, наверное, можно посмотреть в GraphStudio. Но тогда граф фильтров надо строить вручную.

Последний раз редактировалось BLACK_RAIN; 23.03.2017 в 09:58.
BLACK_RAIN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение скриншота с вебкамеры. Nullerset Мультимедиа в Delphi 2 31.07.2013 07:53
Снимок с вебкамеры oFFlineby Мультимедиа в Delphi 1 23.09.2011 19:44
Захват видео с вебкамеры Eric56 Общие вопросы C/C++ 0 12.12.2010 21:55
Захват изображения с вебкамеры GrenDaiZer Помощь студентам 3 15.04.2007 13:54