FFmpeg源码世界:命令篇
前言最近在做一些音视频领域的工作,这个领域基本绕不开 FFmpeg ,因此想对其源码进行一些研究,站着这个巨人的肩膀上,学习一下其设计思想以及实现思路,FFmpeg 很多人最开始接触的应该都是它的命令和 ffplay ,这篇我们就先分析下 ffmpeg 命令 的实现。
从问题出发
FFmpeg的命令结构是什么样的
怎么实现任意功能、配置的随意组装的
倒放这种非线性的情况是怎么处理的
当不需要转码类似只需要转封装的话是如何处理的
命令结构1ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
流程推测
应该要有一个数据层,按照输入参数进行数据解析
将解码、转码、功能处理、编码四个模块抽象分开
按第一个环节数据解析的结构组装上述四个模块,形成一条或多条责任链的效果
开始处理
过程中应该有很多分支判断、参数设置之类的情况,在这里都不考虑,我们先只分析主链路。
主流程首先 ffmpeg 命令的入口在 ...
音视频编解码之路:JPEG编码
前言本篇是新开坑的 音视频编解码之路 的第一篇,这个系列主要通过书籍、网上的博文/代码等渠道,整理与各编码协议相关的资料和自己的理解,同时手撸下对应格式的“编解码器”,形成对真正编解码器的原理的基础认识,从而后续可以进一步研究真正意义上的编解码器如libx264的逻辑与优化。
之前在查找编解码的学习资料时,看到了韦神的经验之谈,因此就以JPEG的编码来开篇吧。
本篇整体脉络来自于手动生成一张JPEG图片,不过针对文章中的诸多细节做了补充和资料汇总,另外把代码也用C++和OOP的方式修改了下。范例工程位于avcodec_tutorial。
编码步骤基本系统的 JPEG 压缩编码算法一共分为 10 个步骤:
颜色模式转换
分块
离散余弦变换(DCT)
量化
Zigzag 扫描排序
DC 系数的差分脉冲调制编码(DPCM)
DC 系数的中间格式计算
AC 系数的游程编码(RLE)
AC 系数的中间格式计算
熵编码
接下去我们将逐一介绍上述的各个步骤,并在其中穿插涉及的一些概念与实际代码。
颜色模式转换JPEG 采用的是 YCbCr 颜色空间,这里不再赘述为啥选择YUV等等重复较多的内容 ...
跨平台渲染引擎之路:框架与核心模块
前言说好的保持一月一更再次食言了,再也不敢随便立Flag了,这段时间只能在业余时间进行 GPUImage-X 的设计和第一版的落地,除了时间因素之外,还有就是想要把第一版的整体框架和基础能力都能以更编码规范、考虑更充分地落地下来,不仅仅是一个小玩具更是一个可以被使用的渲染库,因此在过程中就会出现返工重复调整等情况。
目前 GPUImage-X 的整体框架中各个层级的主要模块已基本落地,整体设计上在个人来看符合我们上一篇中的部分目标:以游戏引擎的效果和特性,支持图片/视频等场景下的跨平台3D渲染库。在功能上,该库落地了图层、滤镜链、变换、包括转场、遮罩、叠加在内的混合模式等基本功能,同时不管是更多样的图层元素还是粒子、光照等更广泛的效果都也已具备了对应扩展性。在项目里配套了一个可调节上述能力参数效果的Demo,不过目前只实现了Mac上的版本,其他平台的在下一步规划里会优先安排上,确保跨平台可用这一点。
那么接下来这篇文章主要会介绍这个过程中自己的一些想法还有踩过的一些坑,有存在问题的地方期待看的大佬们交流纠正~
站在bgfx的肩膀上首先简单说一下为什么一开始先基于bgfx来搭建这个项 ...
跨平台渲染引擎之路:bgfx再分析与启程
前言因为最近事情太多,导致原本每月至少一篇的计划整整延迟了一个季度,所幸现在大多事情都比较明确和稳定了,因此接下来会保持基本每月至少一篇的进度,同时渲染库也会正式开始进行,感兴趣的提前Star关注一下~
GPUImage-X :以游戏引擎的效果和特性,支持图片/视频等场景下的跨平台3D渲染库
不一样的渲染库在之前研究阶段我们看到的大多都是以游戏为需求出发的游戏引擎,这类引擎一方面代码量庞大,架构复杂,包罗万象,在现阶段直接以游戏引擎或者类似bgfx的渲染引擎为目标从0开始撸一套明显会有些力不从心,而且这个重复造轮子的程度就有点高了,因此是否可以有一种方式能让我们既可以从中学习到渲染引擎以及之上的各个效果系统的实现方式,同时又能去适应其他不同的场景,增加我们的成就感呢?
现在市场上各类社交、工具中都有视频和图片的场景,并且用户都喜欢在上面添加各类特效,甚至也已经看到了各种3D的玩法,但是在我尝试使用Urho3D等游戏引擎来适配这类场景的时候,发现使用难度较大,因为这些游戏引擎的初衷并不是为了这样的场景而设计的,引擎内的很多系统也都是这类场景所不需要的,导致编译出来的库也较大,同时学习成本 ...
跨平台渲染引擎之路:Urho3D分析与数据驱动
前言前面我们分析了 bgfx 这个项目,从这个项目里面获得了许多我们不清楚和想了解的信息,而因为在初期阶段我们更多地是想要搭建出一个能够自由切换渲染后段的渲染引擎,而对于其他如粒子等诸多系统倒不是那么在意,因此对于Urho3D的分析就会更加简单化,只主要侧重在Urho3D的主要渲染流程上,以及一些在过程中接触到的零零散散的事项。
在这段时间里面有接触数据驱动,在目前的许多引擎中都是采用这种方式来进行开发的,因此会在本文中加入对数据驱动的一些内容。
Tips:该文章基于 Urho3D 的 1569ef3247999ba4304e991a1f510826a73268b7(SHA1值)提交进行分析
使用方式我们以 Urho3D 的 Hello World 为例,简单介绍下该项目的使用方式:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253URHO3D_DEFINE_APPLICATION_MAIN(HelloWorld)HelloWorld:: ...
跨平台渲染引擎之路:bgfx分析
Tips:该文章基于 bgfx 的 bd2bbc84ed90512e0534135b1fcd51d02ae75c69(SHA1值)提交进行分析
从问题出发如果每个引擎的研究我们都逐行代码地看下去,那么要耗费较长的时间不说,而且收获到也不一定都是我们真正需要的,整体的效率就会显得非常低下,每个开源项目都有很多我们可以学习也有很多是个人开发/设计习惯所致的结果,因此在这里我们一样和上一篇中一样,带着问题出发,先思考我们想要从这个引擎中学到哪些东西。以我个人的角度出发,我希望搞清楚的以下几个内容:
简单的使用流程是怎么样的
主要的渲染流水线是怎么样的?有哪些比较核心的类?
是如何实现切换渲染驱动的
是否需要持有平台数据?又是如何持有和使用的
文字、多边形的绘制是怎么实现的?
粒子、光照这些扩展的效果是直接包含在渲染框架内的吗?在bgfx上怎么实现的?
框架的一些特点
这些问题首先可以帮助我了解一个优秀的开源引擎的使用方式是什么样子的,是否有通过什么样的巧妙设计来让使用方用起来更加得心应手;接下来可以让我学习到这个项目是如何做好各平台适配的,以及时通过什么样的方式来切换各种渲染驱动的; ...
跨平台渲染引擎之路:拨云见日
从问题出发且不论游戏引擎这样的庞然巨物,就只说渲染引擎所需要涉及的内容就非常,你可能要考虑怎么去封装渲染API,还要考虑怎么去整合各类效果系统,初版效果出来了,要不要考虑搞搞Vulkan搞搞Metal,什么样的方案才是最佳的等等。
因此如果没有一个方向就开始寻找资料的话和大海捞针没有什么区别,也容易因为一时间接收的资讯过多进而打击信心和兴趣,因此在开始找资料之前我给自己定了几个问题,以这个几个问题为方向去找资料为自己解答:
一个渲染引擎是由哪些系统组成的?这些系统都是不可或缺的吗?
实现一个渲染引擎需要点亮哪些技能点?哪些是必须技?哪些可以边做边点亮?
渲染引擎的基本渲染流程是什么样的?
目前有哪些出色的渲染引擎?怎么筛选参考引擎?参考哪些?
而在寻找答案的过程中,自然而然就也会接触到其他方面的内容,比如一些自己之前见都没见过的名词,或者是大多数引擎都在用的成熟方案等等,这些也都会一并记录下来。
启程其实这篇文章是有一个检验收获的方式的,这个方式在一开始是没有的,但是在找资料的过程中看到知乎大佬的回答有所感悟,在这篇文章结束时再回过头来看看下面这句话,如果大致明白了,那么这篇文章就 ...
【OpenGL-ES】模型变换与坐标系统
前言此前我们创建的物体是静态的,我们可以尝试在每一帧来改变物体的顶点,用新的顶点重新配置缓冲区,从而使物体动起来,但是这样做太过繁琐了,而且会消耗许多不必要的时间。
更好的解决方案是,使用一个或多个矩阵对象来与不变的顶点坐标进行计算,从而实现物体变换的效果。
矩阵是一种非常有用的数学工具,但是在这里不会做过多的介绍,就只简单介绍一下向量与矩阵的一些简单知识以及运算规则,作为实现变换操作的一点基础,其他更详细的内容请自行查看关于向量、矩阵以及线性代数等相关数学知识。本章节第二部分会介绍一下OpenGL中的多个坐标系统,以及最后产出一个应用了模型变换的Demo。
本章节结构以及主要内容来自Learn OpenGL教程的Transformations与Coordinate Systems,主要将Demo由OpenGL转为OpenGLES,同时在教程内容上补充了一些自己的理解和看法,图片效果会以手机上的贴出来,如果是视频的话就以教程里面的视频为准,具体效果请运行Demo在手机上查看。
Part1向量向量最基本的定义就是一个方向。或者更正式的说,向量有一个方向(Direction)和大小(Ma ...
【OpenGL-ES】二维纹理
前言上一节介绍了OpenGL及EGL等方面的一些相关内容,在最后通过绘制一个简单的三角形来展示了在Android上使用OpenGL ES的大致步骤。大部分教程中接下来的章节会介绍向量、矩阵等,从而引入坐标和变换,但是因为这部分在现在我们的实际开发中应用并不大,所以该章节会先介绍OpenGL中的纹理,在下一节中就可以通过绘制纹理来更直观地介绍坐标与变换。
因为OpenGL的纹理映射本身也是比较大的主题,本节只限于讨论二维纹理的基本使用,对于纹理映射的其他方法,后面会继续学习。本章节主要参考 Textures objects and parameters 以及 OpenGL学习脚印: 二维纹理映射(2D textures)
,后者是目前阅读过的讲解纹理方面条理最清晰的国内博文。但是该博文是使用OpenGL进行示例,所以我将该文中的示例改为Android上的OpenGL ES,同时添加了一些额外的细节讲解和自己的理解,如纹理映射原理和纹理颠倒问题等,也在文末多加了灰度图的拓展从而展示OpenGL进行图像处理的优势,文中涉及到的代码也会更详尽。
通过本节可以了解到
纹理映射的概念和原理
渲染 ...
【OpenGL ES】入门及绘制一个三角形
简介OpenGL
OpenGL(全写Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维亦可),是一个功能强大,调用方便的底层图形库。此处L代表的是Library而不是Language。
OpenGL在不同的平台上有不同的实现,但是它定义好了专业的程序接口,不同的平台都是遵照该接口来进行实现的,思想完全相同,方法名也是一致的,所以使用时也基本一致,只需要根据不同的语言环境稍有不同而已。
OpenGL ES
OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。
OpenGL ES相对于OpenGL来说,减少了许多不是必须的方法和数据类型,去掉了不必须的功能,对代价大的功能做了限制,比OpenGL更为轻量。在OpenGL ES的世界里,没有四边形、多边形,无论多复杂的图形都是由点、线和三角形组成的,也去除了glBegin/glEnd等方法。
EGL
EGL 是 OpenGL ES 渲染 AP ...