Direct Show播放avi,flv等格式视频以及对IVideoWindow窗体的操作

其实用DirectShow(下面简称DS)播放视频动画和播放音乐相似的。

我就综述为以下4个主要主要步骤:

1.初始化com

2.载入媒体文件

3.视频的播放

4.清除程序

如果了解这些操作可以不看下面的代码:可以直接看看对IVideoWindow窗体的操作。

1.初始化com

先加载头文件和链接,和播放音乐的一样。

#include <dshow.h>
#pragma comment(lib,"strmiids.lib")//这个是用来识别

//4个多媒体接口(滤波器,控制器,事件监听器,视频窗口)
IGraphBuilder* pGraphBuilder=NULL; // 图像过滤器
IMediaControl* pMediaControl=NULL;  // 控制器
IMediaEventEx* pMediaEventEx=NULL;  //触发的事件
IVideoWindow* pVW = NULL;//视频窗口

/*******************************com初始化************************************/

CoInitialize(NULL);
 // DirectShow初始化
 if(FAILED(CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(LPVOID*)&pGraphBuilder)))
 {
  MessageBox(0,TEXT("创建滤波器失败!"),0,0);
  return E_FAIL;
 }
 pGraphBuilder->QueryInterface(IID_IMediaControl,(LPVOID*)&pMediaControl);
 pGraphBuilder->QueryInterface(IID_IVideoWindow,(LPVOID*)&pVW);
 pGraphBuilder->QueryInterface(IID_IMediaEventEx,(LPVOID*)&pMediaEventEx);

 

/*******************************com初始化************************************/

2.载入文件

CStringW strFile = "      ";//你的视频地址

//如果需要CStringA和CStringW的转换,点击这里看代码http://blog.csdn.net/bojie5744/article/details/26160679

 pGraphBuilder->RenderFile(strFile,NULL);//读取流文件

 

3.播放动画

 pMediaControl->Run();//播放

 

4.最后清理程序

if( pGraphBuilder )      { pGraphBuilder -> Release(); pGraphBuilder = NULL; }
if( pMediaControl )     { pMediaControl -> Release(); pMediaControl = NULL; }
if( pMediaEventEx )   { pMediaEventEx -> Release(); pMediaEventEx = NULL; }
if( pVW ) 
 {
 pVW -> put_Visible(OAFALSE);
 pVW -> Release();
 pVW = NULL;
    }
 CoUninitialize();

//这里要记得释放之后给那4个指针赋值NULL,不然你的if条件没作用。

 

然后上面的操作基本代码就是这样子了,那就谈谈,究竟怎么关闭那个IVideoWindow窗体?

其实释放步骤的代码就是关闭IVideoWindow窗体的实现代码。

然后,很多时候,我们需要把这个IVideoWindow窗体变成为无边框的窗口嵌入在父窗口中。

实现代码如下:

HWND h = ::FindWindowA(NULL,"DX媒体播放器");//寻找父窗口句柄

//DX媒体播放器 为你的父窗口的标题名字

 pVW ->put_Owner((OAHWND)h);       //把窗口嵌入在父窗口中
 pVW ->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS |WS_CLIPCHILDREN);//设置渲染器的窗口属性
 pVW ->SetWindowPosition(0,0,800,600);//窗口的大小

然后就实现了我们需求。

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
DirectShow是一个Microsoft Windows平台上的多媒体框架,用于播放和处理音频和视频文件。它提供了一个基于图形的编程模型,可以使用该模型构建复杂的多媒体处理应用程序。 以下是使用DirectShow播放视频的一些步骤: 1. 创建一个DirectShow的GraphBuilder对象,该对象用于构建多媒体处理图形。 2. 使用GraphBuilder对象的RenderFile方法来加载视频文件并将其渲染到视频窗口。 3. 创建一个视频窗口,该窗口用于显示视频。 4. 创建一个事件循环,该循环用于处理DirectShow的各种事件。 5. 在事件循环中,处理DirectShow的各种事件,例如播放、暂停、停止视频等。 6. 最后,在程序退出时,释放DirectShow对象和资源。 下面是一个使用DirectShow播放视频的示例代码: ``` #include <windows.h> #include <dshow.h> #pragma comment(lib, "strmiids.lib") int main() { // 初始化COM库 CoInitialize(NULL); // 创建GraphBuilder对象 IGraphBuilder* pGraphBuilder = NULL; CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraphBuilder); // 加载视频文件并渲染到视频窗口 WCHAR* szFile = L"test.avi"; pGraphBuilder->RenderFile(szFile, NULL); // 创建视频窗口 HWND hWnd = CreateWindow(L"Static", L"Video", WS_OVERLAPPEDWINDOW, 0, 0, 640, 480, NULL, NULL, NULL, NULL); // 获取视频窗口的接口指针 IVideoWindow* pVideoWindow = NULL; pGraphBuilder->QueryInterface(IID_IVideoWindow, (void**)&pVideoWindow); // 设置视频窗口的位置和大小 pVideoWindow->put_Owner((OAHWND)hWnd); pVideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN); pVideoWindow->put_MessageDrain((OAHWND)hWnd); pVideoWindow->SetWindowPosition(0, 0, 640, 480); // 播放视频 IMediaControl* pMediaControl = NULL; pGraphBuilder->QueryInterface(IID_IMediaControl, (void**)&pMediaControl); pMediaControl->Run(); // 创建事件循环 MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } // 停止播放并释放资源 pMediaControl->Stop(); pMediaControl->Release(); pVideoWindow->put_Visible(OAFALSE); pVideoWindow->put_Owner(NULL); pVideoWindow->Release(); pGraphBuilder->Release(); CoUninitialize(); return 0; } ``` 注意:上述示例代码中的视频窗口使用Windows API的CreateWindow函数创建,因此需要包含Windows.h头文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢吃一口烤肉的啵啵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值