DirectShow的概念

DirectShow GraphEdit(graphedt.exe)来进行分析:

在上图中可以直观的看到播放这个媒体文件的基本模块,七个模块按广度顺序:读文件模块, 解复用模块, 视频解码模块, 音频解码音频, 颜色空间转换模块,视频显示模块,

音频播放模块。

按照DirectShow的称呼, 一个模块叫做一个filter(过滤器),模块的输入输出口叫做pin(管脚), 有input pin 和output pin两种; 第一个filter叫做Source filter, 每种媒体最后一个filter叫做Sink filter, 如上图所示连成串的所有filter组成一个Graph, 媒体文件的数据就像流水一样在Graph中流动, 各个相关的filter各司其职, 最后我们就看到了视频,也听到了声音(松耦合、高内聚)。

功能模块与组件分析

DirectShow中和播放器有关的filter粗略的分为五类, 分别是Source filter, Demux fiter,

Decoder filter, Color Space converter filter, Render filter,  各类的filter的功能与作用简述如下:

Source filter:源过滤器, 它的作用是为下级的demux filter以包的形式源源不断的提供数据流。在通常情况下,我们有多种方式可以获得数据流, 一种是从本地文件中读取,一种是从网上获取, Sourcefilter另外的一个作用就是屏蔽读本地文件和获取网络数据的差别,

在下一级的demux filter看来,本地文件和网络数据是一样的。总结一下, Sourcefilter有两个作用:其一是为下一级的demux filter提供数据流, 其二是屏蔽读本地文件和获取网络数据的差别即对于下一级的demux filter看来,本地文件和网络数据是一样的。

Demux filter:解复用过滤器, 它的作用是识别文件类型, 媒体类型, 分离出各媒体的原始数据流, 并打上时钟信息后送给下级的decoder filter。为识别出不同的文件类型和媒体类型,常规的做法是读取一部分数据, 然后遍历解复用过滤器支持的文件格式和媒体数据格式, 做匹配来确定是哪种文件类型,哪种媒体类型;有些媒体类型的原始数据外面还有其他的信息,比如时间,包大小,是否完整包等等。Demux filter解析数据包后取出原始数据, 有些类型的媒体不管是否完整包都立即送往下级的decoder filter, 有些类型的媒体要送完整数据包, 此时可能有一些数据包拼接的动作;当然时钟信息的计算也是demux filter的工作内容, 这个时钟用于各媒体之间的同步。例如, AVI Splitter是Demux filter。

Decoder filter:解码过滤器的作用就是解码数据包,并且把同步时钟信息传递下去,对视频媒体而言,通常是解码成YUV数据,然后利用显卡硬件直接支持YUV格式数据Overlay快速显示的特性让显卡极速显示。YUV格式是一个统称, 常见的有YV12, YUY2, UYVY等等。有些非常古老的显卡和嵌入式系统不支持YUV数据显示, 那就要转换成RGB格式的数据, 每一帧的每一个像素点都要转换, 分别计算RGB分量,并且因为转换是浮点运算, 虽然有定点算法, 还是要耗掉相当一部分CPU,总体上效率低下。对音频媒体而言, 通常是解码成PCM数据,然后送给声卡直接输出, 在本例中,  AVI Decompress和ACM Warper是decoder filter。

Color space converter filter: 颜色空间转换过滤器,它的作用是把视频解码器解码出来的数据转换成当前显示系统支持的颜色格式。通常视频解码器解码出来的是YUV格式, PC系统是直接支持YUV格式的, 也支持RGB格式, 有些嵌入式系统只支持RGB格式。在本例中,视频解码器解码出来的是RGB8格式的数据, Color space converter filter把RGB8转换为RGB32显示。

