WEB开发网
开发学院软件开发VC 在VC中调用DirectShow全屏播放视频 阅读

在VC中调用DirectShow全屏播放视频

 2006-04-07 11:31:56 来源:WEB开发网   
核心提示: 由于DirectShow是基于COM的所以要用CoInitialize初始化COM,该方法很简单,只有一个参数且必须是NULL,在VC中调用DirectShow全屏播放视频(2),InitDDraw()的实现将在后面给出,析构方法中加入如下代码:void Uninit(){......if

由于DirectShow是基于COM的所以要用CoInitialize初始化COM,该方法很简单,只有一个参数且必须是NULL。

InitDDraw()的实现将在后面给出。

析构方法中加入如下代码:

void Uninit()
{
......
if(pMMStream!=NULL)
pMMStream->Release();
if(pPrimarySurface!=NULL)
pPrimarySurface->Release();
if(pDD!=NULL)
pDD->Release();
CoUninitialize();
}

初始化DirectDraw并建立DirectDraw表面:(由于DirectDraw不是本文的重点,原理请参考相关文献,现只给出代码)

不妨建立一个方法将这些工作统统包括:

HRESULT InitDDraw()
{
HRESULT r;
if(FAILED(r=DirectDrawCreate(NULL, &pDD, NULL)))
return r;
if(FAILED(r=pDD->SetCooperativeLevel(hWnd,
DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN)))
return r;
if(FAILED(r=pDD->SetDisplayMode(640,480,16))) //分辨率设置
return r;
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
if(FAILED(pDD->CreateSurface(&ddsd, &pPrimarySurface, NULL)))
return r;
return S_OK;
}

接下来的一步将从文件中提取视频流。

不妨也建立一个方法将工作封装。

HRESULT LoadFromFile(const char * szFileName, IMultiMediaStream **ppMMStream,
IDirectDraw *pDD)
{
HRESULT r;
IAMMultiMediaStream *pAMStream;
if(FAILED(r=CoCreateInstance(CLSID_AMMultiMediaStream, NULL,
CLSCTX_INPROC_SERVER,
IID_IAMMultiMediaStream, (void **)&pAMStream)))
return r;
WCHAR wPath[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, szFileName, -1, wPath,
sizeof(wPath)/sizeof(wPath[0]));
if(FAILED(r=pAMStream->Initialize(STREAMTYPE_READ, AMMSF_NOGRAPHTHREAD,
NULL)))
return r;
if(FAILED(r=pAMStream->AddMediaStream(pDD, &MSPID_PrimaryVideo, 0, NULL)))
return r;
if(FAILED(r=pAMStream->AddMediaStream(NULL, &MSPID_PrimaryAudio,
AMMSF_ADDDEFAULTRENDERER, NULL)))
return r;
if(FAILED(r=pAMStream->OpenFile(wPath, 0)))
return r;
*ppMMStream = pAMStream;
return S_OK;
}

上一页  1 2 3 4  下一页

Tags:VC 调用 DirectShow

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接