DirectShow是一个windows平台上的流媒体框架,提供了高质量的多媒体流采集和回放功能。它支持多种多样的媒体文件格式,包括ASF、MPEG、AVI、MP3和WAV文件,同时支持使用WDM驱动或早期的VFW驱动来进行多媒体流的采集。DirectShow整合了其他的DirectX技术,能自动地侦测并好使用可利用的音视频硬件加速,也能支持没有硬件加速的系统。

DirectShow大大简化了媒体回放、格式转换和采集工作。但与此同时,它也为用户自定义的解决方案提供了底层流控制框架,从而使用户可以自行创建支持新的文件格式或其他用户的DirectShow组件。

以下是几个使用DirectShow编写的典型应用:

DVD播放器、视频编辑应用、AVI到ASF转换器、MP3播放器和数字视频采集应用。

DirectShow是建立在组件对象模型(COM)上的,因此当你编写DirectShow应用时,你必须具备COM客户端程序编写的知识。对于大部分的应用,你不需要实现自己的COM对象,DirectShow提供了大部分你需要的DirectShow组件,但是假如你需要编写自己的DirectShow组件,你还需要具备编写COM组件的知识

DirectShow支持的格式

DirectShow是一个开放的框架,因此只要有合适的filter来分析和解码,它可以支持任何格式。DirectShow默认支持以下的文件类型和压缩格式:

 注:打*号的需要Windows Media Format SDK支持

文件类型:

Windows Media? Audio (WMA)*

Windows Media? Video (WMV)*

Advanced Systems Format (ASF)*

Motion Picture Experts Group (MPEG)

Audio-Video Interleaved (AVI)

QuickTime (version 2 and lower)

WAV

AIFF

AU

SND

MIDI

压缩格式:

Windows Media Video*

ISO MPEG-4 video version 1.0*

Microsoft MPEG-4 version 3*

Sipro Labs ACELP*

Windows Media Audio*

MPEG Audio Layer-3 (MP3) (decompression only)

Digital Video (DV)

MPEG-1 (decompression only)

MJPEG

Cinepak

常见问题集

*DirectShow支持哪些操作系统?

DirectShow支持Windows9X、Windows2000、Windows Me和Windows XP。

*使用DirectShow需要多少COM知识?

应用程序开发者只需要基本的COM组件知识:实例化COM组件、调用接口、管理接口的引用计数。Filter开发者则需要更多。

*有与DirectShow兼容的硬件列表(HCL)吗?

没有。如果硬件兼容DirectShow,DirectShow会使用它们,如果没有兼容的硬件,DirectShow使用GDI绘制视频,以及使用WaveOut系列多媒体API来播放音频。

*可以使用哪些语言来编写DirectShow应用?

DirectShow主要为C/C++开发设计。Visual Basic只能使用其中的很小一部分。可以通过MS JScript或VB Script来支持基于脚本的DVD和TV应用。也可能用Delphi来编写,但SDK文档不提供这方面的内容。

*DirectShow会通过托管代码实现吗?

目前还没有这个计划。DirectX SDK提供了有限的使用音视频回放类的托管回放功能,你可以使用COM interop创建托管代码的DirectShow客户端应用,但是因为性能上的原因,不推荐创建运行在CLR上的filter。

*DirectShow开发需要什么样的编译器?

任何能够产生COM对象的编译器都可以。

*DirectShow和DirectX的其它组件的关系

DirectShow和DirectX的其它组件在内部进行联系。DirectShow在硬件的支持下使用DirectSound和DirectDraw。Video Renderer和Overlay Mixer使用DirectDraw 3和DirectDraw5表面(surfaces)。Video Mixing Renderer 7(只支持WINXP)使用DirectDraw7表面。Video Mixing Renderer 9使用最新的(目前是Directx9)Direct3D API函数。即便是某个应用程序包含了DirectX其它组件,你也不必使用其它组件的API去编写它。参考SDK的例子:Texture3D Sample。

*DirectShow与ActiveMovie的关系?

ActiveMovie是DirectShow原来的名称,现已不再使用,但是一部分API仍保留了"AM"的前缀,比如AM_MEDIA_TYPE和IAMVideoAccelerator。

*DirectShow是限于多媒体应用吗?

DirectShow默认包含的组件主要是为音视频流设计的,但是,DirectShow框架已经成功地用于其它数据流的解决方案中。

*GraphEdit工具有源码吗?GraphEdit.exe是否可再发布?

没有源码,不可再发布。

*DMO可以代替DirectShow filter吗?

在编写编码器、解码器、效果器应用时,鼓励用DMO代替DirectShow filter。在其它的应用中,使用DirectShow filter可能会比较合适。

*GraphEdit列示了很多没有文档支持的filter,它们都是些什么?

GraphEdit枚举了所有作为filter类型注册在系统中的filter,包括由第三方应用程序安装的filter,以及其它微软技术如Windows Media或NetMeeting安装的,另外,一些DirectShow filter被用来做硬编码或硬解码驱动的外壳。Microsoft H.263 Video Codec用于NetMeeting,不再被DirectShow支持。

*如何知道DirectShow已经被安装?

调用CoCreateInstance创建一个Filter Graph Manager实例,如果成功,表示DirectShow已经被安装,下面是一个例子:

IGraphBuilder *pGraph;HRESULT hr = CoCreateInstance(CLSID_FilterGraph,NULL, CLSCTX_INPROC_SERVER,IID_IGraphBuilder, (void **) &pGraph);     

*如果不通过属性设置页来更改filter的设置?

当然是通过filter提供的接口罗。如果没有提供,就没有办法啦

*DirectShow能通知应用程序当前回放位置吗?

不提供回调来通知位置,需要使用一个计时器定时调用IMediaSeeking::GetCurrentPosition方法来得到当前回放位置。

*filter运行在哪个特权级别下?

运行在Ring 3特权级别下,某些流控制驱动(如音视频采集驱动)运行在Ring 0特权级别下。

*需要一个Kernel调试器吗?

这依据具体的项目。安装DirectX调试运行时库(DirectX debug runtime library)意味着安装调试驱动(Debug driver)和其它核心组件(kernel mode component),因此如果你的应用程序在其中的某个组件中产生了一个调试断言(debug assert),你的机器就会自动重启除非你拥有一个kernal调试器。

*DEFINE_GUID宏是怎么工作的?

使用DEFINE_GUID宏可以让你通过包含同一个头文件来定义GUID值而不必使用extern关键词。比如,你的工程中有三个源文件:src1.cpp,src2.cpp,src3.cpp,它们都使用一个相同的GUID值,而为了保证一致性,这个GUID只能在你的工程中定义一次,这时,其它的源文件必须定义外部引用来使用它。用了DEFINE_GUID,你可以使用在所有源文件中包含同一个头文件,在头文件中这样定义GUID:

DEFINE_GUID(CLSID_MyObject, 0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);

这个例子中GUID为0,实际编程中请用Guidgen工具来产生一个GUID,在其中的一个源文件中,在你的头文件前包含initguid.h,如:

 // Src1.cpp#include #include "MyGuids.h"// Src2.cpp#include "MyGuids.h" // Src3.cpp#include "MyGuids.h"  

  

在没有包含Initguid.h的地方,DEFINE_GUID宏创建外部引用来使用GUID值,在包含Initguid.h的地方,DEFINE_GUID重定义DEFINE_GUID宏以产生GUID的定义。

如是没有在任何地方添加Initguid.h,你会得到一个链接错误:"unresolved external symbol." ,如果同样的GUID包含Initguid.h两次,会得到编译错误"redefinition; multiple initialization."要解决这些问题,请确认Initguid.h只包含一次。同样的,不要包含Initguid.h到预编译头文件中去,因为预编译头文件会被每个源文件包含。

参考:

https://www.yuque.com/docs/share/8e8f284d-45f5-4fb7-9619-a6cd69e51c1b

