|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
01.05.2013, 10:34 | #1 |
Пользователь
Регистрация: 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(); } |
01.05.2013, 11:55 | #2 |
Пользователь
Регистрация: 01.03.2013
Сообщений: 22
|
или посоветуйте книжку где ясно разжёвано как с помощью стандартных com объектов(точней с помощью КАКИХ объектов) можно чтото реализовать на com
зы теорию читал msdn тоже. ни там ни там не попалось ответа на вопросы типа почему нужно использовать CLSID_CaptureGraphBuilder2 а не CLSID_CaptureGraphBuilder, как узнать название нужного в данном случае com объекта(тот же CLSID_CaptureGraphBuilder2). |
01.05.2013, 17:23 | #3 |
Старожил
Регистрация: 29.09.2009
Сообщений: 9,713
|
Код:
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation |
01.05.2013, 18:07 | #4 |
Пользователь
Регистрация: 01.03.2013
Сообщений: 22
|
спасибо пойду переписывать
|
01.05.2013, 18:33 | #5 |
Старожил
Регистрация: 29.09.2009
Сообщений: 9,713
|
...а для изучения DirectShow по-русски
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation |
01.05.2013, 21:39 | #6 |
Пользователь
Регистрация: 01.03.2013
Сообщений: 22
|
DirectShow по-русски по этой теме ток кусок теории есть. там уже прочтено. пишу в msvs поэтому код переписываю под неё. вроде заработало правда криво(убрал строки с фпс и битрейтом потому как при получении битрейта вылетает System.NullReferenceException а с фпс разбираться пока лень, да и параметры эти ридонли) ну и моникеры выбираю вручную MArray[1]->BindToObject(pbc, NULL, IID_IBaseFilter,(void**)&pCap); чтоб лишние элементы на форме не рисовать.
|
01.05.2013, 21:46 | #7 |
Пользователь
Регистрация: 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 режиме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Разбор в коде | 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 |