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

Вниз

DxShow+Capturing=problems   Найти похожие ветки 

 
Ozone ©   (2006-02-21 05:45) [0]

Добрый день. Есть web-камера, хочу сразу делать превью и капчуринг в bmp по запросу.
Сегодня на "коленках" собрал вот такой код, но при попытке считать хотябы размер буфера нифига не получается...
Может кто подскажет где я дал маху... Заранее спасибо.


 pBuild     : ICaptureGraphBuilder2;
 pGraph     : IGraphBuilder;
 hr         : HWND;
 pCap       : IBaseFilter;
 pMoniker   : IMoniker;
 pDevEnum   : ICreateDevEnum;
 pEnum      : IEnumMoniker;
 MC         : IMediaControl;
 ME         : IMediaEventEx;
 VW         : IVideoWindow;
 pSampleGrabber : IBaseFilter;
 pGrabber       : ISampleGrabber;
 mt             : TAM_MEDIA_TYPE;

{...}
    { **** ПОСТРОЕНИЕ ГРАФА ****}
    pGraph := nil;
    pBuild := nil;

    hr := CoCreateInstance(CLSID_CaptureGraphBuilder2, nil,
                           CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, pBuild );
    if SUCCEEDED(hr) then begin
      hr := CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER,
                             IID_IGraphBuilder, pGraph);
      if SUCCEEDED(hr) then begin
         pBuild.SetFiltergraph(pGraph);
      end
      else pBuild := nil;
    end
    else ShowMessage("Error_2");

    pCap := nil;
    pMoniker := nil;

    // Create the system device enumerator
    pDevEnum := nil;
    hr := CoCreateInstance(CLSID_SystemDeviceEnum, nil, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, pDevEnum);
    if (FAILED(hr)) then ShowMessage("7");

    // Create an enumerator for the video capture devices
    pEnum := nil;
    hr := pDevEnum.CreateClassEnumerator(CLSID_VideoInputDeviceCategory, pEnum, 0);

    // берем первое что попалось
    if (pEnum.Next(1, pMoniker, nil) = S_OK) then begin
       // Bind Moniker to a filter object
       hr := pMoniker.BindToObject(nil,nil,IID_IBaseFilter, pCap);
       if (FAILED(hr)) then ShowMessage("9");
       hr := pGraph.AddFilter(pCap, "Capture Filter");
       if (FAILED(hr)) then ShowMessage("10");
    end;

    hr := pBuild.RenderStream(@PIN_CATEGORY_PREVIEW, @MEDIATYPE_Video, pCap, nil, nil);

    hr := pGraph.QueryInterface(IID_IMediaControl, MC);
    if (FAILED(hr)) then ShowMessage("13");

    hr := pGraph.QueryInterface(IID_IMediaEvent, ME);
    if (FAILED(hr)) then ShowMessage("14");

    hr := pGraph.QueryInterface(IID_IVideoWindow, VW);
    if (FAILED(hr)) then ShowMessage("15");

    { Insert grabber}

    hr := CoCreateInstance(CLSID_SampleGrabber, nil, CLSCTX_INPROC, IID_IBaseFilter, pSampleGrabber) ;
    if (FAILED(hr)) or  (pSampleGrabber = nil) then ShowMessage("11");

    hr := pSampleGrabber.QueryInterface(IID_ISampleGrabber, pGrabber);
    if (FAILED(hr)) then ShowMessage("19");

    // set media type
    mt.majortype := MEDIATYPE_Video;
    mt.subtype := MEDIASUBTYPE_RGB24;
    hr := pGrabber.SetMediaType(mt);
    if (FAILED(hr)) then ShowMessage("16");

    hr := pGraph.AddFilter(pSampleGrabber, "Sample Grabber");
    if (FAILED(hr)) then ShowMessage("12");
    pSampleGrabber := nil;

    pGrabber.SetOneShot(FALSE);
    pGrabber.SetBufferSamples(TRUE);

    VW.put_owner(Panel.Handle);
    VW.put_top(0);
    VW.put_left(0);
    VW.put_width(320);
    VW.put_height(240);
    VW.put_windowstyle(WS_CHILD);

{...}
    {*** RUN GRAPH ***}
    MC.Run;
    while (State_Running <> tmp) do
       MC.GetState(100, tmp);

{...}
    {*** CAPTURE IMAGE ***}
    cbBuffer : longint;
    pBuffer  : pChar;

    {...}

    cbBuffer := 0;
    hr := pGrabber.GetCurrentBuffer(cbBuffer, 0); // здесь всегда cbBuffer равно 0
    {...}


 
Ozone ©   (2006-02-21 11:09) [1]

вопрос снят, всем спасибо.


 
Belorus ©   (2006-02-24 18:50) [2]

Советую на DSPack посмотреть



Страницы: 1 вся ветка

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

Наверх




Память: 0.46 MB
Время: 0.056 c
2-1154607940
FFFF
2006-08-03 16:25
2006.08.27
Размер отчета


4-1146841864
Георгий А.
2006-05-05 19:11
2006.08.27
Запуск программы из консольного приложения


2-1155109317
tytus
2006-08-09 11:41
2006.08.27
Как нормально рисовать на панели?


6-1144664680
Std
2006-04-10 14:24
2006.08.27
Indy tc clien


8-1140593927
Myx
2006-02-22 10:38
2006.08.27
Нужно посмотреть метаданные





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский