16,472
社区成员
发帖
与我相关
我的任务
分享
//**申明的参数*****************
private:
void AddToObjectTable(void);
bool QueryInterfaces(void);
void RemoveFromObjectTable(void);
DWORD mObjectTableEntry;
IBasicAudio* mBasicAudio;
IMediaEventEx* mEvent;
IGraphBuilder* mGraph;
IVideoWindow* mVideoWindow;
IMediaSeeking* mSeeking;
IMediaControl* mMediaControl;
IBaseFilter *pSrc;
IBaseFilter *pGrabberF;
ISampleGrabber *pGrabber;
IBaseFilter *pNull;
//**建立图表的初始化方法************
bool CDXGraph::Create(void)
{ // 如果没有创建mGraph指针,创建一个,并初始化
HRESULT hr;
DWORD dwRegister;
if (!mGraph)
{
if (SUCCEEDED(CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&mGraph))) // 创建未经初始化的mGraph
{
hr = CoCreateInstance(CLSID_SampleGrabber,NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pGrabberF);
hr = pGrabberF->QueryInterface(IID_ISampleGrabber,reinterpret_cast<void**>(&pGrabber));
hr = mGraph->AddFilter(pGrabberF, L"Sample Grabber");
AddToObjectTable(); // 添加进去
return QueryInterfaces();
#ifdef _DEBUG
hr = AddToRot(mGraph, &dwRegister);
#endif
}
mGraph = 0;
}
return false;
}
//**连接其他filter和开始播放文件的方法***********************
bool CDXGraph::RenderFile(const char *inFile)
{
HRESULT hr;
if (mGraph)//类IGraphBuilder
{
WCHAR szFilePath[MAX_PATH];//wide characer(16-bit);MAX_PATH=260
MultiByteToWideChar(CP_ACP, 0, inFile, -1, szFilePath, MAX_PATH);//字符转换mFilterGraph=>szFilePath
hr = mGraph->AddSourceFilter(szFilePath, L"Source", &pSrc);
hr = mGraph->AddFilter(pDecoder,L"Xvid MPEG-4 Video Decoder");
hr = ConnectFilters(mGraph, pSrc, pGrabberF);
if (!SUCCEEDED(hr))
{
return false;
}
// 找到当前的色深
HDC hdc = GetDC(NULL);
int iBitDepth = GetDeviceCaps(hdc, BITSPIXEL);
ReleaseDC(NULL, hdc);
// 设置媒体类型
AM_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
mt.majortype = MEDIATYPE_Video;
switch (iBitDepth)
{
case 8:
mt.subtype = MEDIASUBTYPE_RGB8;
break;
case 16:
mt.subtype = MEDIASUBTYPE_RGB555;
break;
case 24:
mt.subtype = MEDIASUBTYPE_RGB24;
break;
case 32:
mt.subtype = MEDIASUBTYPE_RGB32;
break;
default:
return E_FAIL;
}
hr = pGrabber->SetMediaType(&mt);
hr = CoCreateInstance(CLSID_NullRenderer, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void**)&pNull);
hr = mGraph->AddFilter(pNull, L"Null Render Filter");
hr = ConnectFilters(mGraph, pGrabberF, pNull);
hr = pGrabber->SetOneShot(TRUE);
hr = pGrabber->SetBufferSamples(TRUE);
}
return false;
}