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

DirectShow的更多相关文章

  1. win7 x64 vs2010 directShow开发环境配置

    近来工作需要,要用dirrectShow写一个视频播放的demo验证自己的想法.开发环境配置了好久都没有成功,最后终于弄完,现在记录下来,以后有同学遇到同样问题,可以以此法解决. windows SD ...

  2. DirectShow+VS2010+Win7配置说明

    不得不说,使用windows的东西确实很麻烦,DirectShow这个东西不断更新换代,书本上的知识完全跟不上时代,只能去博客上查资料.百度之后,看了大量的文章,终于完成了自己的DirectShow安 ...

  3. DirectShow Filter的开发实践

    一.介绍 摄像头图像采集处理在业界有着多种成熟的方案.从老的DirectShow.Grabber技术,到新的Windows Media Foundation框架,网络上都有着丰富的参考资料.OpenC ...

  4. 在DirectShow中支持DXVA 2.0(Supporting DXVA 2.0 in DirectShow)

    这几天在做dxva2硬件加速,找不到什么资料,翻译了一下微软的两篇相关文档.并准备记录一下用ffmpeg实现dxva2,将在第三篇写到.这是第二篇.,英文原址:https://msdn.microso ...

  5. DirectShow开发快速入门之慨述

    摘要:本篇文档概括性的介绍了DirectShow的主要组成部分,以及一些Directshow的基本概念.熟悉这些基本的知识对于Directshow的应用开发或者过滤器的开发者都会有所帮助. Direc ...

  6. DirectShow .Net 实现视频

    DirectShow .Net 实现视频 .获取视频采集设备IBaseFilter接口对象的方法 //获取所有视频设备名称 public ArrayList GetVideoInputDevice() ...

  7. 转:最简单的基于 DirectShow 的视频播放器

    50行代码实现的一个最简单的基于 DirectShow 的视频播放器 本文介绍一个最简单的基于 DirectShow 的视频播放器.该播放器对于初学者来说是十分有用的,它包含了使用 DirectSho ...

  8. 转:Directshow开发的一些例子

    DirectShow Filter 开发典型例子分析 --字幕叠加 (FilterTitleOverlay)1 本文分析一下<DirectShow开发指南>中的一个典型的Transform ...

  9. DirectShow程序运行过程简析

    这段时间一直在学习陆其明老师的<DirectShow开发指南>一书,书中对DirectShow的很多细节讲解清晰,但是却容易让人缺少对全局的把握.在学习过程中,整理了关于DirectSho ...

随机推荐

  1. 【CityHunter】通过Unity3D来制作游戏中AR部分的内容

    嗯,最近再考虑,CityHunter中,玩家攻略藏宝图时,为了增加可玩性,应该增强在AR部分的游戏性.最近特别火的游戏<Pokemon Go>在打开摄像头以后,可以看到小精灵,实际上,如果 ...

  2. Git------Win7系统使用TortoiseGit

    转载: https://my.oschina.net/longxuu/blog/141699?p=1 此步可以省略 1.点击TortoiseGit->PuTTygen 2.点击"Gen ...

  3. web前端各大技术都能实现什么功能

    web前端各大技术都能实现什么功能 以下是孜然为你总结的web前端开发你必须要一项一项掌握的技术:Html.css.ajax.jquery.extjs.JavaScript,今天为你详细解读他们各自都 ...

  4. eclipse安装Eclipse Memory Analyzer插件

    在Install New software中输入 http://archive.eclipse.org/mat/1.2/update-site/ 然后选择Memory Analyzer for Ecl ...

  5. 获取APP最新版本的接口案例

    思路: 开发初期.安卓的应用可能没有上传到应用市场,可以把应用apk放到服务器上,供用户下载.把对应用的版本信息整理成为一个XML文件,放到服务器上,通过接口读取xml文件,获取有版本信息,然后安卓端 ...

  6. 微信"流量红包"的玩法攻略 广东移动用户有福啦

    前面我们说了广东移动联合微信正式推出流量红包业务,移动终于hold不住了,想要借此挽回一些些损失.只可惜,现在只是广东小范围测试,其他地区的用户暂时还没有这等福利.那么微信"流量红包&quo ...

  7. PHP变量入门教程(1)基础

    基础 PHP 中一个美元符号后面跟上一个变量名称,即表示一个变量.变量的名称是对大小写敏感的. 变量名与 PHP 中其它的标签一样遵循相同的规则.一个有效的变量名由字母或者下划线开头,后面跟上任意数量 ...

  8. MySQL数据类型 int(M) 表示什么意思?详解mysql int类型的长度值问题

    MySQL 数据类型中的 integer types 有点奇怪.你可能会见到诸如:int(3).int(4).int(8) 之类的 int 数据类型.刚接触 MySQL 的时候,我还以为 int(3) ...

  9. Shell入门教程:算术运算

    Bash的算术运算有以下几种方法: 序号 名称 语法 范例 1 算术扩展 $((算术式)) r=$((2+5*8)) 2 使用外部程序 expr 算术式 r=`expr 4 + 5` 3 使用 $[] ...

  10. java笔记--关于线程同步(7种同步方式)

    关于线程同步(7种方式) --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3897440.html"谢谢-- 为何要使用同步? ...