iOS接下来要研究的知识点

从零开始仿写一个抖音App——视频编辑SDK开发(二)

2020-02-18  本文已影响0人  何时夕

搬运转载请注明出处,否则将追究版权责任。交流qq群:859640274

大家好久不见,又有两个多月没有发文章了。最近新型肺炎闹得挺凶,希望大家不要出去乱跑且身体健康。本篇博客是视频编辑 SDK 解析文章中的第二篇,文章中我会介绍将上一篇文章中解码出来的视频帧通过 OpenGL 绘制出来的方式。WsVideoEditor 中的代码也已经更新了。大家在看文章的时候一定要结合项目中的代码来看。

本文分为以下章节,读者可按需阅读:

一、OpenGL之我的理解

讲解 OpenGL 的教程目前有很多,所以这一章笔者不会去教大家如何入门或者使用 OpenGL。本章笔者只会从抽象的角度来和大家讨论一下笔者对于 OpenGL 的理解。至于如何入门 OpenGL 则会推荐几个有用的网站。

1.OpenGL是什么?可以干什么?

图1:OpenGL之我的理解.png

如图1,我们知道 OpenGL/OpenGL ES 是一个图形图像渲染框架,它的规范由Khronos组织制定,各个显卡厂商在驱动中实现规范,再由各个系统厂商集成到系统中,最终提供各种语言的 API 给开发者使用。

当然图形图像渲染框架不仅仅只有 OpenGL 这一种。Apple 的 Metal(不跨平台)、Google 的 vulkan(跨平台)、微软的 DirectX(不跨平台) 都是 OpenGL 的竞品。

那么什么是图形图像渲染框架呢?做 Android、iOS、前端、Flutter 的同学一定都用过 Canvas,在各自的平台中 Canvas 就是一个比较上层的图形图像渲染框架

图2:Canvas对比.png

如图2,我们在使用 Canvas 绘制一个三角形的时候一般有以下步骤,在 OpenGL 中也是类似:

除了像 Canvas 一样绘制 2D 图像,OpenGL 最主要的功能还是进行 3D 绘制,这就是 Canvas 们无法企及的地方了。

2.OpenGL是如何工作的?

要了解 OpenGL 是如何工作的,首先我们得知道:OpenGL 运行在哪里? 没错有些读者已经知道了:OpenGL 运行在 GPU 上面,至于在 GPU 上运行的好坏我就不赘述了。

我们在平时的开发当中,绝大部分时间都在与内存和 CPU 打交道。突然让我们写运行在 GPU 上面的程序,我想大部分人都会水土不服,毕竟这是一个思维上的转变。大多数教程一上来就是告诉大家如何调用 OpenGL 的 api,然后拼凑出一个程序来,大家也照猫画虎的敲出代码,但最终很多人并没有理解 OpenGL 是如何运行的,这也是它难学的地方。那么下面我会通过一张图来粗略的讲讲 OpenGL 是如何运行的。

图3:OpenGL是如何运行的
图3中有1、2、3、4、5 个步骤,这几个步骤组合起来的代码就表示绘制一个三角形到屏幕上。可运行的代码可以在learning-opengl这里找到,图中的代码只是关键步骤。我这里也只是讲解 OpenGL 的运行方式,更具体的代码使用还需要读者去前面的网站中学习。

这里我推荐两个教程,让让大家能够学习 OpenGL 的具体用法,毕竟仰望星空的同时脚踏实地也非常重要:

二、Android层的框架搭建

我的老本行是 Android 开发,所以这一章我会讲解视频编辑SDK在 Android 层的代码。代码已经更新 WsVideoEditor,本章需结合代码食用。另外本章节强依赖 从零开始仿写一个抖音App——视频编辑SDK开发(一) 的第三章SDK架构以及运行机制介绍,大家一定要先读一下。本章会省略很多已知知识。

图4:编辑SDK架构.png

1.WsMediaPlayer

图4是编辑 SDK 的架构图,从中我们可以看见 WsMediaPlayer 代理了 Native 的 NativeWSMediaPlayer 的 Java 类。该类具有一个播放器应该有的各种 API,例如 play、pause、seek 等等。其实很多 Android 中的系统类都是以这种形式存在的,例如 Bitmap、Surface、Canvas 等等。说到底 Java 只是 Android 系统方便开发者开发 App 的上层语言,系统中大部分的功能最终都会走到 Native 中去,所以读者需要习惯这种代码逻辑。那么我们就来看看这个类的运行方式吧。

2.WsMediaPlayerView

如果把播放视频比作:一个绘画者每隔 30ms 就向画布上绘制一幅连环画的话。那么绘画者就是 WsMediaPlayer,连环画就是视频,画布就是 WsMediaPlayerView。

三、C/C++渲染视频帧

我在从零开始仿写一个抖音App——视频编辑SDK开发(一) 的第四章VideoDecodeService解析中讲解了如何解码出视频帧,在上一章中讲解了如何在 Android 层准备好 OpenGL 的渲染环境。这些都为本章打下了基础,没有看过的同学一定要仔细阅读啊。同样本章的代码已经上传至WsVideoEditor,请结合代码食用本章。

图5:编辑SDK运行机制

1.FrameRender绘制流程解析

图5是视频编辑 SDK 的运行机制,本次我们解析的功能是在 FrameRender 中渲染 VideoDecodeService 提供的视频帧,也就是视频播放功能。下面我们就从第二章中提到的 WsMediaPlayer.draw 方法入手。

2.OpenGL缓存和绘制解析

通过上一小结的介绍,我们知道了绘制视频帧的大致流程,但是我们只是粗略的介绍了整个渲染流程。所以这一节作为上一节的补充,会简单介绍一下我们的 OpenGL 缓存逻辑和绘制逻辑。

四、尾巴

又是一篇大几千字的干货出炉,希望这篇文章能让你满意,废话不多说,我们下篇文章见。

连载文章

不贩卖焦虑,也不标题党。分享一些这个世界上有意思的事情。题材包括且不限于:科幻、科学、科技、互联网、程序员、计算机编程。下面是我的微信公众号:世界上有意思的事,干货多多等你来看。

世界上有意思的事
上一篇 下一篇

猜你喜欢

热点阅读