Render filter:渲染过滤器, 它的作用是在适当的时间渲染相应的媒体,对视频媒体就是直接显示图像, 对音频就是播放声音。视音频同步的策略方法有好几种,其中最简单的一种就是默认视频和音频基准时间相同, 这时音频可以不打时钟信息,通过计算音频的采样频率,量化bit数, 声道数等基本参数就知道音频PCM的数据速率,按照这个速率往前播放即可;视频必须要使用同步时钟信息来决定什么时候显示。DirectShow采用一个有序链表,把接受到的数据包放进有序连表中,启动一个定时器, 每次定时器时间就扫描链表,比较时钟信息,或者显示相应的帧,或者什么也不做,每次收到新的数据帧,首先判断时钟信息,如果是历史数据帧就丢弃,如果是将来显示的数据帧就存放在有序链表,如果是当前时间帧就直接显示。如果这样,保持视频和音频在人体感觉误差范围内相对的动态同步。在本例中VideoRender和Default DirectSound Device是Render filter, 同时也是Sink filter。

GraphEdit应用程序:它可以看成是一个支撑平台,支撑框架。它容纳各种filter,在filter间的传递一些通讯消息, 控制filter的运行(启动暂停停止),维护filter运行状态。GraphEdit就像超级大管家一样, 既维护管理看得见的filter,又维护管理看不见的运行支持环境。

通过上面的讲述,希望能对多媒体的框架的基本元素有一定的了解,虽然ffmpeg库自成一体,但是也是能够归纳到上面的流程之中的。

知识普及:

(一)  YUV: 主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视。与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB要求三个独立的视频信号同时传输)。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V” 表示的则是色度(Chrominance或Chroma)。

(二)PCM:主要过程是将话音、图像等模拟信号每隔一定时间进行取样,使其离散化,同时将抽样值按分层单位四舍五入取整量化,同时将抽样值按一组二进制码来表示抽样脉冲的幅值。

DirectShow框架与流程

DirectShow(简称 DShow) 是一个 Windows 平台上的流媒体框架,提供了高质量的多媒体流采集和回放功能。它支持多种多样的媒体文件格式,包括 ASF、MPEG、AVI、MP3和WAV 文件,同时支持使 动或早期的 VFW 驱动来进行多媒体流的采集。

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

DirectShow 专为 C ++ 而设计。 Microsoft 不提供用于 DirectShow 的托管 API。

DirectShow 是基于组件对象模型(COM)的,因此当你编写 DirectShow 应用程序时,你必须具备 COM 客户端程序编写的知识。对于大部分的应用程序,你不需要实现自己的 COM 对象,DirectShow 提供了大部分你需要的 DirectShow 组件,但是假如你需要编写自己的 DirectShow 组件来进行扩充,那么你必须编写实现 COM 对象。

使用 DirectShow 编写的典型应用程序包括:DVD 播放器、视频编辑程序、AVI 到 ASF 转换器、 MP3 播放器和数字视频采集应用。

DirectShow 架构

DirectShow 的架构如下图所示:

DirectShow 位于应用层中。它使用一种叫 Filter Graph 的模型来管理整个数据流的处理过程;参与数据处理的各个功能模块叫 Filter;各个 Filter 在 Filter Graph 中按一定的顺序连接成一条 "流水线" 协同工作。( 可以看出 FilterGraph 是 Filter 的容器 )

按照功能来分,Filter 大致分为三类:

Source Filters、Transform Filters 和 Rendering(sink) Filters。

Source Filters 主要负责取得数据,数据源可以是文件、因特网、或者计算机里的采集卡、数字摄像机等,然后将数据往下传输;

Transform Fitlers 主要负责数据的格式转换、传输;

Rendering Filtes 主要负责数据的最终去向,我们可以将数据送给声卡、显卡进行多媒体的演示,也可以输出到文件进行存储。

在 DirectShow 系统上,我们看到的,即是我们的应用程序(Application)。应用程序要按照一定的意图建立起相应的 Filter Graph,然后通过 Filter Graph Manager 来控制整个的数据处理过程。DirectShow 能在 Filter Graph 运行的时候接收到各种事件,并通过消息的方式发送到我们的应用程序。这样,就实现了应用程序与 DirectShow 系统之间的交互。

