|
发表于 2004-5-26 18:33:00
|
显示全部楼层
Re:directshow问题?
void Playavi(char *szFileName)
{
IMediaStream *pPrimaryVidStream;
IDirectDrawMediaStream *pDDStream;
IDirectDrawStreamSample *pSample;
DDSURFACEDESC ddsd2;
LPDIRECTDRAW pDD;
LPDIRECTDRAWSURFACE pPrimarySurface;
IMultiMediaStream *pMMStream;
DirectDrawCreate(NULL,&pDD,NULL);
pDD->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN);
pDD->SetDisplayMode(640,480,32);
ddsd2.dwSize = sizeof(ddsd2);
ddsd2.dwFlags = DDSD_CAPS;
ddsd2.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
pDD->CreateSurface(&ddsd2, &pPrimarySurface, NULL);
CoInitialize(NULL);
IAMMultiMediaStream *pAMStream;
CoCreateInstance(CLSID_AMMultiMediaStream, NULL, CLSCTX_INPROC_SERVER, IID_IAMMultiMediaStream, (void **)&pAMStream);
WCHAR wPath[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, szFileName ,-1, wPath, sizeof(wPath)/sizeof(wPath[0]));
pAMStream->Initialize(STREAMTYPE_READ, AMMSF_NOGRAPHTHREAD, NULL);
pAMStream->AddMediaStream(pDD, &MSPID_PrimaryVideo, 0, NULL);
pAMStream->AddMediaStream(NULL, &MSPID_PrimaryAudio, AMMSF_ADDDEFAULTRENDERER, NULL);
if(FAILED(pAMStream->OpenFile(wPath, 0))){MessageBox (hWnd,"视频文件读取错误!","错误!",MB_OK);exit(1);};
pMMStream = pAMStream;
if(FAILED(pMMStream->GetMediaStream(MSPID_PrimaryVideo, &pPrimaryVidStream))) {MessageBox (hWnd,"视频错误!","错误!",MB_OK);exit(1);};
if(FAILED(pPrimaryVidStream->QueryInterface(IID_IDirectDrawMediaStream, (void **)&pDDStream))) {MessageBox (hWnd,"视频错误!","错误!",MB_OK);exit(1);};
ddsd2.dwSize = sizeof(ddsd2);
if(FAILED(pDDStream->GetFormat(&ddsd2, NULL, NULL, NULL))) {MessageBox (hWnd,"视频错误!","错误!",MB_OK);exit(1);};
RECT rect;
rect.top =0;
rect.left =0;
rect.bottom = 480;
rect.right = 640;
if(FAILED(pDDStream->CreateSample(pPrimarySurface, &rect, 0, &pSample))) {MessageBox (hWnd,"视频错误!","错误!",MB_OK);exit(1);};
if(FAILED(pMMStream->SetState(STREAMSTATE_RUN))) {MessageBox (hWnd,"视频错误!","错误!",MB_OK);exit(1);};
while (pSample->Update(0, NULL, NULL, NULL) == S_OK);
pMMStream->SetState(STREAMSTATE_STOP);
pMMStream->Release();
pMMStream=NULL;
pPrimarySurface->Release();
pPrimarySurface=NULL;
pSample->Release();
pSample=NULL;
pDDStream->Release();
pDDStream=NULL;
pPrimaryVidStream->Release();
pPrimaryVidStream=NULL;
pDD->Release();
pDD=NULL;
CoUninitialize();
} |
|