DirectShow 应用开发过程
开发环境:Win10 + VS2015
本文先介绍 DirectShow 中使用的基本术语和概念,然后就可以编写第一个 DirectShow 应用程序。这是一个播放音频或视频文件的简单控制台应用程序,虽然程序只有几行,但它演示了 DirectShow 编程的一些重要功能。
一、开发环境的配置
我们先来介绍一下 DirectShow 应用程序开发环境的配置。
1.1 需要包含的头文件
DirectShow SDK 建议,所有的 DirectShow 应用都需要 Dshow.h 这个头文件,某些 DirectShow 接口需要附加的头文件,参考接口的说明视具体情况定。
1.2 需要包含的库文件
DirectShow SDK 建议,DirectShow 应用程序应该至少连接库文件 Strmiids.lib 和 Quartz.lib。
- Strmiids.lib:定义了 DirectShow 标准的类标识(CLSID)和接口标识(IID)。
- Quartz.lib:定义了导出函数 AMGetErrorText,如果不调用此函数,此库不是必需的。
1.3 VC++ 的系统编译环境
确保 DirectShow SDK 的 Include 目录和 Lib 目录都已经加入了 VC++ 的系统编译环境。一般安装完 Visual Studio 即会自动配置。
二、一般开发过程
开发 DirectShow 应用程序,一般都有三个阶段,如下图:

第一阶段,创建一个 Filter Graph Manager 组件,代码如下:
IGraphBuilder *pGraph = NULL;
HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **)&pGraph);
第二阶段,根据实际的应用,创建一条完整的 Filter 链路,比如播放一个本地文件,最简单快速的代码如下:
hr = pGraph->RenderFile(L"D:\\test.avi", NULL);
第三阶段,调用 Filter Graph Manager 上(或者直接在某个 Filter 上)的各个接口方法进行控制,并且完成 Filter Graph Manager 与应用程序的事件交互。比如调用 IMediaControl 接口方法控制 Filter Graph 的状态转换,代码如下:
IMediaControl *pControl = NULL;
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = pControl->Run();
处理完成后,应用程序要释放 Filter Graph Manager 和所有 Filter。
三、第一个 DirectShow 应用程序
创建工程:文件 -> 新建 -> 项目 -> Win32 控制台应用程序,注意包括头文件 Dshow.h 并链接到静态库文件 strmiids.lib。完整实例代码如下:
#include "stdafx.h"
#include <dshow.h>
// 用到的DirectShow SDK链接库
#pragma comment(lib,"strmiids.lib")
int _tmain(int argc, _TCHAR* argv[])
{
IGraphBuilder *pGraph = NULL; // Filter Graph Manager(实例)
IMediaControl *pControl = NULL; // 媒体控制
IMediaEvent *pEvent = NULL; // 媒体事件
// (一)初始化COM库
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
printf("错误 - 无法初始化 COM 组件");
return -1;
}
// (二)创建Filter Graph Manager
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);
if (FAILED(hr))
{
printf("错误 - 无法创建 Filter Graph Manager.");
return -1;
}
// (三)查询媒体控制和媒体事件接口
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
// (四)建立Graph,在这里你可以更改待播放的文件名称
hr = pGraph->RenderFile(L"test.mp4", NULL);
if (SUCCEEDED(hr))
{
// 运行Graph.
hr = pControl->Run();
if (SUCCEEDED(hr))
{
// IMediaEvent接口用于等待播放完成
long evCode;
pEvent->WaitForCompletion(INFINITE, &evCode);
// 切记: 在实际应用当中,不能使用INFINITE标识, 因为它会不确定的阻塞程序
}
}
// (五)释放接口指针并关闭COM库
pControl->Release();
pEvent->Release();
pGraph->Release();
CoUninitialize();
return 0;
}
pControl->Run()运行 Graph,数据在 Filter 中移动并呈现为视频和音频。播放发生在单独的线程上。您可以通过调用 IMediaEvent :: WaitForCompletion 方法来等待播放完成。该方法将阻塞,直到文件播放完毕或经过指定的超时间隔为止。值 INFINITE 意味着应用程序将无限期阻塞,直到文件播放完毕。
运行程序播放 "test.mp4" 的效果图如下:

