// DirectShow.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <DShow.h>
#include <atlbase.h>
#include <initguid.h>
#include <dvdmedia.h>
BOOL hrcheck(HRESULT hr, const char *errtext)
{
if (hr>=S_OK) return FALSE;
TCHAR szErr[MAX_ERROR_TEXT_LEN];
DWORD res=AMGetErrorText(hr,szErr,MAX_ERROR_TEXT_LEN);
if(res)printf("Error %x: %s\n",hr,errtext);
else printf("Error %x: %s\n",hr,errtext);
return TRUE;
}
#define CHECK_HR(hr,msg) if(hrcheck(hr,msg)) return hr;
CComPtr<IPin> GetPin(IBaseFilter*pFilter, LPCOLESTR pinname)
{
CComPtr<IEnumPins>pEnum;
CComPtr<IPin>pPin;
wprintf(L"Looking for pinname [%s]\n", pinname);
HRESULT hr=pFilter->EnumPins(&pEnum);
if(hrcheck(hr,"Can not enumerate pin")) return NULL;
while(pEnum->Next(1,&pPin,0)==S_OK)
{
PIN_INFO pinfo;
pPin->QueryPinInfo(&pinfo);
BOOL found = !_wcsicmp(pinname,pinfo.achName);
if(pinfo.pFilter)pinfo.pFilter->Release();
if(found) return pPin;
pPin.Release();
}
printf("Pin not found\n");
return NULL;
}
DEFINE_GUID(CLSID_USB2013MUVCWebCam,0x17CCA71B,0xECD7,0x11D0,0xB9,0x08,0x00,0xA0,0xC9,0x22,0x31,0x96);
DEFINE_GUID(CLSID_VideoRender,0xB87BEB7B,0x8D29,0x423F,0xAE,0x4D,0x65,0x82,0xC1,0x01,0x75,0xAC);
HRESULT BuildGraph(IGraphBuilder*pGraph)
{
HRESULT hr=S_OK;
CComPtr<ICaptureGraphBuilder2> pBuilder;
hr=pBuilder.CoCreateInstance(CLSID_CaptureGraphBuilder2);
CHECK_HR(hr,"Can not SetFilterGraphCapture");
hr= pBuilder->SetFiltergraph(pGraph);
CHECK_HR(hr,"Can not SetGraphFilter");
CComPtr<IBaseFilter> pMic;
hr=pMic.CoCreateInstance(CLSID_AudioRecord);
CHECK_HR(hr,"Can not create microfon");
hr= pGraph->AddFilter(pMic,L"Микрофон (Устройство с поддержк)");
CHECK_HR(hr,"Can not add microfon");
CComPtr<IBaseFilter> pUSB201;
hr=pUSB201.CoCreateInstance(CLSID_USB2013MUVCWebCam);
CHECK_HR(hr,"Can not create USB 2.0 1 3M UVC WebCam");
hr= pGraph->AddFilter(pUSB201,L"USB 2.0 1.3M UVC WebCam");
CHECK_HR(hr,"Can not add USB 2.0 1 3M UVC WebCam");
CComPtr<IBaseFilter> pDin;
hr=pDin.CoCreateInstance(CLSID_AudioRender);
CHECK_HR(hr,"Can not create audio");
hr= pGraph->AddFilter(pDin,L"Динамики (Устройство с поддержк)");
CHECK_HR(hr,"Can not add audio");
CComPtr<IBaseFilter> pVideoRenderer;
hr=pVideoRenderer.CoCreateInstance(CLSID_VideoRender);
CHECK_HR(hr,"Can not create VideoRender");
hr= pGraph->AddFilter(pVideoRenderer,L"VideoRender");
CHECK_HR(hr,"Can not add VideoRender");
hr=pGraph->ConnectDirect(GetPin(pMic,L"Capture"),GetPin(pDin,L"Audio Input pin (rendered)"),NULL);
CHECK_HR(hr,"Can not adio connect");
hr=pGraph->ConnectDirect(GetPin(pUSB201,L"Запись"),GetPin(pUSB201,L"VMR Input0"),NULL);
CHECK_HR(hr,"Can not video connect");
return S_OK;
}
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
CComPtr<IGraphBuilder> graph;
graph.CoCreateInstance(CLSID_FilterGraph);
printf("Building graph...\n");
HRESULT hr=BuildGraph(graph);
if(hr==S_OK)
{
printf("Running\n");
CComQIPtr<IMediaControl, &IID_IMediaControl> mediaControl(graph);
hr=mediaControl->Run();
CHECK_HR(hr,"Can not RUN graph");
CComQIPtr<IMediaEvent, &IID_IMediaEvent> mediaEvent(graph);
BOOL stop=FALSE;
MSG msg;
while(!stop)
{
long ev=0, p1=0, p2=0;
Sleep(500);
printf(".");
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))DispatchMessage(&msg);
while(mediaEvent->GetEvent(&ev,&p1,&p2,0)==S_OK)
{
if(ev==EC_COMPLETE||ev==EC_USERABORT){printf("Done!\n");stop=TRUE;}
else if(ev==EC_ERRORABORT){printf("Error HRESULT %x\n",p1);mediaControl->Stop();stop=TRUE;}
mediaEvent->FreeEventParams(ev,p1,p2);
}
}
}
CoUninitialize();
return 0;
}
DirectShow
Код:
все нормально компилится, но при запуске доходит до функции
Код:
hr=pGraph->ConnectDirect(GetPin(pMic,L"Capture"),GetPin(pDin,L"Audio Input pin (rendered)"),NULL);
в ней GetPin(pDin,L"Audio Input pin (rendered)") отрабатывает нормально, а вот
GetPin(pMic,L"Capture") с ошибкой. Ошибка возникает здесь
Код:
while(pEnum->Next(1,&pPin,0)==S_OK)]
вместо S_OK получаю S_FALSE :( Как исправить?
Ну он тем самым говорит что там нету пинов
Цитата: Phodopus
Ну он тем самым говорит что там нету пинов
Интересно, а куда делись? Может есть разница при перечислении входящих и исходящих пинов? Никак не могу понять в чем ошибка?
А вы на стороннем вижуалайзере проверьте сначала
Цитата: Phodopus
А вы на стороннем вижуалайзере проверьте сначала
Огромное вам спасибо, что вы откликнулись. Не совсем понял, что есть "вижуалайзер"? Если вы имеете ввиду программу типа GraphEdit, то в нем все робит как надо. Да и код я этот не сам писал, а сгенерил с помощью кодогенератора GraphEdit немного допилив под VS 2010.