DirectShow应用程序快速入门

使用 Python 和 DirectShow 从相机捕获图像 阅读详情

摘要:该文介绍如何编写DirectShow应用程序,属于入门级文章。如果你感兴趣,可以来看看这些东西。欢迎到我的博客blog.youkuaiyun.com/suntaoznz看其他文章!

 

一环境设置... 1

二 DirectShow编程简介... 1

三播放文件例程... 3

 

 

一 环境设置

该节介绍如何建立DirectShow应用程序。你可以建立一个控制台程序,或者Visual Studio环境下的其它Visual C++的项目。

头文件

所有DirectShow 程序都使用下表中的头文件。

 

头文件

需     要

dshow.h

所有DirectShow 程序。

 

有些DirectShow接口会要求其他头文件,你可以去查看这些接口的参考手册。

 

库文件

DirectShow程序要使用的库文件如下:

 

库文件

说            明

Strmiids.lib

提供类标识(CLSIDs)和接口表示(IIDs)。所有的DirectShow程序都要求使用该库文件。

Quartz.lib

提供AMGetErrorText函数,如果你不调用这个函数,就可以不加载该库文件。

 

可以把DirectX SDK 的Include 和Lib目录放在Visual Studio的搜索路径的第一位。以确保你可以使用最新的版本!

 

 

二 DirectShow编程简介

该节对DirectShow编程的基本术语和概念进行介绍,通过对该节的阅读,你可以写你的一个DirectShow应用程序。

过滤器(Filters)和过滤器图表(Filter Graphs)

过滤器(Filters)就是一个软件组件,它执行一些针对多媒体流的操作。比如:

·         读入文件

·         从视频捕获设备得到视频

·         对多种流格式解码,如MPEG-1

·         传送数据到显卡和声卡

 

过滤器可以接收输入并提供输出,比如,一个MPEG-1视频解码过滤器,它接收MPEG编码的数据流,通过处理后输出非压缩的视频图像帧。

在DirectShow, 应用程序执行的一些工作是在一串过滤器链接中完成,可能某个过滤器的输出到了下一步就是另一个过滤器的输入。这一组连接,我们就称为过滤器图表。

例如下图显示了一个播放AVI文件的过滤器图表。

 

File Source 过滤器从硬盘上读取AVI文件。AVI Splitter 过滤器把文件解析为两个数据流(压缩的视频流和音频流)。AVI Decompressor过滤器对视频流解码,Video Rendere把视频数据显示出来(通过DirectDraw 或 GDI)。Default DirectSound Device过滤器使用DirectSound播发音频数据

应用程序不需要对数据流动进行管理,这些过滤器被级别更高的组件控制,过滤器图表管理器(Filter Graph Manager)管理这些过滤器。这样,你就可以使用更高级别的API来控制(比如”Run” , ”Stop”),如果你要控制流的操作,你也可以通过直接使用过滤器的COM接口实现。过滤器图表管理器通过事件来通知应用程序。

过滤器图表管理器的另一个用途是:它通过把过滤器连接在一起,向应用程序提供了建立过滤器图表的方法。

编写DirectShow 程序

在大部分的情况下,DirectShow应用程序必须执行下面3个步骤:

  1. 应用程序建立一个Filter Graph Manager的实例。
  2. 应用程序使用Filter Graph Manager 去建立一个filter graph. Filter graph中的过滤器依赖与应用程序的需求。
  3. 应用程序使用Filter Graph Manager 去控制filter graph 并通过过滤器去对数据解析分流。在整个处理过程中,应用程序都将响应Filter Graph Manager的事件。

当处理完成后,应用程序将释放掉Filter Graph Manager和所有的过滤器。

DirectShow 是基于COM的。Filter Graph Manager 和过滤器都是COM对象。你应该对COM编程有全面的了解。

三 播放文件例程

这里提供一个控制台应用程序去播放一个音、视频文件。这个程序只有几行长。

在前面介绍了一个基于DirectShow的应用程序,必须要进行如下几个基本步骤:

  1. 建立一个Filter Graph Manager的实例.
  2. 使用Filter Graph Manager 建立一个filter graph.
  3. 运行这个graph。

调用CoInitialize 去初始化一个这个COM 库。

HRESULT hr = CoInitialize(NULL);

if (FAILED(hr))

{

    // 在这里加入错误处理

}

这里,我们跳过了对返回值的检查,当你调用了任何方法的时候都应该对返回值进行检查。下面调用CoCreateInstance创建Filter Graph Manager。

IGraphBuilder *pGraph;

HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL,

    CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);

类ID是CLSID_FilterGraph,由于Filter Graph Manager是动态链接库提供(dll),所以使用CLSCTX_INPROC_SERVER。

CoCreateInstance 将返回IgraphBuilder接口,在该例子中还需要两个接口:

l         IMediaControl 用于控制数据流。它提供停止和开始的操作方法。

l         IMediaEvent   可以获得Filter Graph Manager 事件。例如,可以获得播放完成事件。

这两个接口都由Filter Graph Manager提供,可以通过IgraphBuilder指针去获得它们:

IMediaControl *pControl;

IMediaEvent   *pEvent;

hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);

hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

现在,你可以建立过滤器图表(Fileter Graph)。对于文件播放,这里只需要调用一个方法就可以了:

hr = pGraph->RenderFile(L"C://Example.avi", NULL);

IGraphBuilder::RenderFile方法将建立一个过滤器图表,通过它来播放指定的文件。第一个参数指定要播放的文件名称,它是个宽字符字符串。第二个参数是系统保留,必须为NULL。如果指定文件不存在或文件格式未知,那么该方法调用将失败。

现在过滤器图表已经准备好了去播放文件,但是还必须调用IMediaControl::Run方法去播放。

hr = pControl->Run();

当过滤器图表开始运行,数据从通过过滤器播放出来。播放动作将在一个独立的线程中进行。调用IMediaEvent::WaitForCompletion 方法可以等待文件播放完成。

long evCode = 0;

pEvent->WaitForCompletion(INFINITE, &evCode);

这个方法将一直等待文件播放结束才返回。INFINITE就表示不能确定文件的播放时间长度。当应用程序完成播放后,应该释放掉接口指针和关闭COM库。

pControl->Release();

pEvent->Release();

pGraph->Release();

CoUninitialize();

 

 

全部源码如下:

#include <dshow.h>

void main(void)

{

    IGraphBuilder *pGraph = NULL;

    IMediaControl *pControl = NULL;

    IMediaEvent   *pEvent = NULL;

    // 初始化COM 库

    HRESULT hr = CoInitialize(NULL);

    if (FAILED(hr))

    {

        printf("ERROR - Could not initialize COM library");

        return;

    }

    // 建立过滤器图表管理器

    hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,

                        IID_IGraphBuilder, (void **)&pGraph);

    if (FAILED(hr))

    {

        printf("ERROR - Could not create the Filter Graph Manager.");

        return;

    }

    hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);

    hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

    // 建立过滤器图表

    hr = pGraph->RenderFile(L"C://Example.avi", NULL);

    if (SUCCEEDED(hr))

    {

        // 播放

        hr = pControl->Run();

        if (SUCCEEDED(hr))

        {

            // 等待播放结束

            long evCode;

            pEvent->WaitForCompletion(INFINITE, &evCode);

        }

    }

    pControl->Release();

    pEvent->Release();

    pGraph->Release();

    CoUninitialize();

}


DirectShow介绍和使用 一.使用directshow时应该添加lib文件 Strmiids.lib,Quartz.lib,Strmbase.lib具体添加那个见下面说明 二 DirectShow初探 DirectShow只是DirectX的一个子集。DirectX中还包括DirectSound、Direct3D等集合。DirectShow主要用来处理一些与音视频有关的多媒体任务,比如音视频采集、回放等。 过年回来后,在一个项目中要求在WIN32下采集视频信号,以前做过GDI的,不过效率低下,而且效果也很烂,所以... 阅读详情

