游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3031|回复: 6

directshow问题?

[复制链接]

4

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2004-5-26 18:27:00 | 显示全部楼层 |阅读模式
我想在一游戏前加入片头动画,如下:(游戏用directx9制作)
game()
{
     ……;
     ShowMovie();
     ……;
}

showMovie()
{
     IGraphBuilder *pGraph= NULL;
     IMediaControl *pMediaControl= NULL;
     IMediaEventEx *pEvent= NULL;
     IVideoWindow  *pWindow= NULL;

    CoInitialize(NULL);
   
    //建立Media对象
    CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
                        IID_IGraphBuilder, (void **)&pGraph);
    pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);
        pGraph->QueryInterface(IID_IMediaEventEx, (void **)&pEvent);
        pGraph->QueryInterface(IID_IVideoWindow, (void **)&pWindow);
  
    //读取媒体文件
    pGraph->RenderFile(L"test.avi", NULL);

        pEvent->SetNotifyWindow((OAHWND)m_hWnd,WM_GRAPHNOTIFY, 0);

    //绘制动画
    pMediaControl->Run();

    //等待动画播放结束
    long evCode;
    pEvent->WaitForCompletion(INFINITE, &evCode);

    //清除对象
    pEvent->Release();
    pMediaControl->Release();
    pGraph->Release();
       
    CoUninitialize();
}

执行后,可运行,但和游戏是两个窗口,且非全屏,能不能放在同一个全屏窗口中先播放视频,再执行游戏,即放到同一个DirectDraw表面执行?
另外,游戏中切换出来,再进入,整个屏幕变白,是怎么回事?

85

主题

824

帖子

878

积分

高级会员

Rank: 4

积分
878
QQ
发表于 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();
}

47

主题

145

帖子

3602

积分

论坛元老

Rank: 8Rank: 8

积分
3602
发表于 2004-5-26 18:39:00 | 显示全部楼层

Re:directshow问题?

18

主题

631

帖子

660

积分

高级会员

Rank: 4

积分
660
发表于 2004-5-27 11:45:00 | 显示全部楼层

Re:directshow问题?

记得有文章专门讲来着。

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2004-5-27 14:29:00 | 显示全部楼层

Re:directshow问题?

高手,
pSample->Update(0, NULL, NULL, NULL);
能不能问一下,这个函数的4个参数分别是什么意思吗?
还有,怎么控制让他停下来,好象停不了!

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2004-5-27 20:18:00 | 显示全部楼层

Re:directshow问题?

请高手解答一下,为什么不能用LPDIRECTDRAW7
而一定要用LPDIRECTDRAW呢??

85

主题

824

帖子

878

积分

高级会员

Rank: 4

积分
878
QQ
发表于 2004-5-27 22:00:00 | 显示全部楼层

Re:directshow问题?

如果要停下来,就
while (pSample->Update(0, NULL, NULL, NULL) == S_OK)
{
  if(判断停止的条件) break;
}
至于LPDIRECTDRAW7使用的话,好象要用到AddRef()吧,
马上要终考了,没时间试了,自己试试看吧,
顺便说一句,
我是在MSDN2003中找到播放视频的方法的,
其实MSDN中还有很多好东西值得去挖掘,
常听有人说某某书写得如何如何好啦,如何如何深入啦,
其实MSDN写得更深入,更全,
只是像这些东西大多是E文的,
所以E文不好的还是要咬咬牙把它学好啊!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-7-1 08:36

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表