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
的形式单独发布。
2.下载安装
这里使用了DirectX9.0b,下载地址为:
假设DirectX SDK安装在D:\DXSDK目录下,开发环境使用VC++6.0。
在这个版本的DirectX SDK中,DirectShow SDK的库文件STRMBASE.lib需要自己编译,位置在:D:\DXSDK\Samples\C++\DirectShow\BaseClasses目录下。
3.设置VC++6.0环境
添加D:\DXSDK\Include到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);
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);
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