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

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

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2013, 10:34   #1
varich
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 22
По умолчанию разбор videocapture

пытаюсь разобраться с com. написал ф-ю для захвата видео через Directshow. компилится без ошибок.а вопрос собсно такой: как к этой функции(если она рабочая) прикрутить вывод на форму(кусок с videoWindow и далее вроде должен это делать но не делает).
void video_capt2(HWND hWnd)
{
hr = CoInitializeEx(NULL,COINIT_APARTMEN TTHREADED);//Используем раздельное адресное пространство потоков
hr = CoCreateInstance(CLSID_CaptureGraph Builder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pBuild );
hr = CoCreateInstance(CLSID_SystemDevice Enum, NULL,CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, reinterpret_cast<void**>(&pDevEnum) );
hr = pDevEnum->CreateClassEnumerator(CLSID_VideoI nputDeviceCategory, &pEnum, 0);
hr = CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER,IID_IGraphBuil der, (void**)&pGraph);
hr = pGraph->QueryInterface(IID_IMediaControl , (void **)&pControl);
hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
pBuild->SetFiltergraph(pGraph);
IBindCtx * pbc=NULL;
hr = CreateBindCtx(NULL, &pbc);
hr = pMoniker->BindToObject(pbc, NULL, IID_IBaseFilter,(void**)&pCap);//
pGraph->AddFilter(pCap,L"Video Capture Filter");
hr= pBuild->RenderStream(&PIN_CATEGORY_PREVIEW , &MEDIATYPE_Video,pCap, NULL, NULL);
pGraph->QueryInterface(IID_IVideoWindow,(v oid**)&videoWindow);
videoWindow->put_Owner((OAHWND)hWnd);
videoWindow->put_WindowStyle( WS_CHILD | WS_CLIPSIBLINGS );
videoWindow->put_Left(0);
videoWindow->put_Top(0);
videoWindow->put_Width(640);
videoWindow->put_Height(480);
// IMediaEventEx * pEvent2(NULL);
//pGraph->QueryInterface(IID_IMediaEventEx , (void **)&pEvent2);
//pEvent2->SetNotifyWindow((OAHWND)hWnd, 0, 0);
// IMediaControl * pMediaControl(NULL);
//pGraph->QueryInterface(IID_IMediaControl , (void **)&pMediaControl);
//if (pMediaControl->Run()==S_OK){MessageBox(hWnd, L"RUN is failed",L"Failed", MB_OK);};
pBuild->Release();
pMoniker->Release();
CoUninitialize();
}
varich вне форума Ответить с цитированием
Старый 01.05.2013, 11:55   #2
varich
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 22
По умолчанию

или посоветуйте книжку где ясно разжёвано как с помощью стандартных com объектов(точней с помощью КАКИХ объектов) можно чтото реализовать на com
зы теорию читал msdn тоже. ни там ни там не попалось ответа на вопросы типа почему нужно использовать CLSID_CaptureGraphBuilder2 а не CLSID_CaptureGraphBuilder, как узнать название нужного в данном случае com объекта(тот же CLSID_CaptureGraphBuilder2).
varich вне форума Ответить с цитированием
Старый 01.05.2013, 17:23   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Код:
var
 MArray: array of IMoniker;
  FGraphBuilder1: IGraphBuilder;
  FCaptureGraphBuilder1:ICaptureGraphBuilder2;
  FVideoCaptureFilter1:IBaseFilter;
  FVideoWindow1:IVideoWindow;
  FVideoRect1:Trect;
  FMediaControl1:IMediaControl;

  BasicAudio   : IBasicAudio;
  BasicVideo   : IBasicVideo;
  //VMR-
  pRenderer    : IBaseFilter;
  pConfig      : IVMRFilterConfig;
  pBitmap      : IVMRMixerBitmap;
  VMRBitmap    : VMRALPHABITMAP;
  b: tbitmap;
  osb: tbitmap;
  w,h: integer;
  //Video info
  VideoAvail   : boolean;
  VideoWidth   : integer;
  VideoHeight  : integer;
  VideoBitRate : integer;
  VideoFPS     : single;



  DeviceName:OleVariant;
  PropertyName:IPropertyBag;
  pDevEnum:ICreateDEvEnum;
  pEnum:IEnumMoniker;
  pMoniker:IMoniker;
