DirectShow
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:\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);
"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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