为了账号安全,请及时绑定邮箱和手机立即绑定

从零开始仿写一个抖音App——跨平台视频编辑SDK项目搭建

标签:
Android

不知不觉已经到了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 项目一起编译,目前是空的。

webp

图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。

webp

图2:mttvideoeditorsdk目录

webp

图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 和他的头文件链接到整个项目中

webp



作者:何时夕
链接:https://www.jianshu.com/p/8b2f7e20859a


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消