begin
 SetWindowLong(Application.Handle,GWL_EXSTYLE,GetWindowLong(Application.Handle, GWL_EXSTYLE) or
  not WS_EX_APPWINDOW);
 //set_tn(0,0,'WEBCAM');
 Application.OnMessage:= wm;
 DoubleBuffered:= true;

  CoCreateInstance(CLSID_SystemDeviceEnum, NIL, CLSCTX_INPROC_SERVER,
   IID_ICreateDevEnum, pDevEnum); //Объект для перечисления устройств
  pDevEnum.CreateClassEnumerator(CLSID_VideoInputDeviceCategory, pEnum, 0); //Перечислитель

  setlength(MArray,0); //Обнуляем массив в списке моникеров
  while (S_OK=pEnum.Next(1,pMoniker,Nil)) do //Пускаем массив по списку устройств
  begin
    setlength(MArray,length(MArray)+1); //Увеличиваем массив на единицу
    MArray[length(MArray)-1]:=pMoniker; //Запоминаем моникер в масиве
    pMoniker.BindToStorage(NIL, NIL, IPropertyBag, PropertyName); //Линкуем моникер устройства к формату хранения IPropertyBag
    PropertyName.Read('FriendlyName', DeviceName, NIL); //Получаем имя устройства
    combobox1.Items.Add(DeviceName); //Добавляем имя устройства в списки
  end;

  if Succeeded(CoCreateInstance(CLSID_FilterGraph, NIL, CLSCTX_INPROC_SERVER,
    IID_IGraphBuilder, FGraphBuilder1)) then //Объект для графа фильтров
  if Succeeded(CoCreateInstance(CLSID_CaptureGraphBuilder2, NIL,
    CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, FCaptureGraphBuilder1)) then //Объект для графа захвата

 
  FCaptureGraphBuilder1.SetFiltergraph(FGraphBuilder1); //Задаем граф фильтров
  MArray[combobox1.ItemIndex].BindToObject(NIL, NIL, IID_IBaseFilter, FVideoCaptureFilter1);
  FGraphBuilder1.AddFilter(FVideoCaptureFilter1, 'VideoCaptureFilter'); //Получаем фильтр графа захвата

  //Начинаем вывод изображения
  FCaptureGraphBuilder1.RenderStream(@PIN_CATEGORY_PREVIEW, @MEDIATYPE_Video,
                                     FVideoCaptureFilter1, NIL, NIL);
  FGraphBuilder1.QueryInterface(IID_IMediaControl, FMediaControl1);

  //Get Audio and Video Interfaces
  if failed(FGraphBuilder1.QueryInterface(IID_IBasicAudio,
            BasicAudio))then exit;
  if failed(FGraphBuilder1.QueryInterface(IID_IBasicVideo,
            BasicVideo))then exit;
  FGraphBuilder1.QueryInterface(IID_IVideoWindow, FVideoWindow1);

  //Get file info
  VideoAvail := Assigned(BasicVideo) and Assigned(FVideoWindow1);
  //Get video info
  if VideoAvail then begin
   BasicVideo.GetVideoSize(VideoWidth, VideoHeight);
   BasicVideo.get_BitRate(VideoBitRate);
   BasicVideo.get_AvgTimePerFrame(_tpf);
   if _tpf <> 0 then VideoFPS:= 1 / _tpf else VideoFPS:= 0;
   //sb.panels[0].text:= inttostr(VideoWidth)+'x'+inttostr(VideoHeight);
   //sb.panels[1].text:= 'Bitrate=' + inttostr(VideoBitRate);
   //sb.panels[2].text:= 'FPS=' + floattostr(VideoFPS)
  end;

  //располагаем окошко с видео на панель
  FVideoWindow1.put_Owner(Panel1.Handle);
  FVideoWindow1.put_WindowStyle(WS_CHILD or WS_CLIPSIBLINGS);
  FVideoWindow1.put_MessageDrain(Panel1.Handle);
  FVideoRect1:= Panel1.ClientRect;
  FVideoWindow1.SetWindowPosition(0,
                                  0,
                                  panel1.ClientRect.Right,
                                  panel1.ClientRect.Bottom);

  FVideoWindow1.put_Visible(TRUE);
  FMediaControl1.Run(); //Запускаем отображение предпросмотра с вебкамер
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 01.05.2013, 18:07   #4
varich
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 22
По умолчанию

спасибо пойду переписывать
varich вне форума Ответить с цитированием
Старый 01.05.2013, 18:33   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...а для изучения DirectShow по-русски
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 01.05.2013, 21:39   #6
varich
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 22
По умолчанию

