- 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 来从视频中解码出当前时间点的视频帧,然后存储到一个