龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

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

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
方法代码如上。 LoadFromFile()方法有3个参数: const char * szFileName, IMultiMediaStream **ppMMStream和IDirectDraw *pDD 第一个参数是要提取的文件名。字符串常量。第二个

  方法代码如上。

  LoadFromFile()方法有3个参数:

const char * szFileName, IMultiMediaStream **ppMMStream和IDirectDraw *pDD

  第一个参数是要提取的文件名。字符串常量。第二个参数是多媒体流接口的指针的指针,是用来操纵多媒体流的。第三个参数是DirectDraw接口,将来播放时就是通过它的表面。

  首先声明一个IAMMultiMediaStream接口的指针,该接口的功能十分强大,这里只用了它的一部分:

  建立视频和音频流,再从文件中提取。

  然后调用CoCreateInstance方法来创建IAMMultiMediaStream的实例。该方法的第一个参数指定了全局标志(guid,下同),第四个参数指明要创建的接口的标志,第五个参数是创建好的实例返回付给pAMStream变量。

  接下来的两行代码是将char字符串转换成unicode,不必多言。

  然后初始化IAMMultiMediaStream,建立视频音频流。

  最后,也是最重要的一步:调用OpenFile()方法从文件中提取流。第一个参数是文件名,第二个参数是打开方式(具体请参考msdn)。

  这样就完成了流的提取工作。

  下面开始播放。

  这也是最复杂的工作(相对)。

  同样,建个方法封装代码。

HRESULT 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();
}

精彩图集

赞助商链接