DirectShow介绍相关推荐

  1. DirectShow编程(1)- DirectShow介绍

    学习DirectShow有一段时间了,把这段学习过程中翻译出来的SDK与大家分享,同时也希望专家们指出我理解上的错误,万分感谢. 1. DirectShow介绍     DirectShow是一个wi ...

  2. DirectX和DirectShow介绍和区别

    1.DirectX是什么 DirectX是微软推出的一套基于Windows系统的多媒体应用程式接口APIs函式.在开发中,DX分为两个部分,一个是运行库,通过DX编译出来的程式必须要有运行库的支持,另 ...

  3. DirectShow介绍和使用

    概述 Strmiids.lib,Quartz.lib,Strmbase.lib具体添加那个见下面说明 DirectShow只是DirectX的一个子集.DirectX中还包括DirectSound.D ...

  4. Directshow完整介绍

    最近一段时间,在编写DirectShow应用程序时常常遇到一些问题,原因是对DirectShow技术没有较全面地掌握,对各个接口间的关系以及filter与filter之间连接的内部过程等都只是一知半解 ...

  5. 一个清华学子写的关于directshow的学习心得【转】

    学习DirectShow有一段时间了,把这段学习过程中翻译出来的SDK与大家分享,同时也希望专家们指出我理解上的错误,万分感谢. 1. DirectShow介绍     DirectShow是一个wi ...

  6. DirectShow2

    以文本方式查看主题 -  温馨小筑  (http://www.learnsky.com/bbs/index.asp) --  电脑编程  (http://www.learnsky.com/bbs/li ...

  7. 嵌入式开发五:未来之星机器人语音控制及视频开发(颜色追踪)(运动追踪)

    Author:朱本福 Address:桂林电子科技大学,智能科学与技术 E-mial:zhubenfulovepoem@163.com QQ:896922782 技术交流群:图像处理分析与机器视觉(群 ...

  8. DirectX for DirectShow---Get Start

    ccc译自DirectX的DirectShow--Get Start (2001.8.20) DirectX是关于多媒体编程的环境(SDK).DirectShow是关于Windows媒体捕捉与播放的编 ...

  9. H264解码之D3D显示YUV

    文章目录 概述 关系 参考 接口介绍 显示方式 纹理方式 使用shader的纹理方式 不使用shader的纹理方式 表面(Surface)方式 概述 备注:本文主要针对DirectX 9.0版本来讨论 ...

  10. 【转】FFmpeg获取DirectShow设备数据(摄像头,录屏)

    这两天研究了FFmpeg获取DirectShow设备数据的方法,在此简单记录一下以作备忘.本文所述的方法主要是对应Windows平台的. 1.       列设备 ffmpeg -list_devic ...

最新文章

  1. python与excel互通_【好消息】Python和Excel终于可以互通了!!
  2. C++匿名管道详解及简单案例(基于VS2013)
  3. java做服务器端给客户端传数据包_java 服务器怎样给客户端传输数据
  4. 【转】QT中窗口刷新事件的学习总结
  5. c++ 输出二进制_C语言 printf 格式化输出的详细示例
  6. fedora yum无法正常运行问题的解决
  7. Java 技术书籍大全
  8. [Python可视化] pyecharts安装入门及绘制中国贵州地图
  9. miui 8.5 android,小米MIUI8.5稳定版
  10. python英语单词 扇贝英语安卓下载_扇贝单词英语版手机版|扇贝单词英语版安卓版下载 v3.6.402 - 跑跑车安卓网...
  11. discuz!3.3自带微信插件实现微信端自定义菜单
  12. MATHLAB有关知识
  13. 男同胞要一定要看——酒桌上用来劝酒的话
  14. 初识云计算和DevOps
  15. Fabric学习笔记(六) - chaincode开发模式
  16. 监控系统与服务器的连接,监控服务器的连接方法
  17. 如何根据原理图画封装_如何快速设计元器件原理图库和PCB封装库?
  18. Toast分析——实现自己的Toast
  19. 秦王扫六合,虎视何雄哉
  20. wangeditor手机适配方案

热门文章

  1. cad转shp 奥维_奥维互动地图浏览器中导入导出CAD文件的操作教程
  2. (已更新)短视频去水印解析客户端小程序源代码
  3. umijs有什么好处_UmiJS应用框架
  4. flutter_app\key.jks‘ not found for signing config ‘release‘.
  5. easyrecovery15新版绿色序列号数据恢复软件
  6. java基础代码-实现键盘输入
  7. 泰迪杯数据挖掘挑战赛—机器学习(二)
  8. 分布式配置管理平台VS统一集中配置管理
  9. 数据结构——郝斌老师——部分笔记
  10. DSP2812之定时器0