不知不觉已经到了2019年,本系列的文章也更新到了8篇。很庆幸笔者能坚持下来,从我司的代码中学习到了很多东西。当然更庆幸的是收获了众多读者的鼓励和支持。从本篇文章开始,我们将接触短视频 app 中比较核心的功能——视频编辑,笔者在我司的日常工作中,也经常对这个模块进行开发,可以说对这部分功能比较熟悉了。所以最近的几篇文章,我会从零开始完善一个视频编辑 sdk 的各种功能,最后集成到我们之前的 MyTiktok 项目中。注:本文以 android 平台为例子,ios 因为不会,所以暂时不涉及。
本文分为以下章节,读者可按需阅读:
1.项目建立——新建一个跨平台视频编辑项目
2.基础 lib 集成——将 ffmpeg、protobuf 这些必须使用的三方库集成到项目中
3.基础数据结构——定义和讲解一些视频编辑流程中需要使用到的数据结构
一、项目建立
1.方法论
我想看本文的人有很大一部分都是 android 工程师,所以在讲干货之前,我需要讲一讲方法论
1.当我们在使用 IDE 开发 App 的时候,我们在干什么?
1.创建一个文件夹,模仿 AS 生成的项目,向文件夹里面加文件
2.在 gradle 文件中添加依赖库,然后写代码。使用命令行来 sync gradle。
3.命令行运行 gradle 来打包 APK,运行 App
1.首先我们会使用 AS 来新建一个项目,项目会有很多可选的参数。
2.在项目的 gradle 文件中添加依赖库,然后写代码
3.打包成 APK,运行 App
1.Android 工程师平时使用 Android Studio 来开发 App,ios 工程师使用 XCode。那么我们平时在使用 IDE 的时候,我们到底在干什么呢?
2.这里我以 Android 来举例子:
3.上面就是我们平时开发的流程了,那么我们能不使用 IDE 来开发一个 App 吗?理论上来说是可以的,有下面这些步骤。
4.其实我们不需要 AS 就能进行 Android 开发(当然没有人那么傻)。我们需要的只是一个项目管理的工具——gradle。放在不同的开发者那里,只是项目管理的工具不同:写 java 的用 maven、写 python 的用 conda/pip、写前端的用 npm、写 c/c++ 的用 CMake。
5.所以当一个项目中既要写 c++ 又要写 android 还要写 ios 的时候,我们只需要三个项目管理工具就行了,IDE 对我们来说只是一个文件编辑器+文件搜索器+文件浏览器。
6.以上就是我作为一个 android 工程师,在使用了各种不同语言构建不同项目之后思维上的转变。当你能看清和思考一个东西的本质的时候你能走的更远。
2.项目搭建
那么废话不多说,就开始搭建我们的项目吧。注意:目前 MyTiktokVideoEditor 已经上传到了 github 上面了,建议结合项目食用,
1.首先我们新建一个文件夹,然后进入文件夹中。在其中创建下面这些东西,如图1。里面的东西我一个个来讲解
1.首先 LICENSSE 和 README.md 就不用说了。
2.android:下面是一个完整的 android 工程,android 工程的内部也会引用到外部的文件,这个后面再说。
3.ios:下会是一个完整的 ios 工程,当然我目前还不会 ios,所以先略过
4.buildtools:里面会存放一些项目运行时的脚本,比如我们在 上一篇文章 中用到的编译 FFmpeg 的脚本等等
5.docs:内部存放一些项目文档
6.sharedcode:里面存放 android 和 ios 共享的代码,如 c/c++ 代码等等,还有就是 protobuf 生成的代码。
7.sharedproto:里面存放 android、ios、c++ 三端共享的 protobuf 代码,可以使用 buildtools 里面的脚本一键生成三端的代码
8.third_part:可以以 git submodule 的形式,引用其他的三方库的源代码与 android 和 ios 项目一起编译,目前是空的。
图1:根目录
2.介绍好了项目构成,我们开始配置 android 项目吧。
1.首先 externalNativeBuild.cmake 里面配置了一些参数,这里只要知道我们使用的是 c++11 就好了
2.externalNativeBuild.ndk 里面我们只生成一种 so 文件就是 armeabi,本来是应该使用 arm64-v8a,这样才是最佳适配,现在就先凑合着用吧
3.再看外面的 externalNativeBuild.cmake,这里设置了 CMake 的路径,注意这里是以当前 gradle 文件为初始路径的。
1.多了 jni.editorsdk 目录,这个目录用来存放 jni 文件,相当于是 c/c++ 和 java 的中间层。
2.然后是 CMakeLists.txt 文件,其用于管理 android 项目需要引入的 c/c++ 代码。
1.首先,我们需要使用 AS 来创建一个支持 C++ 的工程,注意目录需要选在上面提到的 android 目录下面。
2.创建好了之后,我们需要创建一个 android library 作为视频编辑 sdk 的载体。这个 module 将会整合所有的,共享 cpp 代码、.so 文件、.a 文件,然后通过 java 代码被外部调用。在项目中我将这个 module 命名为了 mttvideoeditorsdk
3.至于 app module 可以引用 mttvideoeditorsdk module 便于平时调试 sdk。
4.我们再来看 mttvideoeditorsdk 的结构如图2,其实比较简单
5.我们再来看看 gradle 文件是怎么配置的如图3。
图2:mttvideoeditorsdk目录
图3:mttvideoeditorsdk的gradle文件
二、基础 lib 集成
上面讲了如何搭建项目,这一章就来讲讲如何集成一些基础库吧。
首先我们都知道,在 android 中我们可以使用 gradle 向远程中央仓库拉取我们需要的库。像 java 的 maven、js 的 npm、ios 的 pods都有这个能力。但是在 c/c++ 上的项目管理工具 CMake 就没有这个能力,它只能在本地搜索和集成你已经安装好的库或者源码,而且 c/c++ 又不具有跨平台能力。所以最终就导致了我们如果想使用 ffmpeg、protobuf 这样大型的开源项目都需要自己去 clone 源码然后自己编译出不同平台的库。
1.FFmpeg 集成
1.说到 FFmpeg 的集成,其实我在这里,已经提到过一些了。我这里就简单讲讲。
2.首先我们需要编译 FFmpeg 的代码获取 so 库和 头文件,我的这个项目与上次不同,现在已经能编译出一个单独的 libffmpeg.so 的文件了,大家可以之前拿过来用。
3.然后我们在 android 项目下面新建一个目录用来储存这些东西,如图4。
4.最后我们看代码块1,这里都有注释比较简单,就是将 libffmpeg.so 和他的头文件链接到整个项目中
作者:何时夕
链接:https://www.jianshu.com/p/8b2f7e20859a
共同学习,写下你的评论
评论加载中...
作者其他优质文章