通过比较DirectShow和ffmpeg两者的FilterGraph,分析ffmpeg的FilterGraph运作。

首先FilterGraph是一个图,图由点和边构成。在FilterGraph中的点就是Filter。在DirectShow中,没有边对象,Filter的连接依赖Pin组件以及IPin接口,一对InputPin和OutputPin构成一条边。每个Filter可以有至少一个Pin,即每个点有至少一条边,(排除只有一个点的图,和没有邻接边的点的情况)。构成连接的InputPin和OutputPin互相持有对方的引用。FilterGraph的运作依赖IPin接口的三个方法read,async_read以及receive。上流数据通过出边(OutputPin)调用对端的入边(InputPin)的receive推送到下游。逆过来,下游通过入边(InputPin)调用对端的出边(OutputPin)的read或async_read向上流拉数据。上游源数据得以经过图中某条路径到达下游目的地。

在ffmpeg里,AVFilterContext则是点,AVFilterLink则是边。AVFilterLink是AVFilterContext的出入边,AVFilterContext则是AVFilterLink的邻点。AVFilterPad是相当于Pin的部件,使FilterGraph可以运行起来。AVFilterPad主要功能是三个接口函数,poll_frame,request_frame以及filter_frame。

通过递归向下游“先序”遍历,推送帧数据

filter_frame (link, frame) {
filter (frame);
input_pad->filter_frame (link, frame);
}

通过递归向上游“后序”遍历,拉帧数据

request_frame (link, frame) {
output_pad->request_frame (link, frame);
filter (frame);
}

对象图请参看上一篇《解构ffmpeg(一)》

解构ffmpeg(二)的更多相关文章

  1. ES6入门之变量的解构赋值(二)

    前言 在上一章 ES6入门之let和const命令中我们对ES6的相关语法已经有了初步了解,上一章中我们主要学习了三大部分的内容,let命令的使用,块级作用域,const命令的使用,那么从本篇博客将进 ...

  2. es6初级之解构----之二 及 键值反转实现

    1.解构: 不定参数,扩展表达式 let arr = [100, 201, 303, 911]; let [one, ...others] = arr; console.log(others.leng ...

  3. 解构ffmpeg(一)

    ffmpeg应用程序项目将其核心库libav*的使用或编程抽象成FilterGraph,InputFile,OutputFile,InputStream,OutputStream,InputFilte ...

  4. ECMAScript 6 入门学习笔记(二)——变量的解构赋值

    一.数组的解构赋值 let [foo, [[bar], baz]] = [1, [[2], 3]]; ①可多不可少,等号的右边是数组 let [x, y] = [1, 2, 3]; //可以 let ...

  5. ES6 变量与解构(二)

    一.变量的声明与使用 [测试示例需要在node环境中测试,浏览器环境下并不完全兼容ES6代码]ES6中可以使用 {} 来包含任意一段代码,被 {} 包裹的内容称为一个代码块(局部作用域) let关键字 ...

  6. ES6 学习笔记(二)解构赋值

    一.数组的解构赋值 1.基本用法 ES6允许按照一定模式从数组和对象中提取值,然后对变量进行赋值,该操作即为解构 如: let [a,b,c]=[1,2,3]; console.log(a,b,c) ...

  7. ES6(二)解构赋值详解

    详解一下之前的解构赋值 ①解构赋值中的"..." let [a,...b]= [1]; b // [] ...代表变量b去匹配剩余的所有元素返回一个数组 ,匹配不到时返回[] // ...

  8. ES6-个人学习笔记二--解构赋值

    第二期,解构赋值如果能够熟练应用确实是个十分方便的功能,但是过分的依赖和嵌套只会让代码理解和维护起来十分困难,是个体现高逼格的表达式呢~ 1,解构赋值的基础 //定义:es6运行按照一定模式,从数组或 ...

  9. ES6(二) Destructuring-变量的解构赋值

    1.解构的含义 允许按照一定的模式,从数组和对象中取值,对变量进行赋值,称为解构. 解构赋值时,只要等号右边的值不是对象,就先将其转换成对象. 本质上,这种写法属于 “模式匹配”,只要两边模式相同,左 ...

随机推荐

  1. 16.Nginx HTTPS实践

    1.不做任何修改实现http跳转https(协议间的跳转): return [root@web01 conf.d]# cat url.cheng.com.conf server { listen 80 ...

  2. VAD树结构体的属性以及遍历

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html VAD树的属性以及遍历 前面学习过的PFNDATABSAE是管理物 ...

  3. ESP8266开发之旅 基础篇③ ESP8266与Arduino的开发说明

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  4. Visual Studio Code 添加C/C++编译功能

    VS Code作为一个文本/代码编辑器,相较于VS比较轻量化,而且可以支持C/C++.Python等多种语言,并具有丰富的拓展模块. 但是作为一个编辑器,在VS Code上安装C/C++模块之后,并不 ...

  5. Java IO_002.InputStream与OutputStream--字节流对数据的操作(读取与写入)

    Java IO之FileInputStream与FileOutputStream对象常用操作 涉及到文件(非文件夹)内容的操作,除了要用到File(见之前文章),另外就必须用到输入流或输出流. 输入流 ...

  6. Java基础(40)String、StringBuilder和StringBuffer的区别(TODO)

    一.String String实现了Serializable接口.Comparable<String>接口和CharSequence接口,并且使用final char value[]不可变 ...

  7. 构建企业级数据湖?Azure Data Lake Storage Gen2实战体验(下)

    相较传统的重量级OLAP数据仓库,“数据湖”以其数据体量大.综合成本低.支持非结构化数据.查询灵活多变等特点,受到越来越多企业的青睐,逐渐成为了现代数据平台的核心和架构范式. 作为微软Azure上最新 ...

  8. ArcGIS Engine制作DIY地图工具

    本节将向你介绍,利用ToolStrip制作自定义GIS工具条. 步骤如下: ①向ToolStrip中添加一个Button ②向该Button的lmg属性添加图片素材,并将Button的图片比例(Ima ...

  9. 通过 Django Pagination 实现简单分页

    作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 当博客上发布的文章越来越多时,通常需要进行分页显示,以免所有的文章都堆积在一个页面, ...

  10. Asp.Net Core 单元测试正确姿势

    背景 ASP.NET Core 支持依赖关系注入 (DI) 软件设计模式,并且默认注入了很多服务,具体可以参考 官方文档, 相信只要使用过依赖注入框架的同学,都会对此有不同深入的理解,在此无需赘言. ...