现已能使媒体文件独占屏幕,但其不能全屏播放,意思就是左上角是播放的媒体文件,其他地方是空白,请教各位老大如何让媒体文件全屏播放
程序代码如下:
IMultiMediaStream *pMMStream;
IDirectDraw *pDD;
IDirectDrawSurface *pPrimarySurface;
DDSURFACEDESC ddsd;void canvasFrame::InitDH()//初始化directshow
{
pDD=NULL;
pPrimarySurface=NULL;
pMMStream=NULL;
// ZeroMemmory(ddsd,sizeof(ddsd)); //HRESULT r;
//初始化COM
CoInitialize(NULL);
//初始化DirectDraw
InitDDraw();
}HRESULT canvasFrame::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;
} void canvasFrame::Play(IDirectDrawSurface *pSurface, IMultiMediaStream *pMMStream)//播放媒体文件
{
IMediaStream *pPrimaryVidStream;
IDirectDrawMediaStream *pDDStream;
IDirectDrawStreamSample *pSample;
RECT rect;
DDSURFACEDESC ddsd; pMMStream->GetMediaStream(MSPID_PrimaryVideo, &pPrimaryVidStream);
pPrimaryVidStream->QueryInterface(IID_IDirectDrawMediaStream, (void **)
&pDDStream);
ddsd.dwSize = sizeof(ddsd);
pDDStream->GetFormat(&ddsd, NULL, NULL, NULL); rect.top =100;
rect.left =150;
rect.bottom = ddsd.dwHeight+100;
rect.right = ddsd.dwWidth+150; pDDStream->CreateSample(pSurface, &rect, 0, &pSample);
pMMStream->SetState(STREAMSTATE_RUN); while (pSample->Update(0, NULL, NULL, NULL) == S_OK)
; pMMStream->SetState(STREAMSTATE_STOP);
pSample->Release();
pDDStream->Release();
pPrimaryVidStream->Release();
} HRESULT canvasFrame::InitDDraw()//初始化directdraw
{
HRESULT r;
if(FAILED(r=DirectDrawCreate(NULL, &pDD, NULL)))
return r;
//DD->SetCooperativeLevel(m_hWnd,DDSCL_EXCLUSIVE |DDSCL_FULLSCREEN|DDSCL_ALLOWREBOOT );
pDD->SetCooperativeLevel(m_hWnd,DDSCL_EXCLUSIVE |
DDSCL_FULLSCREEN|DDSCL_ALLOWREBOOT );
if(FAILED(r=pDD->SetDisplayMode(640,480,256))) //分辨率设置
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; } void canvasFrame::Uninit()
{
if(pMMStream!=NULL)
pMMStream->Release();
if(pPrimarySurface!=NULL)
pPrimarySurface->Release();
if(pDD!=NULL)
pDD->Release(); CoUninitialize();
}
程序代码如下:
IMultiMediaStream *pMMStream;
IDirectDraw *pDD;
IDirectDrawSurface *pPrimarySurface;
DDSURFACEDESC ddsd;void canvasFrame::InitDH()//初始化directshow
{
pDD=NULL;
pPrimarySurface=NULL;
pMMStream=NULL;
// ZeroMemmory(ddsd,sizeof(ddsd)); //HRESULT r;
//初始化COM
CoInitialize(NULL);
//初始化DirectDraw
InitDDraw();
}HRESULT canvasFrame::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;
} void canvasFrame::Play(IDirectDrawSurface *pSurface, IMultiMediaStream *pMMStream)//播放媒体文件
{
IMediaStream *pPrimaryVidStream;
IDirectDrawMediaStream *pDDStream;
IDirectDrawStreamSample *pSample;
RECT rect;
DDSURFACEDESC ddsd; pMMStream->GetMediaStream(MSPID_PrimaryVideo, &pPrimaryVidStream);
pPrimaryVidStream->QueryInterface(IID_IDirectDrawMediaStream, (void **)
&pDDStream);
ddsd.dwSize = sizeof(ddsd);
pDDStream->GetFormat(&ddsd, NULL, NULL, NULL); rect.top =100;
rect.left =150;
rect.bottom = ddsd.dwHeight+100;
rect.right = ddsd.dwWidth+150; pDDStream->CreateSample(pSurface, &rect, 0, &pSample);
pMMStream->SetState(STREAMSTATE_RUN); while (pSample->Update(0, NULL, NULL, NULL) == S_OK)
; pMMStream->SetState(STREAMSTATE_STOP);
pSample->Release();
pDDStream->Release();
pPrimaryVidStream->Release();
} HRESULT canvasFrame::InitDDraw()//初始化directdraw
{
HRESULT r;
if(FAILED(r=DirectDrawCreate(NULL, &pDD, NULL)))
return r;
//DD->SetCooperativeLevel(m_hWnd,DDSCL_EXCLUSIVE |DDSCL_FULLSCREEN|DDSCL_ALLOWREBOOT );
pDD->SetCooperativeLevel(m_hWnd,DDSCL_EXCLUSIVE |
DDSCL_FULLSCREEN|DDSCL_ALLOWREBOOT );
if(FAILED(r=pDD->SetDisplayMode(640,480,256))) //分辨率设置
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; } void canvasFrame::Uninit()
{
if(pMMStream!=NULL)
pMMStream->Release();
if(pPrimarySurface!=NULL)
pPrimarySurface->Release();
if(pDD!=NULL)
pDD->Release(); CoUninitialize();
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货