您的位置:首页 > 其它

DShow实现一个avi视频的播放(含有个人解释和注释)

2014-12-13 19:08 232 查看
此项目为win32下的控制台C++代码(别忘记配置DShow库)

// movie_test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <DShow.h>

#pragma comment(lib,"strmiids.lib")        // 也可以在属性里面添加

int _tmain(int argc, _TCHAR* argv[])
{
IGraphBuilder *pGraph = NULL;          // 图标管理器接口
IMediaControl *pControl = NULL;        // 媒体控制器接口
IMediaEvent *pEvent = NULL;           // 媒体事件接口

// 初始化com库
HRESULT hr = CoInitialize(NULL);
if(FAILED(hr))
{
printf("初始化com组件失败\n");
return -1;
}

// 创建滤波器链表管理器
hr = CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void **)&pGraph);
if(FAILED(hr))
{
printf("初始化com组件失败\n");
return -1;
}

//查询媒体控制和媒体事件接口
hr = pGraph->QueryInterface(IID_IMediaControl,(void **)&pControl);
hr = pGraph->QueryInterface(IID_IMediaEvent,(void **)&pEvent);

//建立链表,这里用户可以更改待播放的文件的名称
hr = pGraph->RenderFile(L"E:\\DXSDK\\DXSDK 9.0B\\Samples\\Media\\ruby.avi",NULL);
if(SUCCEEDED(hr))
{
//运行链表
hr = pControl->Run();
if(SUCCEEDED(hr))
{
//等待回放结束
long evCode;
pEvent->WaitForCompletion(INFINITE,&evCode);
// 切记:在实际应用中,不能使用INFINITE标识,因为他会不确定的阻塞程序
}
}

// 释放所有资源
pControl->Release();
pEvent->Release();
pGraph->Release();
CoUninitialize();
printf("this is example\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