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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2014, 16:49   #1
Daemvil
Пользователь
 
Регистрация: 23.12.2009
Сообщений: 57
По умолчанию Как получить снимок с веб-камеры через пин STILL

Доброго времени суток! Подскажите, пожалуйста, как через PIN_CATEGORY_STILL (через PIN_CATEGORY_PREVIEW работает, но надо STILL) кадр c веб-камеры снять через DirectShow?
Изучал MSDN, сделал все по инструкции, но не помогло. На всякий случай выложу код. Может, будут какие-нить мысли у кого? Строка Result := FSampleGrabber.GetCurrentBuffer(bSi ze, NIL); в процедуре получения кадра выдает Result=VFW_E_WRONG_STATE
Код:
function CaptureBitMap: HResult; // Процедура получения кадра с камеры
var
  bSize: integer;
  pVideoHeader: TVideoInfoHeader;
  MediaType: TAMMediaType;
  BitmapInfo: TBitmapInfo;
  Buffer: Pointer;
  tmp: array of byte;
  Bitmap: TBitmap;
  JpegIm: TJpegImage;
begin
  Result := E_FAIL;
  if FSampleGrabber = NIL then EXIT;
 
    Result := FSampleGrabber.GetCurrentBuffer(bSize, NIL); // тут result=VFW_E_WRONG_STATE
    if (bSize <= 0) or FAILED(Result) then EXIT;
  Bitmap := TBitmap.Create;
   ...
    except
      Result := E_FAIL;
    end;
  finally
    SetLength(tmp, 0);
    Bitmap.Free;
    JpegIm.Free;
  end;
end;
 
function CreateGraph(const mode: byte; CB, CBPreviewSize, CBStillSize:TCombobox; Panel1:TPanel): HResult;
///////////////////////////////////////////////// Создание графа
var
  pConfigMux: IConfigAviMux;
begin
  FVideoCaptureFilter  := NIL;
  FVideoWindow         := NIL;
  FMediaControl        := NIL;
  FSampleGrabber       := NIL;
  FBaseFilter          := NIL;
  FCaptureGraphBuilder := NIL;
  FGraphBuilder        := NIL;
 
// объект для графа фильтров
  Result:=CoCreateInstance(CLSID_FilterGraph, NIL, CLSCTX_INPROC_SERVER,
                           IID_IGraphBuilder, FGraphBuilder);
// объект для граббинга
  Result:=CoCreateInstance(CLSID_SampleGrabber, NIL, CLSCTX_INPROC_SERVER,
                               IID_IBaseFilter, FBaseFilter);
// объект для графа захвата
  Result:=CoCreateInstance(CLSID_CaptureGraphBuilder2, NIL, CLSCTX_INPROC_SERVER,
                           IID_ICaptureGraphBuilder2, FCaptureGraphBuilder);
// добавляем фильтр в граф
  Result:=FGraphBuilder.AddFilter(FBaseFilter, 'GRABBER');
// Получаем интерфейс фильтра перехвата
  Result:=FBaseFilter.QueryInterface(IID_ISampleGrabber, FSampleGrabber);
 // Result:=FBaseFilter.QueryInterface(IID_IDCM800, FDCM800);
 
  if FSampleGrabber <> NIL then
  begin
    //обнуляем память
    ZeroMemory(@MediaType, sizeof(AM_MEDIA_TYPE));
    // Устанавливаем формат данных для фильтра перехвата
 
    FSampleGrabber.GetConnectedMediaType(mediatype);
    with MediaType do
    begin
      majortype  := MEDIATYPE_Video;
      subtype    := MEDIASUBTYPE_RGB24;
      formattype := FORMAT_VideoInfo;
      bfixedSizeSamples:=true;
      bTemporalCompression:=False;
    end;
 
    FSampleGrabber.SetMediaType(MediaType);
    FSampleGrabber.SetBufferSamples(TRUE);
    FSampleGrabber.SetOneShot(FALSE);
  end;