代码下载(VC2015):Github - DShow_simpleVideo
参考:
MSDN - DirectShow Application Programming
DirectShow 应用开发过程的更多相关文章
- TODO:小程序开发过程之体验者
TODO:小程序开发过程之体验者 1. 小程序开发过程,先下载开发者并安装开发者工具,现在腾讯开放测试了,普通用户也可以登录开发者工具,如图普通用户登录为调试类型,但是只能建立无AppID的项目 如果 ...
- Atitit各种SDM 软件开发过程SDP sdm的ddd tdd bdd设计
Atitit各种SDM 软件开发过程SDP sdm的ddd tdd bdd设计 1.1. software development methodology (also known as SDM 1 1 ...
- 一些关于angularJS的自己学习和开发过程中遇到的问题及解决办法
这篇文章也许会不定时更新,主要记录这段时间内自己遇到的angularjs学习开发的一些问题的解决办法.本文以摘抄为主,主要目的还是将自己遇到的困惑在各个地方查到的解决办法的汇总,给自己留个备忘吧. 1 ...
- 【转】UML图与软件开发过程那点关系
首先,软工文档, 软工文档,也就是计划,设计,描述,使用软件的一些文件,它最大的特点就是固定不变,用来给不同的人和计算机来阅读.在期间,文档起到了桥梁的作用,看这张图很形象: 在这里在看一下国家统一规 ...
- win7 x64 vs2010 directShow开发环境配置
近来工作需要,要用dirrectShow写一个视频播放的demo验证自己的想法.开发环境配置了好久都没有成功,最后终于弄完,现在记录下来,以后有同学遇到同样问题,可以以此法解决. windows SD ...
- SubSonic3.0 Demo1.0——应用了T4模版可减少开发过程中70%以上的代码量以及80%以上的出错率
应网友的要求,抽了点时间写了这个Demo,希望对2.2版想升级到3.0的朋友或正在使用3.0的朋友有所帮助.大家在使用Demo过程中如果发现什么问题或有什么建议,可以直接将Bug提交给我或告诉我,我会 ...
- DirectShow+VS2010+Win7配置说明
不得不说,使用windows的东西确实很麻烦,DirectShow这个东西不断更新换代,书本上的知识完全跟不上时代,只能去博客上查资料.百度之后,看了大量的文章,终于完成了自己的DirectShow安 ...
- DirectShow Filter的开发实践
一.介绍 摄像头图像采集处理在业界有着多种成熟的方案.从老的DirectShow.Grabber技术,到新的Windows Media Foundation框架,网络上都有着丰富的参考资料.OpenC ...
- 在DirectShow中支持DXVA 2.0(Supporting DXVA 2.0 in DirectShow)
这几天在做dxva2硬件加速,找不到什么资料,翻译了一下微软的两篇相关文档.并准备记录一下用ffmpeg实现dxva2,将在第三篇写到.这是第二篇.,英文原址:https://msdn.microso ...
随机推荐
- 拥抱自动化,CODING 2.0 持续集成全新上线
在文章开始前,做一个小调查,在您的软件项目中集成一行新代码平均需要花多长时间? 15 分钟 一小时 半天 一天及以上 注意这里的集成是指将源码放在一起,并验证源码可以作为一个一致.运行可靠的软件的过程 ...
- OGG For Oracle To PostgreSQL
本文档描述OGG(Oracle goldengate)为Oracle同步到PostgreSQL数据库配置.在目前去“IOE”潮流.PostgreSQL确实是Oracle最好的替代品之一. 实验环境如下 ...
- Linux系统学习 十七、VSFTP服务—本地用户访问—用户访问控制
FTP相关文件中用户控制列表文件 /etc/vsftpd/ftpusers #该文件永远都是黑名单(针对访问ftp服务,一般不做修改) /etc/vsftpd/user_list ...
- OpenGL 之 Compute Shader(通用计算并行加速)
平常我们使用的Shader有顶点着色器.几何着色器.片段着色器,这几个都是为光栅化图形渲染服务的,OpenGL 4.3之后新出了一个Compute Shader,用于通用计算并行加速,现在对其进行介绍 ...
- Java之Iterator接口(遍历单列集合的迭代器)
Iterator接口概述 在程序开发中,经常需要遍历集合中的所有元素.针对这种需求,JDK专门提供了一个接口java.util.Iterator . Iterator 接口也是Java集合中的一员,但 ...
- Linux 部署 java1.8
1.安装 查看java安装包 yum list | grep java 使用yum安装 yum install java-1.8.0-openjdk.x86_64 修改环境变量 vi /etc/pro ...
- 《机器学习实战之第二章k-近邻算法》
入坑<机器学习实战>: 本书的第一个机器学习算法是k-近邻算法(kNN),它的工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据 ...
- ETCD:与etcd进行交互
原文地址:Interacting with etcd 与etcd进行交互 用户更多的是通过putting或者是getting从etcd获取一个键对应的值.这一部分描述了如何通过etcdctl做这些工作 ...
- SpringBoot 整合Shiro实现动态权限加载更新+Session共享+单点登录
作者:Sans_ juejin.im/post/5d087d605188256de9779e64 一.说明 Shiro是一个安全框架,项目中主要用它做认证,授权,加密,以及用户的会话管理,虽然Shir ...
- Linux gzip: stdin: not in gzip format
在解压tar.gz文件的时候报错 tar -zxvf otp_src_18.3.tar.gz gzip: stdin: not in gzip format tar: Child returned s ...