DirectShow使用一种交Filter Graph的模型来管理整个数据流的处理过程;参与数据处理的各个功能模块叫做Filter;各个Filter在Filter Graph中按一定的顺序连接成一条"流水线"协同工作。Filter,它是最基本的软件构件,过滤器通常在多媒体流中执行一个操作。各个Filter在Filter Graph中按一定的顺序连接成一条"流水线"协同工作。如果用图论的术语描述,过滤器图是一个有向、无环、非连通图。有向是因为数据在过滤器之间以预定的方向流动;无环是指没有路径可以从一个过滤器出发又返回到它自身;而非连通是指不是所有的过滤器都可以达到所有其他过滤器。

FFmpeg+DirectShow

ffmpeg -list_devices true -f dshow -i dummy

命令执行后输出的结果如下(注:中文的设备会出现乱码的情况)。

列表显示设备的名称很重要,输入的时候都是使用“-f dshow -i video="{设备名}"”的方式。

获取摄像头数据(保存为本地文件或者发送实时流)

编码为H.264,保存为本地文件

下面这条命令,实现了从摄像头读取数据并编码为H.264,最后保存成mycamera.mkv。

ffmpeg -f dshow -i video="USB2.0 PC CAMERA" -vcodec libx264 mycamera001.mkv

ffplay直接播放摄像头的数据

使用ffplay可以直接播放摄像头的数据,命令如下:

ffplay -f dshow -i video="USB2.0 PC CAMERA"

如果设备名称正确的话,会直接打开本机的摄像头,

DirectShow编码实战

大家好,我的第一本书正式出版了,可以在京东各大店铺抢购哦。

《FFmpeg入门详解--音视频原理及应用:梅会东:清华大学出版社》

京东自营链接:https://item.jd.com/13377793.html
京东其它链接:https://search.jd.com/Search?keyword=FFmpeg%E5%85%A5%E9%97%A8%E8%AF%A6%E8%A7%A3--%E9%9F%B3%E8%A7%86%E9%A2%91%E5%8E%9F%E7%90%86%E5%8F%8A%E5%BA%94%E7%94%A8&enc=utf-8&suggest=1.his.0.0&wq=&pvid=24e80535073b4e1f98e30a3e6963fe81

 

出书过程非常艰辛,来回校正了好几遍,后续还有FFmpeg系列的其它图书。

第一本:FFmpeg入门详解--音视频原理及应用--梅会东--清华大学出版社

第二本:FFmpeg入门详解--流媒体直播原理及应用--梅会东--清华大学出版社

第三本:FFmpeg入门详解--命令行及音视频特效原理及应用--梅会东--清华大学出版社

第四本:FFmpeg入门详解--SDK二次开发及直播美颜原理及应用--梅会东--清华大学出版社

===================================