相关推荐

全面DirectShow开发教程:构建多媒体应用程序

本文还有配套的精品资源,点击获取 简介:DirectShow是微软提供的一个多功能的多媒体框架,用于视频和音频流的处理,特别擅长实时播放和捕获。本指南深入介绍了DirectShow的开发过程,涵盖核心概念、关键API接口和应用实例,旨在指导开发者如何使用这一技术构建媒体处理管道和应用。 1. DirectShow框架概述和构成 DirectShow 是 Wi...

weixin_28681379的博客 1264

DirectShow应用程序快速入门[转]

该文介绍如何编写DirectShow应用程序,属于入门级文章。一环境设置 该节介绍如何建立DirectShow应用程序。你可以建立一个控制台程序,或者Visual Studio环境下的其它Visual C++的项目。 头文件 所有DirectShow 程序都使用下表中的头文件。 头文件     需     要 dshow.h   所有DirectShow 程序。 有些DirectShow接口会要求

hamsky的专栏 1240

深入DirectShow图形图像处理实践教程_Visual_C++

DirectShow是微软提供的一套用于媒体流处理的API集合,广泛应用于音视频数据的捕获、解码、编码、渲染等多媒体处理工作。DirectShow以Filter Graph Manager为基础,将各种处理步骤封装成Filter,通过Pin进行数据交换,进而形成一个完整的媒体处理流程。DirectShow采用的是基于COM组件的架构,它允许开发者灵活地构建Filter Graph,以适应各种复杂的多媒体应用需求。

weixin_32661831的博客 1087

DirectShow开发快速入门之慨述

DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。那么,DirectShow能够做些什么呢?且看,DirectShow为多媒体流的捕捉和回放提供了强有力的支持。运用DirectShow,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。它广泛地支持各种媒体格式,包括Asf、Mpeg、A

anew673的专栏 1991

工业场景落地:Java+PaddleOCR实现高性能OCR文字识别的终极方案

本文深度解析基于Java的高性能工业级OCR实现方案,集成PP-OCRv5深度学习模型,提供: ✅ 多场景支持:手写体、竖排文本、票据表格的精准识别 ✅ 工业级性能:毫秒级响应,支持GPU加速与高并发处理 ✅ 开箱即用:通过Maven快速集成,5行代码完成文字识别 ✅ 完整技术栈:覆盖文本检测、方向校正、识别后处理全流程 附可运行示例代码,助您快速构建企业级OCR系统!

deng775747758的博客 3611

41页PPT | 华为业务流程架构全景视图:全业务域L1-L3级流程全案

TBD、收集和生成线索、验证机会点、TBD、管理销售授权、管理销售项目、管理销售项目群、管理合同要素/模板、验证和分发线索、标前引导、管理开票和回款、客户网络评估、管理销售评审、TBD、管理交付项目群、管理合同文档、管理结构化合同信息、跟踪和培育线索、制定并提交标书、管理合同/PO变更、客户网络规划、管理销售决策。:4.1 管理技术、服务请求、4.2管理备件、服务交付、4.3管理非技术、服务请求、4.4管理客户、投诉。:管理Idea、产生Idea、激发兴趣与协作、孵化、原型和验证、确认Idea与商业化。

zuoan1993的博客 4547

DirectShow开发快速入门之事件通知机制

摘要:这篇文档描述DirectShow中事件产生的机制,以及应用程序是如何处理事件的。   概述  事件是Graph图和应用程序之间互相通信的机制,类似于消息机制。当某个事件发生时,比如数据流结束,产生一个错误等,Filter就要给Filter图表管理器(Graph Manager)发送一个事件通知。Filter图表管理器处理其中的一部分事件,将其他事件要交给应用程序处理。如果图表管理器没有处理一

Briver Song的专栏 938

