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

本文介绍了如何从零开始仿写一个抖音App的视频编辑SDK,重点讲解了SDK的架构和运行机制。编辑SDK包括基础API和SDK主体,其中VideoDecodeService负责视频解码,分为Android层和Native层。VideoDecodeService内部有视频帧缓存和音频帧解码,通过OpenGL进行视频渲染。此外,还涉及音频播放、视频帧池和音视频同步等功能。
摘要由CSDN通过智能技术生成
  • 2.按时间轴添加滤镜
  • 3.按时间轴添加静态贴纸、动态贴纸
  • 4.多段视频间转场
  • 2.图片类:
  • 1.添加声音
  • 2.多张图片间的转场
  • 3.照片电影
  • 3.工具类:
  • 1.视频缩略图截取
  • 2.视频元数据读取
  • 4.编码类:
  • 1.导出不同格式的视频
  • 2.更改视频的分辨率、帧率
  • 3.视频转 gif
  • 5.技术类:
  • 1.多进程编解码视频
  • 2.多进程播放视频
  • 3.多进程视频缩略图截取

三、SDK架构以及运行机制介绍

这一章我来介绍一下目前 编辑SDK 的整体架构以及运行机制。

1.编辑SDK架构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图6是 编辑SDK 的架构图,这一节我会照着这张图来介绍。

(1).基础API

先从底部看起,底部是整个 SDK 依赖的底层 API 库。

  • 1.FFMPEG:前面简单介绍过,是一个开源的视频库,在我们的项目中主要用于软编解码
  • 2.MediaCodec:是 Android 中的硬编解码 API,相应的 iOS 也有自己的硬编解码方式。
  • 3.OpenGL:是一个开源的图形库,Android 和 iOS 中都有内置 OpenGL ES 作为默认图形库。在我们的项目中主要用于将视频解码后的视频帧绘制到屏幕上去。当然也可以对这些图像做一些效果的变化,例如滤镜、视频/图片转场等等。
  • 4.Libyuv:是 Google 开源的实现各种 YUV 与 RGB 之间相互转换、旋转、缩放的库。
  • 5.Protobuf:是 Google 开源的一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议。在我们的项目中主要用于 Cpp 与 Java、OC、Dart 之间的数据通信。
(2).SDK主体

接着我们再看图片中的主体部分,因为目前只有 Android 端的实现,所以主体部分的上层实现我使用 Android 来代替。

  • 1.Android层架构
  • 1.WSMediaPlayerView:继承于 TextureView,所以其可以提供一个具有 Open GL 环境的线程。对 Surface 家族不了解的同学可以看看这两篇文章:Android绘制机制以及Surface家族源码全解析相机/OpenGL/视频/Flutter和SurfaceView
  • 2.WSMediaPlayer:这个是一个代理了 Native 的 NativeWSMediaPlayer 的 Java 类。该类具有一个播放器应该有的各种 API,例如 play、pause、seek 等等。其实很多 Android 中的系统类都是以这种形式存在的,例如 Bitmap、Surface、Canvas 等等。说到底 Java 只是 Android 系统方便开发者开发 App 的上层语言,系统中大部分的功能最终都会走到 Native 中去,所以读者需要习惯这种代码逻辑
  • 3.AudioPlayer:这个类是基于 Android 中的 AudioTrack 封装的能够播放音频帧的 Java 类。我们在 Native 层也有一个 AudioPlayer。这里与 WSMediaPlayer 相反 Native 层的 AudioPlayer 是一个空壳,Java 层的 AudioPlayer 反向代理了 Native 层的 AudioPlayer,因为在这里 Java 层的 AudioPlayer 才是真正播放音频的东西。
  • 2.Native层架构:这里我们自底向上来剖析,Native 层的架构
  • 1.AudioDecodeService:它负责使用 FFMPEG/MediaCodec,来从视频/音频中解码出某个时间点的音频帧,并且存储在一个音频帧队列中。最终被外部取出音频帧交给音频播放器播放。
  • 2.VideoDecodeService:它和 AudioDecodeService 类似,是使用 FFMPEG/MediaCodec 来从视频中解码出某个时间点的视频帧并且存储在一个视频帧队列中。最终被外部取出视频帧交给 OpenGL 绘制到屏幕上。
  • 3.VideoFramePool:它负责响应外部的 seek 事件,然后使用 FFMPEG/MediaCodec 来从视频中解码出当前时间点的视频帧,然后存储到一个
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值