1 最简单的DirectShow应用程序 — 播放视频
1.简介
DirectShow是DirectX中的一套处理媒体播放、音视频采集的开发包,在DirectX SDK Summer 2004(DirectX9.0C SDK的第一个版本,下载地址:http://download.microsoft.com/download/7/e/9/7e9f48c6-f28a-469b-9b8e-cc84032efbd4/
dxsdk_sum2004.exe)之前的DirectX SDK中都包含有DirectShow SDK,之后的DirectShow SDK以Extras的形式单独发布。
DirectShow是DirectX中的一套处理媒体播放、音视频采集的开发包,在DirectX SDK Summer 2004(DirectX9.0C SDK的第一个版本,下载地址:http://download.microsoft.com/download/7/e/9/7e9f48c6-f28a-469b-9b8e-cc84032efbd4/
dxsdk_sum2004.exe)之前的DirectX SDK中都包含有DirectShow SDK,之后的DirectShow SDK以Extras的形式单独发布。
2.下载安装
这里使用了DirectX9.0b,下载地址为:
假设DirectX
SDK安装在D:DXSDK目录下,开发环境使用VC++6.0。
在这个版本的DirectX
SDK中,DirectShow
SDK的库文件STRMBASE.lib需要自己编译,位置在:D:DXSDKSamplesC++DirectShowBaseClasses目录下。
3.设置VC++6.0环境
添加D:DXSDKInclude到Include
files目录列表中。
4.最简单的DirectShow应用程序 -
播放视频文件
#include
<windows.h>
#include
<DShow.h>
#pragma
comment(lib,"Strmiids.lib")
int
__stdcall WinMain(
HINSTANCE
hInstance,
HINSTANCE
hPrevInstance,
LPSTR
lpCmdLine,
int
nShowCmd
)
{
//本例来自DirectX
SDK:How
To Play a File
IGraphBuilder
*pGraph
=
NULL;
IMediaControl
*pControl
=
NULL;
IMediaEvent
*pEvent
=
NULL;
//
初始化COM库.
HRESULT
hr
=
CoInitialize(NULL);
if
(FAILED(hr))
{
MessageBox(NULL,"ERROR
- Could not initialize COM
library",
"Warning",MB_OK|MB_ICONWARNING);
"Warning",MB_OK|MB_ICONWARNING);
return
-1;
}
//
Create the filter graph manager and query for
interfaces.
hr
=
CoCreateInstance(CLSID_FilterGraph,
NULL,
CLSCTX_INPROC_SERVER,
IID_IGraphBuilder,
(void
**)&pGraph);
if
(FAILED(hr))
{
MessageBox(NULL,"ERROR
- Could not create the Filter Graph Manager.",
"Warning",MB_OK|MB_ICONWARNING);
return
-1;
}
hr
=
pGraph->QueryInterface(IID_IMediaControl,
(void
**)&pControl);
hr
=
pGraph->QueryInterface(IID_IMediaEvent,
(void
**)&pEvent);
// Build
the graph. IMPORTANT: Change this string to a file on your
system.
hr
=
pGraph->RenderFile(
L"E:\Movie\2012\[2012].2012.2009.R5-CD2-人人影视.rmvb", NULL);
L"E:\Movie\2012\[2012].2012.2009.R5-CD2-人人影视.rmvb", NULL);
if
(SUCCEEDED(hr))
{
// Run
the graph.
hr
=
pControl->Run();
if
(SUCCEEDED(hr))
{
// Wait
for completion.
longevCode;
pEvent->WaitForCompletion(INFINITE,
&evCode);
}
}
pControl->Release();
pEvent->Release();
pGraph->Release();
CoUninitialize();
return
0;
}
2 DirectShow原理
DirectShow使用Filter Graph模型来管理整个数据流的处理过程,它是一系列Filter构成的一条流水线,其中的每个Filter都是COM组件。
Filter主要有几个大类:
a.源Filter:负责读取数据;
b.转换Filter:负责转换数据的格式,常见的视频解码器就是转换Filter;
c.渲染Filter:负责输出数据,如播放或存盘操作。
每个Filter都有一个或几个引脚,各个Filter通过这些引脚相连形成一个Filter Graph。
DirectX9.0 SDK中提供了一个工具GraphEdit,它可以演示Filter之间的连接关系,并执行这个Filter Graph。
下面用GraphEdit来展示一个rmvb文件的播放过程:
真正开发的时候,其实就是把这个图用代码描述出来。
文章转自C++学习视频资料:http://blog.sina.com.cn/s/blog_4d8205e40100q4h2.html