FFmpeg入门详解之114:DirectShow读取摄像头数据相关推荐

  1. FFmpeg入门详解之113:live555简介

    live555简介 Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持. Live555实现了对多种音视频编码 ...

  2. FFmpeg入门详解之116:rtsp live555摄像头直播

    rtsp+live555摄像头直播 Live555直播流程简介与演示 第一步,读取摄像头数据 第二步,x264编码 第三步,扩展live555 第四步,vlc或ffplay播放 ffplay -sta ...

  3. FFmpeg入门详解之122:Qt5 FFmpeg本地摄像头采集预览实战

    6.Qt5+FFmpeg本地摄像头采集预览实战 源码工程:S26_Test2 FFmpeg命令行处理摄像头 ffmpeg -list_devices true -f dshow -i dummy 命令 ...

  4. FFmpeg入门详解之119:FFmpeg的SDK编程回顾总结并操练

    3.FFmpeg的SDK编程回顾总结并操练 参考课程:"FFmpeg4.3--系列5--SDK二次开发详解与实战" FFmpeg主要框架 FFmpeg骨架:"八大金刚&q ...

  5. FFmpeg入门详解之104:Win10快速安装OpenSSL(不用编译源码)

    win10x64安装OpenSSL:不用编译源码 网上一堆的教程教你去下载opensll源代码并用vs进行编译,虽然我有安装vs2015,但是看到那么长的编译步骤,太心累了. 懒人只得找简单的方法,最 ...

  6. FFmpeg入门详解之89:HTTP-FLV讲解

    HTTP-FLV简介 HTTP-FLV,即将音视频数据封装成 FLV,然后通过 HTTP 协议传输给客户端. HLS 其实是一个 "文本协议",而并非流媒体协议.那么,什么样的协议 ...

  7. FFmpeg入门详解之70:获取音视频流信息(Metadata)

    用FFmpeg获取视频流+音频流的信息(编码格式.分辨率.帧率.播放时长...) 简介 我们经常需要知道一个媒体文件所包含的媒体流的信息,比如文件格式.播放时长.码率.视音频编码格式,视频分辨率,帧率 ...

  8. FFmpeg入门详解之95:live555使用整理

    live555使用整理 live555使用.学习及遇到的问题的整理. 1.live555模块 <1>.UsageEnviroment模块   系统环境的抽象,主要用于消息的输入输出和用户交 ...

  9. FFmpeg入门详解之92:Live555学习之(一)-------Live555的基本介绍

    Live555学习之(一)-------Live555的基本介绍 前一阵子,因为项目需要,研究了一下Live555开源框架,研究的不是很深入,基本上把Live555当做API用了一下,但是毕竟也是本人 ...

  10. FFmpeg入门详解之83:流媒体与直播技术

    流媒体 流媒体又叫流式媒体,它是指商家用一个视频传送服务器(比如:vlc)把节目(比如:ande10.mp4)当成数据包发出,传送到网络上.用户通过解压设备对这些数据进行解压后,节目就会像发送前那样显 ...

最新文章

  1. SSM中配置log4J输出sql语句
  2. Linux字符设备驱动框架
  3. 1800万元砸向子公司 点击网络巩固SaaS业务
  4. Mongodb db.serverStatus()所关心的几个输出值
  5. 简单工厂模式和策略模式的区别
  6. tomcat 调优-生产环境必备
  7. 用lex和yacc写成的一个具有解析类C语言的编译器,能够进行正确的词法、语法、语义分析并生成语法树进行可视化以及中间码。
  8. Base64 编码整理
  9. 关于AppInventor之gzjkw.net版本的电脑模拟器用法
  10. SYBASE 12.5 维护手册 3. 技术专刊
  11. 如何在网页端登录企业邮箱修改密码?
  12. sql按时间取去重最近_Sql去重语句
  13. ORA-01122;ORA-01110;ORA-01207问题解决经验总结
  14. Linux NVMe Driver学习笔记之8:IO SQ/CQ的创建过程
  15. 快速上手MongoDB
  16. map和对象之间的互相转换
  17. oracle 删除表存过,oracle删除数据库中已存在表的实例代码
  18. 互动电影游戏-H5互动游戏方桉之品牌营销
  19. 全国省市区数据SQL - 2017年数据
  20. 了解内网、外网、宽带、带宽、流量、网速

热门文章

  1. 2015年 网络工程师试卷答案及详解
  2. 利用Retrofit, RxJava获取网络内容
  3. WEP 加密的工作原理和安全缺陷
  4. Docker安装及使用
  5. python 画图 实时_Python matplotlib实时画图案例
  6. 4.STACEY矩阵及其对应的开发模型、敏捷开发评估方法
  7. vue 多个filters_Vue filters过滤器的使用方法
  8. 世界上最伟大的推销员
  9. windows 软件界面跑出屏幕外的处理方法
  10. BlenderGIS插件安装和排错