开发环境: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. QGIS练手 - 标注

    又熬夜了... QGIS的标注就是标签,在QGIS3.x中有了改进. 不得不说,就光速度这一项,就能把ArcMap按在地上摩擦,更别说各种高级的标注样式了——除了标注功能面板UI有点“缺审美化”就是了 ...

  2. JDK环境变量配置遇见的错误以及解决办法

    cmd中输入java -version错误信息: An error has occurred while processing the shared archive file.Unable to un ...

  3. 3、nio中的selector使用

    通过编写一个客户端和服务器端的例子来熟悉selector的使用 服务端逻辑: 1. 绑定一个端口号2. channel注册到selector中3. 用死循环来监听如果有时间发生,遍历selection ...

  4. 如何通过 subprocess 持续获取输出内容

    在实际应用中会用到subprocess的Popen方法执行一些命令,而我们需要通过执行这个命令的来获取输出进行一些信息记录或者分析使用,如果是很快就可以执行完的那还好,有时需要持续跟踪内容的输出,比如 ...

  5. Ribbon负载均衡及Feign消费者调用服务

    微服务调用Ribbon 简介 前面讲了eureka服务注册与发现,但是结合eureka集群的服务调用没讲. 这里的话 就要用到Ribbon,结合eureka,来实现服务的调用: Ribbon是Netf ...

  6. opencv-python图像二值化函数cv2.threshold函数详解及参数cv2.THRESH_OTSU使用

    cv2.threshold()函数的作用是将一幅灰度图二值化,基本用法如下: #ret:暂时就认为是设定的thresh阈值,mask:二值化的图像 ret,mask = cv2.threshold(i ...

  7. vue-cli2和cli3的使用和区别

    vue-cli脚手架的使用 使用vue-cli可以快速搭建vue的开发环境,和webpack的配置 安装vue脚手架: npm install -g@vue/cli 上面安装的是vue cli3的版本 ...

  8. linux配置LAMP(CentOS7.4 Apache2.4 PHP5.6)

    1.安装Apache 这个就不手动安装了,直接上脚本执行 bash apache.sh 以下为脚本的内容: #!/bin/bashversion=`lsb_release -a|grep Releas ...

  9. SpringBoot2.0 基础案例(16):配置Actuator组件,实现系统监控

    本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.Actuator简介 1.监控组件作用 在生产环境中,需要实时 ...

  10. JavaWeb中验证码校验的功能实现

    后台生成验证码工具方法 /* * 设置图片的背景色 */ public static void setBackGround(Graphics g, int WIDTH, int HEIGHT) { / ...