DirectShow по-русски по этой теме ток кусок теории есть. там уже прочтено. пишу в msvs поэтому код переписываю под неё. вроде заработало правда криво(убрал строки с фпс и битрейтом потому как при получении битрейта вылетает System.NullReferenceException а с фпс разбираться пока лень, да и параметры эти ридонли) ну и моникеры выбираю вручную MArray[1]->BindToObject(pbc, NULL, IID_IBaseFilter,(void**)&pCap); чтоб лишние элементы на форме не рисовать.
varich вне форума Ответить с цитированием
Старый 01.05.2013, 21:46   #7
varich
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 22
По умолчанию

вот эта же ф-я только для MSVS
void video_capt2(HWND hWnd)
{
static IGraphBuilder *pGraph = NULL;//MyGraphBuilder
static ICaptureGraphBuilder2 *pBuild = NULL;
static IBaseFilter *pCap=NULL; //Video capture filter
static ICreateDevEnum *pDevEnum = NULL;
static IEnumMoniker *pEnum = NULL;
static IMoniker *pMoniker=NULL;
static IMediaControl *pControl = NULL;
static IMediaEvent *pEvent = NULL;
static IVideoWindow *videoWindow;
static IPropertyBag *PropertyName;
static IBindCtx * pbc=NULL;
static IBasicVideo *BasicVideo ;
static HRESULT hr;

array<IMoniker*> ^MArray=gcnew array<IMoniker*>(10);
hr = CoInitializeEx(NULL,COINIT_APARTMEN TTHREADED);//Используем раздельное адресное пространство потоков
//if (hr==S_OK){MessageBox(hWnd, L"Initialize error",L"Failed", MB_OK);};


hr = CoCreateInstance(CLSID_SystemDevice Enum, NULL,CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, reinterpret_cast<void**>(&pDevEnum) );
pDevEnum->CreateClassEnumerator(CLSID_VideoI nputDeviceCategory, &pEnum, 0);
LPCOLESTR asd=L"FriendlyName";
VARIANT xz;
xz.vt=VT_UNKNOWN;
int i=0;
while (pEnum->Next(1,&pMoniker,NULL)==S_OK) //Пускаем массив по списку устройств
{
MArray[i]=pMoniker;
i++;
pMoniker->BindToStorage(NULL, NULL, IID_IPropertyBag, (void**)&PropertyName); //Линкуем моникер устройства к формату хранения IPropertyBag
PropertyName->Read(asd, &xz, NULL); //Получаем имя устройства
// combobox1.Items.Add(DeviceName); //Добавляем имя устройства в списки
}


hr = CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER,IID_IGraphBuil der, (void**)&pGraph);
hr = CoCreateInstance(CLSID_CaptureGraph Builder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pBuild );
hr=pBuild->SetFiltergraph(pGraph);

hr = CreateBindCtx(NULL, &pbc);
MArray[1]->BindToObject(pbc, NULL, IID_IBaseFilter,(void**)&pCap);

pGraph->AddFilter(pCap,L"Video Capture Filter");
hr= pBuild->RenderStream(&PIN_CATEGORY_PREVIEW , &MEDIATYPE_Video,pCap, NULL, NULL);
hr = pGraph->QueryInterface(IID_IMediaControl , (void **)&pControl);
pGraph->QueryInterface(IID_IVideoWindow, (void **)&videoWindow);
long *VideoHeight,*VideoWidth,*VideoBitR ate;
// BasicVideo->GetVideoSize(&VideoWidth, &VideoHeight);
// BasicVideo->get_BitRate(VideoBitRate);
// BasicVideo->get_AvgTimePerFrame(_tpf);
videoWindow->put_Owner((OAHWND)hWnd);
videoWindow->put_WindowStyle( WS_CHILD | WS_CLIPSIBLINGS );
videoWindow->put_MessageDrain((OAHWND)hWnd);
videoWindow->put_Left(0);
videoWindow->put_Top(0);
videoWindow->put_Width(640);
videoWindow->put_Height(480);
videoWindow->put_Visible(TRUE);
pControl->Run();

pBuild->Release();
pMoniker->Release();
CoUninitialize();
} теперь осталось разобраться с битрейтом и ошибками в release режиме
varich вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разбор в коде Kozak_Aleksei Помощь студентам 1 22.01.2012 20:03
Разбор цикла parkito Общие вопросы C/C++ 4 18.02.2011 16:42
Разбор строки DenisVoronov Помощь студентам 11 18.11.2010 11:18
Разбор строки... CodeExpert Помощь студентам 3 23.02.2010 18:16