Result:=FCaptureGraphBuilder.SetFiltergraph(FGraphBuilder);
if FAILED(Result) then EXIT;
 
if CB.ItemIndex>=0 then
           begin
              result:=MonikerArray[CB.ItemIndex].BindToObject(NIL, NIL, IID_IBaseFilter, FVideoCaptureFilter);
              //добавляем устройство в граф фильтров
              FGraphBuilder.AddFilter(FVideoCaptureFilter, 'VideoCaptureFilter');               
Result:=FVideoCaptureFilter.QueryInterface(IID_IDCM800, FDCM800);// Получаем интерфейс камеры
              //применяем свойства
                Result:=FDCM800.put_PreviewSize(eDCM800Size(CBPreviewSize.itemindex));
                Result:=FDCM800.put_StillSize(eDCM800Size(CBStillSize.itemindex));
           end;
//Задаем, что откуда будем получать и куда оно должно выводиться
Result:=FCaptureGraphBuilder.RenderStream(@PIN_CATEGORY_STILL, @MEDIATYPE_Video, FVideoCaptureFilter ,FBaseFilter  ,nil); 
// так сказано делать в MSDN
 
Result:=FGraphBuilder.QueryInterface(IID_IVideoWindow, FVideoWindow);
FVideoWindow.put_WindowStyle(WS_CHILD or WS_CLIPSIBLINGS);
FVideoWindow.put_Owner(Panel1.Handle);
FVideoRect:=Panel1.ClientRect;
FVideoWindow.SetWindowPosition(FVideoRect.Left,FVideoRect.Top, FVideoRect.Right - FVideoRect.Left,FVideoRect.Bottom - FVideoRect.Top);
FVideoWindow.put_Visible(TRUE);
 
Result:=FGraphBuilder.QueryInterface(IID_IMediaControl, FMediaControl);
if FAILED(Result) then Exit;
FMediaControl.Run();
end;
Nostra Sunt

Последний раз редактировалось Stilet; 24.11.2014 в 17:19.
Daemvil вне форума Ответить с цитированием
Старый 13.01.2015, 10:18   #2
Daemvil
Пользователь
 
Регистрация: 23.12.2009
Сообщений: 57
По умолчанию

И снова здравствуйте! Похоже, никак не получится этого сделать? это глюк DirectShow?...
Nostra Sunt
Daemvil вне форума Ответить с цитированием
Старый 13.01.2015, 11:07   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Я бы помог, но никогда с ним не работал.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.01.2015, 23:52   #4
NIKOLAYY2
Форумчанин
 
Регистрация: 23.12.2014
Сообщений: 220
По умолчанию

Daemvil
Установи компоненты DSPach и через них делай, чем они тебя не устраивают?
NIKOLAYY2 вне форума Ответить с цитированием
Старый 09.02.2015, 14:47   #5
Daemvil
Пользователь
 
Регистрация: 23.12.2009
Сообщений: 57
По умолчанию

Цитата:
Сообщение от NIKOLAYY2 Посмотреть сообщение
Установи компоненты DSPach и через них делай, чем они тебя не устраивают?
DSPach? не опечатка? не слышал такого, подскажите где взять.
а если имели ввиду все-таки DSPack - подскажите, пожалуйста, как в нем составить граф для получения кадра не с пина PREVIEW, а с пина STILL?
Nostra Sunt
Daemvil вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить снимок с web камеры TEHb Мультимедиа в Delphi 5 22.08.2011 23:51
как получить один кадр с камеры? Пепел Феникса Java Мобильная разработка (Android) 2 09.01.2011 16:43
Захватить снимок с веб-камеры на C# zeharon C# (си шарп) 1 03.12.2010 01:29
OpenGL: Как получить изображение с камеры Mindzor Общие вопросы C/C++ 3 21.09.2010 07:38
Сложно ли самому получить видео с веб-камеры? TwiX Мультимедиа в Delphi 4 31.05.2010 17:45