解构ffmpeg(一)
ffmpeg应用程序项目将其核心库libav*的使用或编程抽象成FilterGraph,InputFile,OutputFile,InputStream,OutputStream,InputFilter和OutputFilter。
它们的关系为InputFile -- InputStream -- InputFilter -- FilterGraph -- OutputFilter -- OutputStream -- OutputFile。
InputStream和OutputStream分别负责解码和编码应用编程的抽象。
InputFilter和OutputFilter相当于FilterGraph的两个端口,InputStream和OutputStream只管向这两个端口进行送数据或取数据。FilterGraph透明地完成从InputFilter到OutputFilter整条AVFilter链的处理。
InputFile是某种格式的编码源,从此处读入的编码帧被分派到对应的InputStream。
OutputFile是某种格式的编码标,OutputStream的编码过的帧混合在这里。
如果你有相当经验于Windows的DirectShow编程,请区分好ffmpeg的FilterGraph和DS的FilterGraph,勿混肴。在DS的FilterGraph涵盖了整个媒体流,一般形式为SourceFilter -- DemuxerFilter -- DecoderFilter -- FilteringFilter -- EncoderFilter -- MuxerFilter -- DestinationFilter。而ffmpeg的FilterGraph只针对对解码帧的滤镜处理环节。编解码,源格式目标格式的IO不属于FilterGraph的范筹之内。
在这里请区分好ffmpeg应用程序和其核心库libav*。ffmpeg抽象出来的模式使用拉数据。通过OutputStream拉动InputStream端从InputFile读入数据。并不是libav*只能支持拉数据方式。
下面帖上“ffmpeg -i test.mp4 -ss 10 -t 0.1 -f image2 a%03d.png”命令的对象图帮助理解
ffmpeg每组命令对应着使用libav*库进行编程的环节,使用ffmpeg命令就像用宏在将各编程环节拼接起来,那当然只是个比喻。使用ffmpeg命令和你如何使用libav*库进行编程的思维是一致的,可以互相转换。
解构ffmpeg(一)的更多相关文章
- 解构ffmpeg(二)
通过比较DirectShow和ffmpeg两者的FilterGraph,分析ffmpeg的FilterGraph运作. 首先FilterGraph是一个图,图由点和边构成.在FilterGraph中的 ...
- 豪情-CSS解构系列之-新浪页面解构-01
目录: 一. 新浪的布局特点 二. 内容细节的特点 三. 其中相关的一些基础技术点 1. 常见布局方法 2. 布局要点 3. Debugger误区 4.列表 5.字体颜色 6.CSS选择符 7.CSS ...
- es6之变量的解构赋值
es5中通常我们声明变量都是以下的方式: var a = 10; var b = 20; var c = 30; //或者 var a = 10,b = 20,c = 30; //或者 var arr ...
- ES6之解构赋值
截止到ES6,共有6种声明变量的方法,分别是var .function以及新增的let.const.import和class: 我们通常的赋值方法是: var foo='foo'; function ...
- 用vue.js学习es6(三):数组、对象和函数的解构
一.数组的解构: 以前的方式: var arr = [1,2,3]; console.log(arr[0]); //1 console.log(arr[1]); //2 现在的方式: var [a,b ...
- 变量声明---let,const,解构
let在很多方面与var是相似的,但是可以帮助大家避免在JavaScript里常见一些问题. const是对let的一个增强,它能阻止对一个变量再次赋值. 块作用域 当用let声明一个变量,它使用的是 ...
- ECMAScript6学习笔记 ——let、const、变量解构赋值
let 不存在变量提升 通过let声明的变量仅在块级作用域内有效 不允许在同一个作用域内重复声明一个变量 防止值公用 var oUl = document.querySelectorAll('ul&g ...
- ES6 - Note2:解构赋值
ES6的解构赋值就是利用模式匹配从按照一定模式的数组或者对象中提取值赋值给变量. 1.数组的解构赋值 在ES6以前,变量的赋值是直接指定的,以后可以这么来写,如下所示 let [a,b,c] = [1 ...
- es6分享——变量的解构赋值
变量的解构赋值:ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前的写法: var a = 1; var b = 2; es6允许的写法 ...
随机推荐
- selenium-显式等待与隐式等待(3)
示例代码: from selenium.webdriver.support.wait import WebDriverWait as WD def find_element(self, by, loc ...
- 云计算 docker 容器部署
什么是docker容器: 容器就是在隔离的环境中运行的一个进程,如果进程停止,容器就会退出.隔离的环境拥有自己的系统文件,ip地址,主机名等kvm虚拟机,linux,系统文件 容器和虚拟化的区别 : ...
- Eureka -- 浅谈Eureka
目录: 一:Eureka介绍 二:Eureka架构图 三:Eureka组件 四:Eureka作用 五:Eureka和Zookeeper对比 什么是Eureka 引入SpringCloud中文文档介绍 ...
- 代码传奇 | 身价10亿的程序员 雷军当年也为他打工——WPS之父 求伯君
他的前半生,值得我们每一个人深思. 在普通人眼里,他寂寂无名,只有年岁稍长的文化人,才听说过他传奇般的存在. 在IT人眼里,他是块活化石,中国第一的大旗除了他,没人敢抗! 他是求伯君,从一个浙江穷山村 ...
- 不同的phper该如何区别使用swoole和workerman?
那么我们该怎样去区别应用swoole和workerman? workerman workerman纯php写的,swoole是php的c扩展,性能肯定更高,百度.腾 ...
- ORACLE定时备份方案
ORACLE定时备份方案 采用ORACLE的EXP工具,实现ORACLE的备份:采用LINUX的服务crond实现定时功能. 1 编辑SH,实现备份功能 #vi oracle_backup.sh,输入 ...
- JdbcTemplate增删改
(1)Accountsdao层 //删除单个账户 int delaccount(Integer accountid); //添加单个用户 int addaccount(Accounts account ...
- WCF(一):初探WCF
目录: 一.什么是WCF 二.WCF能做什么 三.WCF的模型 四.WCF的基本概念 五.WCF的快速创建 1.WCF是什么? A.WindowsCommunication Foundation(WC ...
- vue条件渲染2
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- ASP.NET Core如何使用压缩中间件提高Web应用程序性能
前言 压缩可以大大的降低我们Web服务器的响应速度,压缩从而提高我们网页的加载速度,以及节省一定的带宽. 何时使用相应压缩中间件 在IIS,Apache,Nginx中使用基于服务端的响应压缩技术.中间 ...