Windows11 - Ubuntu 双系统及 ROS、ROS2 安装

在本教程中,我们将使用 Ubuntu 20.04 版本,该版本使用了新的 Ubuntu 桌面安装程序,该程序将包含在今后发布的所有 Ubuntu 版本中。如果你选择了这个选项,你会看到一个简单的界面,允许你选择要安装Ubuntu的硬盘,并通过滑块来决定你希望Ubuntu使用的磁盘空间大小。如果你的电脑有多个硬盘驱动器,那么只要它们各自有自己的驱动器,这个选项就能让你在安装 Ubuntu 的同时安装现有的操作系统。在此屏幕上,系统会提示您输入您的姓名和您的计算机名称,以显示在网络上。

机器人控制与仿真应用 4507

DirectShow开发快速入门之三

事件是Graph图和应用程序之间互相通信的机制,类似于消息机制。当某个事件发生时,比如数据流结束,产生一个错误等,Filter就要给Filter图表管理器(Graph Manager)发送一个事件通知。Filter图表管理器处理其中的一部分事件,将其他事件要交给应用程序处理。如果

gavin的专栏 969

解决Android API 30+视频播放抖动问题

摘要:本文探讨了Android开发中使用ExoPlayer在API 30+设备上出现的视频抖动问题。作者发现API 30以下版本运行正常,但API 30及以上版本会出现画面不稳定现象。解决方案是改用TextureView替代SurfaceView,通过修改PlayerView配置并设置setUseTextureView(true)来增强播放稳定性。这一简单改动有效解决了API兼容性问题,为开发者提供了实用的解决方案。

m0_62153576的博客 114

国家自然基金研究方向选定后,关键词只能下拉吗?——不是的,国家自然科学基金(NSFC)的关键词并不是只能下拉选择,而是:[特殊字符] “可选 + 可填”的混合模式(但以规范词为主)

你可以手动输入关键词用于表达新兴方向或细分领域✔ 适用情况:新概念(如“电场调控纳米流体”)交叉领域(如“电流体力学传热耦合”)电场调控电流体力学可以自己填,但必须以系统标准关键词为主,自定义为辅如果你愿意,我可以帮你做一件更关键的事:👉根据你题目,反向设计“最容易中标”的关键词组合 + 学科代码搭配这个比写内容本身还更影响送审质量。你可以手动输入关键词用于表达新兴方向或细分领域✔ 适用情况:新概念(如“电场调控纳米流体”)交叉领域(如“电流体力学传热耦合”)电场调控电流体力学。

qq_15963745的博客 81

DirectShow开发快速入门之数据流的流动

  摘要:本篇文档中主要讲述了Graph图表中数据流是如何传递的,如果你是做Directshow的应用开发也许对于这些细节并不需要了解,如果你要开发自己的Filter,就很有必要了解这些细节。   Directshow数据流动概述  Filter之间的数据是通过Sample来传送的。Sample是一个COM组件,拥有自己的一段数据缓冲buffer,这个com组件暴露了IMediaSample接口。

Briver Song的专栏 1289

AI: 机器学习的模型是如何训练的?(在试错中学习)

一句话理解机器学习一般训练过程 :通过有标签样本来调整(学习)并确定所有权重Weights和偏差Bias的理想值。 训练的目标:最小化损失函数 (损失函数下面马上会介绍) 机器学习算法在训练过程中,做的就是:检查多个样本并尝试找出可最大限度地减少损失的模型;目标就是将损失(Loss)最小化 在这里插入图片描述 上图就是一般模型训练的一般过程(试错过程),其中 模型: 将一个或多个特征作为输入,然后返回一个预测 (y’) 作为输出。为了进行简化,不妨考虑一种采用一个特征并返回一个预测的模型,如下公式

HowieXue 薛永浩的博客 3万+
上一篇: EVC工程的移植
下一篇: G-Sensor的一些概念,基于android
DecJ
博客等级 码龄18年 537粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值