开发环境: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

MSDN - How To Play a File

DirectShow 应用开发过程的更多相关文章

  1. TODO:小程序开发过程之体验者

    TODO:小程序开发过程之体验者 1. 小程序开发过程,先下载开发者并安装开发者工具,现在腾讯开放测试了,普通用户也可以登录开发者工具,如图普通用户登录为调试类型,但是只能建立无AppID的项目 如果 ...

  2. 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 ...

  3. 一些关于angularJS的自己学习和开发过程中遇到的问题及解决办法

    这篇文章也许会不定时更新,主要记录这段时间内自己遇到的angularjs学习开发的一些问题的解决办法.本文以摘抄为主,主要目的还是将自己遇到的困惑在各个地方查到的解决办法的汇总,给自己留个备忘吧. 1 ...

  4. 【转】UML图与软件开发过程那点关系

    首先,软工文档, 软工文档,也就是计划,设计,描述,使用软件的一些文件,它最大的特点就是固定不变,用来给不同的人和计算机来阅读.在期间,文档起到了桥梁的作用,看这张图很形象: 在这里在看一下国家统一规 ...

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

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

  6. SubSonic3.0 Demo1.0——应用了T4模版可减少开发过程中70%以上的代码量以及80%以上的出错率

    应网友的要求,抽了点时间写了这个Demo,希望对2.2版想升级到3.0的朋友或正在使用3.0的朋友有所帮助.大家在使用Demo过程中如果发现什么问题或有什么建议,可以直接将Bug提交给我或告诉我,我会 ...

  7. DirectShow+VS2010+Win7配置说明

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

  8. DirectShow Filter的开发实践

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

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

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

随机推荐

  1. C lang: Pointer

    Ax_Terminology xa_pointer pointer is the address used to store the variable;A variable (or data obje ...

  2. 如何在linux上有2个python的情况下安装gensim

    安装python的问题 https://blog.51cto.com/liqingbiao/2083869 安装gensim https://blog.csdn.net/zhujiyao/articl ...

  3. Redis中的Scan命令的使用

    Redis中有一个经典的问题,在巨大的数据量的情况下,做类似于查找符合某种规则的Key的信息,这里就有两种方式,一是keys命令,简单粗暴,由于Redis单线程这一特性,keys命令是以阻塞的方式执行 ...

  4. python与数据库交互的模块pymysql

    一.Mysql 1.前提 pip install pymysql import pymysql 2.详情 Connection对象 =====>用于连接数据库 用于建立与数据库的连接 创建对象: ...

  5. win10+Ubuntu16.04双系统下深度学习环境的搭建

    环境零零碎碎地搭了三四天,虽然碰到各种问题,但还是搭建好了,自己整理记录下,同时也算给有需要的人一些指导吧 一.双系统的安装 Win10硬盘管理助手 压缩或者直接利用未使用的空间,空间大小自定,将腾出 ...

  6. BZOJ3144/LG3227 「HNOI2013」切糕 最小割离散变量模型

    问题描述 BZOJ3144 LG3227 还想粘下样例 输入: 2 2 2 1 6 1 6 1 2 6 2 6 输出: 6 题解 关于离散变量模型,我不想再抄一遍,所以: 对于样例,可以建立出这样的图 ...

  7. 第2次作业-titanic数据集练习

    一.读入titanic.xlsx文件,按照教材示例步骤,完成数据清洗. titanic数据集包含11个特征,分别是: Survived:0代表死亡,1代表存活Pclass:乘客所持票类,有三种值(1, ...

  8. vue组件化思想和模块化

    组件化 注册组件的基本步骤 创建组件构造器 (调用Vue.extend()方法) 注册组件 (调用Vue.component()方法) 注册组件语法糖 省去了调用Vue.extend()的步骤,而是可 ...

  9. Web安全测试学习笔记-DVWA-图片上传

    很多网站都有上传资源(图片或者文件)的功能,资源上传后一般会存储在服务器的一个文件夹里面,如果攻击者绕过了上传时候的文件类型验证,传了木马或者其他可执行的代码上去,那服务器就危险了. 我用DVWA的文 ...

  10. @Transactional注解失效

    一.特性 先来了解一下@Transactional注解事务的特性吧,可以更好排查问题 1.service类标签(一般不建议在接口上)上添加@Transactional,可以将整个类纳入spring事务 ...