蓝松短视频SDK开发手册

一、蓝松SDK组成

  1. 蓝松SDK包含了视频编辑SDK和AE模版SDK
  2. 此文档基于蓝松SDK4.5.8版本编辑
  3. 文档更新说明:
序号 文档更新内容 时间
1 更新Android、IOS的API说明 20210114
2 更新人像分割SDK库说明 20210519
3 增加Android端错误代码解释 20210716

二、SDK集成和单位说明

2.1、Android端

  1. 我们的SDK以module的形式提供, 在你的项目中点击File/import midule导入,并在您主module中的build.gradle中增加implementation project(':LanSongSDK')(如果是更新SDK, 则先删除当前的module,,并屏蔽build.gradle中的字段, 然后在import导入,再打开屏蔽)
  2. LanSongSDK module下的assets下有LanSongIFxxx开头滤镜用到的各种图片资源, 如您项目没有用到LanSongIFxxx开头的滤镜,则可以删除。
  3. 其他的代码,各种资源,各种视频素材等均为演示所用,不属于sdk的一部分。
  4. 代码使用
1. LanSoEditor.initSDK(getApplicationContext(), null); 
// 初始化SDK.[必须] (null,APP名字一定是我们demo名字)
2. LanSoEditor.setTempFileDir();
//设置SDK处理过程中的临时文件缓存路径,也是我们容器最终生成视频的路径, 您可以设置生成视频名字的前后缀. 此代码是公开的, 您点击后会看到更多注释 [可选]
3. LanSoEditor.setSDKLogOutListener 
//设置日志输出监听 [可选].

2.2、IOS端

  1. 拖动LanSongEditorFramework.framework到你的项目中, 并在工程的Build Phases标签页的Link Binary With Libraries中把我们的framework放到最上面.
  2. 在Build Phases的<Link Binary With Libraries>中增加libz.tbd , libbz2.tbd, libc++.tbd, libiconv.tbd
  3. 在你代码中包括头文件: #import <LanSongEditorFramework/ LanSongEditor.h>
  4. LanSongEditorBundle.bundle 是我们sdk中 以LanSongIFxxx开头用到的一些滤镜图片,如果没用到LanSongIFxxx开头的滤镜,则不用增加此文件。如用到则把LanSongEditorBundle.bundle 拖动到你项目的 copy Bundle Resources中
  5. 其他的代码,各种资源,各种视频素材等均为演示所用,不属于sdk的一部分。
  6. 代码使用
初始化
 1. 增加头文件
   #import <LanSongEditorFramework/LanSongEditor.h>
 2. 在您程序刚开始的地方初始化我们的SDK:
       [LanSongEditor initSDK:nil]
       //初始化SDK [必须] (nil,APP名字一定是我们demo名字)

2.3、时间单位

Android

IOS


三、视频编辑SDK

3.1、SDK中用到的名字解释

1.composition: 合成, 是一个容器, 用来存放各种素材的容器, 缩写是: compXXX, 比如compDurationUs, 则表示合成的时长,单位是微秒(Us)

2.original: 原始的, cut:时间裁剪; duration:时长;

3.2、合成容器:ConcatComposition

  1. 字面意思是:拼接合成.是以图片和视频的拼接的总时长作为最终导出视频的时长, 容器有3大层, 分别是:背景图层 , 拼接类图层 , 叠加类图层.
  2. 背景层: 给容器整体增加一个背景图层, 支持:颜色背景, 图片背景, 如果你要给不同的图层设置不同的背景,则可以用图层的画布/背景功能来分别设置.
  3. 拼接层: 把用户选中的图片和视频前后拼接在一起,是前后叠加. 可以在开始前增加, 也可以做预览过程中插入, 可以指定时间点插入, 可复制, 可删除, 可调节每个图层的前后位置, 支持手势调节, 支持图层的各种方法.
  4. 叠加类图层: 在拼接层上面,叠加多个其他图层, 是上下叠加. 比如叠加水印, 叠加文字, 叠加动画等等这些称之为叠加类型的图层, 图层可调节上下位置, 可设置显示开始时间点, 可设置显示时长;可叠加, 可删除, 支持手势,旋转移动缩放滤镜马赛克等等, 可执行父类图层的所有方法.
  5. 这些API 的关键词是: 在LSOConcatCompositionView中;, 拼接:(concat), 叠加:(overLay), 背景(backGround).

3.3、视频和图片的混合编辑

  1. 当前大部分视频编辑是拼接编辑, 比如您选中了几个视频和几个图片, 则是视频和图片混合的前后拼接合成的编辑.
  2. 可以是单个视频, 也可以是多个视频, 也可以是一张图片或多种图片, 或者图片和视频混合编辑.
  3. 视频增加后,当前默认是整个视频时长增加进去, 增加后, 你可以设置视频时长, 容器的总时长会改变, 得到图层对象,可执行图层的各种方法.
  4. 图片增加后, 默认每张图片显示3秒, 可调节显示时长, 可复制,删除,插入图片, 拼接图片不可以循环, 得到图层对象,可执行图层的各种方法.
  5. 如果设置了转场,则前一个层和后一层有部分画面是重叠, 重叠时间可设置. 设置转场后,
  6. 最终容器的总长度是各个图片和视频的长度之和 ,如果有转场或视频变速,则对应的时长会改变.

3.4、图层之--时间调节

  1. 素材本身的的时长. 比如视频时长,声音时长, 图片在放入后, 默认是显示3秒; 图片序列和gif等是其本身的时长; 这个时长是素材本身的, 我们称之为AssetDuration 是资源时长, 只能读取,不能修改, 但你可以修改素材在容器中的显示时间和从什么时间点开始显示;
  2. 可以修改的有: 素材在容器中的显示时间点, 是否循环, 显示时长, 如果循环,则会从显示时间点开始, 一直循环到整个容器尾部, 时间可以实时设置, 实时调节, 实时获取,当显示时长改变后, 如果你要获取对应的缩略图,则缩略图中图片数组也会相应的改变;
  3. 如果是视频素材, 则支持裁剪视频长度, 两个方法是: setCutStartTime和 setCutEndTime,从视频的什么时间开始裁剪,和裁剪到什么地方; 视频裁剪当前没有约束, 但建议你最小裁剪值是1秒;
  4. 这些API的名字是:资源时长(assetDuration), 当前图层的显示时长( displayDuration), 从容器的什么时间点开始显示:(startTimeOfComp);

3.5、图层之--手势 + 移动/缩放/旋转

  1. 容器在创建时设置了宽度和高度, 素材增加进去后, 会默认放到容器的中间, 即容器的宽度/2和高度/2.
  2. 每增加一个素材, 会得到一个图层对象, 图层都支持用手指直接操作屏幕 来完成 移动缩放旋转的touch事件,, 你可以单指移动, 双指缩放和旋转; 当选中一个图层时, 它的周边会出现一个红色的方框, 表示选中当前图层, 为了避免在操作时误触别的图层, 你可以把别的图层锁定, 我们提供丰富的API让你设置或获取相关的坐标, 我们甚至定义了一个类LSORect来让你获取相对应当前预览窗的相对坐标 和 相对于容器中的绝对坐标.
  3. 我们另外定义了各种常见的枚举类型, 比如4种缩放类型, 和上/下/左/右/中/左上/左下/右上/右下这9个位置点供您选择; 提供缩放系数, 缩放到实际大小,设置具体位置, 相对屏幕位置等.
  4. 如果你要用代码的形式设置, 则设置的位置是当前图层中心点的位置. 可以缩放到指定大小, 旋转则0度则是正上方为0点, 角度是任意角度, 比如设置为-100度, -400度, 或370度, 540度等等.
  5. 这些API的关键词是: 缩放大小(scaleSize), 缩放类型(scaleType) , 缩放系数(scaleFactor), 位置类型( positionType) , 位置中心点(centerPoint), 位置相对预览窗口坐标(positionInView), 旋转 (rotation), setTouchEnable , xxxInView( 是以当前预览为单位的宽高和位置;)

3.6、图层之--贴纸/水印/文字

  1. 贴纸, 水印, 文字, 在我们图层处理架构里, 是以图像的形式呈现的, 因为手机GPU处理的是图像, 贴纸, 水印, 文字在底层是一个意思, 认为是一个图像或一组连续的图像做处理.
  2. 文字在SDK内部会各种转换方法, 让你方便的以文字图层操作, 操作完毕后底层会转换为图像来处理,如果我们提供的绘制文字不够详细, 你也可以自己绘制,然后转换为图片或图片数组,设置到容器中.
  3. 贴纸和水印是一个意思,我们提供了单个图片的图层,多张联系图片组成的图层, Gif图层等, 这些你可以方便的设置, 可以设置一个,也可以设置多个.
  4. 图层的增加是通过容器Composition的方法实现的, 增加后, 得到对应的图层对象;
  5. 这些API 的关键词是: android的图片图层(BitmapLayer) , android的图片序列图层(BitmapListLayer), ios的图片图层(ImageLayer), ios的图片序列图层(ImageListLayer), Gif图层.

3.7、图层之--颜色调节/滤镜/美颜

  1. 滤镜是对图层的画面做调节, 和图层的缩放移动一样是图层的一个属性, 颜色调节和滤镜和美颜, 都是滤镜的不同效果. 当前我们的美颜是仅对整体画面做磨皮和美白处理,没有做脸识别后的各种功能.
  2. 当前支持的颜色调节包括: 亮度/ 对比度/ 饱和度/ 锐化/色温/白平衡/色调/曝光度
  3. 当前支持80种滤镜, 包括常见的17种滤镜,当前建议你使用这17种滤镜, 这些滤镜在我们demo里可以看到.
  4. 这些API 的关键词是: 设置滤镜(setFilter,设置会把上一个替换掉),增加滤镜(addFilter), 移出滤镜(removeFilter),删除所有滤镜(removeAllFilter);

3.8、图层之--转场设置

  1. 转场是两个素材前后拼接时播放时的一种过渡效果, 比如上一段淡淡的消失, 下一段逐渐出现等.
  2. 当前的转场是AE设计师在PC端用after Effect 设置好的, 然后按照我们的格式,导出为json文档,SDK还原出来在PC端设计的效果. 这样的好处是: 开发人员不用自己用代码实现各种效果,只需要根据不同的效果,把对应的json送到SDK中, SDK就实现了这样的效果, 简单高效, 并可以做到Android和ios的统一.
  3. PC端用Ae软件制作规范: 用一张小于等于544x960的图片创建一个合成, 然后对其做旋转缩放透明处理, 形成动画; 或对其做mask遮罩处理,形成动画; 当前不支持同时做旋转缩放透明+ mask的效果; 合成的分辨率应小于等于544x960, 时长建议不大于3秒, 以实际效果为准;
  4. 当前支持各种遮罩转场和基础的移动旋转缩放转场; 转场设置是通过每个具体的图层设置的, 比如有图层ABC3个, 要在AB之前增加转场,则设置A的transition; 要给BC之间加转场,则设置B的transition;
  5. 转场的时间可以设置,默认在是设置路径后, 会默认是1秒钟, 最大可设置为5秒钟; 当前仅支持遮罩转场, 即各种形式的透明.
  6. 这些API 的关键词是:转场(transition); 设置转场时间:(transitionDuration) , 播放转场(playTransition), 取消(cancelTransition);
  7. 执行步骤是: 你需要先设置转场路径, 设置后,默认转场时间是1秒钟, 如需预览,则playtransition; 调用cancelTransition取消转场; 在设置路径后, 你可以设置转场时间; 设置后, 如需要播放则playTransition; 如果你要应用到全局,则需要把一个json文件循环设置到每个图层对象; 我们内部会共用同一个json内容;

3.9、图层之--入场动画/出场动画/指定时间点动画

  1. 入场动画, 出场动画, 和转场一样, 也是Ae设计师在PC端设计好后, 导出为json,送入到SDK中. SDK解析还原出对应的效果.
  2. PC端用Ae软件制作动画规范: 用一张小于等于544x960的图片创建一个合成, 然后对其做旋转缩放透明处理, 形成动画; 或对其做mask遮罩处理,形成动画; 合成的分辨率应小于等于544x960, 时长建议不大于3秒, , 以实际效果为准; 如果是旋转缩放透明则帧率建议是40, 若是mask遮罩,则帧率建议25.
  3. 因入场动画和出场动画从技术上讲,仅仅是插入到图层的时间点不同,SDK可以设置开始从图层的哪个时间点开始, 当前入场动画默认是0, 出场动画默认最后json的时间时长; 你可以调节这个出入场的持续时间, 持续时间调节后, 会把调节后的时长作为整个动画走完的时间, 如果你设置的短,则动画走的快; 如果设置的长,则动画走的慢; 入场动画和出场动画是setXXX的方式, 每次设置后, 会把之前的动画移出;同一时刻只能有一个入场或出场动画.
  4. 指定时间点动画, 是你可以指定一个时间点增加动画, 可以实时设置开始时间点,也可以设置动画时长, 可以增加多个, 每个素材最大支持20个动画。在每次设置后, 可预览或移除.
  5. 这些API的关键词是: 动画:(Animation) ; 入场动画/出场动画:(setAnimationAtLayerHead/End), 指定时间点动画:(addAnimationAtCompTimeUs)预览动画 playAnimation; 移除removeAnimation.
  6. 执行步骤是: 增加json文件, 会得到LSOAnimation对象,用这个对象可以playAnimation来预览; removeAnimation删除; 对象里有设置开始时间点和播放时长的方法;. 等要删除时,用removeAnimation; 当一个图层从容器中释放后, 我们会销毁里面的所有的对象.

3.10、图层之--特效

  1. 和动画一样的制作步骤, 唯一不同的是: 动画是从开始播放到结束, 如果设置的时长不等于json中的默认时长,动画平均分配不同的动画快慢来达到设置的长度; 而特效的效果时间是固定的, 如果设置的时长json中的默认时长,则会循环播放特效.
  2. 特效可设置当前图层的任意时刻点开始,我们举例了从头(head) 和尾(end)的两种方式.
  3. 这些API的关键词是: 特效:(Effect), 指定时间点增加特效:(addEffectAtCompTimeUs); 预览特效(playEffect), 移除特效:(removeEffect).
  4. 执行步骤, 和动画步骤一致.

3.11、图层之--画布(背景)/去水印/透明/镜像

  1. 画布是对当前每个图层做的操作, 是无论图层缩放多少, 画布都会铺满整个容器, 画布可以是颜色, 图片, 或画面的虚化做背景;
  2. 去水印当前支持马赛克去水印, 我们在图层类中举例了最大4个去水印的API, 可以设置位置,设置大小,设置马赛克像素的大小; 如果你有更多个马赛克的需求,还是用LanSongMosaicRectFilter自行增加;
  3. 透明我们描述为:不透明度, 这样更好理解一些, 和调节RGB一样,可以直接设置; 参数1.0是完全不透明, 0.0是完全透明;
  4. 镜像:是把整个画面的左边镜像到右边, 把右边镜像到左边; 如果你打算把左边的一半镜像到右边,则用我们的LanSongMirrorFilter滤镜;
  5. 这些API的关键词是: 背景(backGround), 去水印(mosaicRect), 不透明度(opacityPercent) , 镜像(mirror).

3.12、图层之--获取缩略图

  1. 缩略图是每秒钟一帧, 大小是192x192的图片对象;
  2. 用getDisplayThumbnailList 获取到每张图片大小是192x192, 每个图层最后获取到的图片宽度总和等于图层的缩略图显示时长(秒为单位)*192;
  3. 我们有合成总时长改变回调(DurationChanged): 当原视频时长裁剪, 变速,倒序,增加转场,都会触发此回调,建议在这里重新刷新所有的拼接层的时长, 因为一个图片或视频的时长改变了, 别的图片和视频的开始显示点等都会改变;
  4. 我们的demo演示, 是在durationChanged的时候刷新所有的拼接层的所有图层缩略图;

3.13、图层之--关键帧动画

  1. 关键帧动画是指:在两个不同时间点分别对视频或图片做动作, 然后SDK就会自动从一个时间点平滑过渡到另一个时间点状态的动画, 称之为关键帧动画;
  2. 比如你在时间A点把视频缩小一倍, 在B点把视频放大一倍, 则预览时SDK就会自动的从A点平滑的一点一点的放大视频,直到B点放大完毕,从而形成动画.
  3. 当前关键帧动画支持 移动旋转缩放透明;
  4. 关键帧的优先级最低, 如果在同一时间段设置了关键帧和动画/特效/转场等json时, 则动画/特效/转场有效果, 关键帧无效;

3.14、图层之--调速

  1. 视频支持调速, 调速可设置0.1倍到10.0倍
  2. 0.1倍是放慢10倍, 画面显示时长等于原来的10倍, 10.0倍是加快10倍, 画面时长等于原来的1/10; 1.0 倍是原来的速度, 可以很细小的调节,比如0.1, 0.2, 0.3等;
  3. 当前在调速时, 暂时不支持声音变速; 声音默认是静音的; 调速后,会触发容器的durationChanged回调, 建议你在回调中去刷新所有缩略图;
  4. 对应的API 是: setVideoSpeed, getVideoSpeed;

3.15、声音图层

  1. 外界输入的各种音效, 无论是wav格式的音效, 还是mp3,m4a, 或者录音 或者带有声音的视频, 我们统称为声音. 这些声音是同一个API输入到SDK中, 然后得到对应的声音图层.
  2. 声音图层, 可以指定时间点增加, 可以设置循环, 设置把声音的那一段裁剪后增加, 设置音量大小, 设置淡入淡出效果
  3. 声音音量范围是0---5.0 , 1.0是默认声音. 0.0是关闭声音; 5.0是放大5倍; 声音裁剪最小是300毫秒, 最大是声音的原始长度;
  4. 这些API的关键词是: 音频图层:(LSOAudioLayer); 裁剪时长(setCutStartTime/setCutEndTime) 音量:(volume)

3.16、API介绍


3.16.1 Android视频编辑SDK概述:

  1. 我们把视频编辑抽象为两个类, 一个是编辑预览类LSOEditPlayer, 一个图层类LSOLayer。
  2. 播放预览类LSOEditPlayer, 是一个素材容器, 也是一个view,可布局到xml中,当设置宽高比例时,会自动适配并等比例布局播放画面,以监听返回. 可完成素材的:插入或删除,替换,拼接,叠加,定位,播放/暂停等实时容器预览的功能。
  3. 图层类LSOLayer: 图片/视频/文本/特效/GIF等增加到播放器中后,我们把他处理成一层画面 ,增加一个, 就是增加一层画面;增加时会返回LSOLayer对象,用这个对象可以设置:时间点,位置,宽高,角度,镜像,倒序,滤镜,调节,美颜,动画,转场,特效等功能。
  4. 调用流程是:在Activity的onCreate/onPause/onResume/onDestroy生命周期中, 分别增加LSOEditPlayer对应的同名方法即可。
  5. 素材增加的形式有两种, 一种是前后拼接, 一种是上下叠加, 示意图如下:

image

1、Android视频播放LSOEditPlayer类说明
  1. public void onCreateAsync(LSORatioType ratio, OnCreateListener listener)
功能:
 设置播放容器宽高比;
 Activity onCreate中调用,设置播放容器的宽高比, 设置后, 会根据宽高比等比例缩放到当前view所在layout;
  也可以在播放暂停时, 重写布局此播放容器(relayout);
参数:
 ratio 宽高比;
 listener 重新布局后, 适配到layout后的回调;
  1. public void onCreateAsync(List<LSOAsset> arrays, OnCreateListener listener)
 功能:
  设置播放容器的资源
 参数:
  arrays 容器资源数组, 支持图片和视频.
  listener 默认会以第一个图片或视频的宽度为参考,等比例缩放当前播放容器后回调;
  1. public void onCreateAsync(List<LSOAsset> arrays,int width, int height, OnCreateListener listener)
 功能:
  设置播放容器资源, 并设置宽度和高度
 参数:
  arrays 输入的图片或视频资源;
  width 播放容器的宽度
  height 播放容器的高度
  listener 根据设置的高度和宽度, 重新等比例布局当前view, 布局后返回监听;
  1. public void onCreateAsync(int width,int height, OnCreateListener listener)
 功能:
  设置容器的宽度和高度, 在播放设置, 不可以用来初始化播放器;
  在第一次之后设置
 参数:
  width 宽度
  height 高度
  listener 适配当前view后的监听;
  1. public void onResumeAsync(OnResumeListener listener)
 功能:
  Activity onResume中调用, 用来执行activity的返回事件;
 参数:
  listener 异步回调;
  1. public void onPause()
 功能:
  Activity中的onPause中调用;
  1. public void onDestroy()
 功能:
  ActivityonDestroy中调用
  1. public void prepareConcatAssets(OnAddAssetProgressListener listener)
 功能:
  在当前View布局完毕后, 准备当前播放器;
 参数:
  listener 内部会开启一个线程, 内部开启完毕后的回调;
  1. public void insertConcatAssetAtCurrentTime(List<LSOAsset> assetArray, OnAddAssetProgressListener listener1)
 功能:
  在当前时间点插入图片或视频
 参数:
  assetArray 插入的图片或视频数组
  listener1 插入完毕后的回调;
  1. public void insertConcatAssetWithTime(List<LSOAsset> assetArray, long atCompUs, OnAddAssetProgressListener listener1)
 功能: 
  在指定的时间点插入图片或视频.
  内部流程是:
  先找指定时间点 在某个图层时间段内.
  找到图层后, 如果时间点在图层前半部分,则向前插入; 如后半部分,则向后插入;
 参数:
  assetArray 插入的图片或视频数组
  atCompUs 在指定的时间点
  listener1 异步插入完毕后的回调;
  1. public void replaceConcatLayerAsync(LSOAsset asset, LSOLayer replaceLayer, OnAddAssetProgressListener listener)
 功能: 
  替换拼接图层;
 参数:
  asset        资源
  replaceLayer 被替换的图层
  listener     异步替换;
  1. public LSOLayer getCurrentConcatLayerByTime(long compUs)
 功能:  
  获取指定时间点的拼接图层
 参数:
  compUs  指定时间点, 单位微秒; 1=1000*1000微秒
  @return 返回图层对象
  1. public void addAssetAsync(LSOAsset asset, long atCompUs,OnAddAssetProgressListener listener1)
 功能: 
  在拼接层上叠加一个资源;
 参数:
  asset 图片或视频资源
  atCompUs 指定时间点
  listener1 异步增加完毕后的回调监听;
  1. public void addVideoEffectAsync(LSOAsset asset, long atCompUs, boolean preview, OnAddAssetProgressListener listener1)
 功能: 
  在指定时间点增加一个视频特效, 增加后, 通过异步返回一个LSOLayer对象;
 参数:
  asset 一个color和一个mask组成的透明视频动画资源, 宽高:最大720p, 时长:最大5秒钟;
  atCompUs  在指定时间点
  preview   插入后, 是否预览
  listener1 插入完毕后的回调,回调中
  1. public LSOLayer addBitmapLayer(String path, long atCompUs)
 功能: 
  在拼接层上叠加一个图片图层

 参数:
  path 图片的完整路径
  atCompUs 在指定时间点增加, 单位微秒
  1. public LSOLayer addBitmapLayer(Bitmap bmp, long atCompUs)
 功能: 
  增加图片图层,
 参数:
  bmp 图片对象;
  atCompUs 在指定时间点增加,单位微秒;
  1. public LSOLayer addGifLayer(String gifPath, long atCompUs)
 功能: 
  在拼接层上, 增加一个Gif图层
 参数:
  gifPath gif图层路径
  atCompUs 在指定时间点增加,单位微秒;
  1. public LSOLayer addGifLayer(LSOAsset asset, long atCompUs)
 功能: 
  在拼接层上, 增加一个Gif图层
 参数:
  asset gif文件的路径
  atCompUs 在指定时间点增加,单位微秒;
  @return 返回LSOLayer图层对象. 此对象可设置图层的移动旋转缩放等功能.
  1. public LSOAudioLayer addAudioLayer(String path, long startTimeOfComp)
 功能: 
  增加声音图层;
 参数:
  path            声音的完整路径;
  startTimeOfComp 从合成的什么位置开始增加;
  @return 返回声音对象, 可以设置声音的音量, 循环等功能;
  1. public void removeLayerAsync(LSOLayer layer)
 功能: 
  异步删除图层;
  删除成功后, 会触发容器时长回调, 在回调中你可以重新布局时间轴
 参数:
  layer 图层对象;
  1. public void removeAllOverlayLayersAsync()
功能: 
  删除所有的叠加图层.
  叠加图层有:图片图层, gif图层, 图片序列图层等;
  1. public void removeAudioLayerAsync(LSOAudioLayer layer)
 功能: 
  删除声音图层
 参数:
  layer
  1. public void removeALLAudioLayer()
 功能: 
  删除所有的增加的声音图层;
  1. public boolean isPlaying()
 功能: 
  画面是否在播放
 参数:
  @return 是否在播放
  1. public boolean isRunning()
 功能: 
  当前播放器是否在运行.
  合成是一个线程, 此返回的是当前线程是否在运行,
  线程运行不一定画面在播放,有可能画面暂停;
 参数:
  @return 线程是否在运行
  1. public boolean isExporting()
 功能: 
  是否在导出;
 参数:
  @return 
  1. public long getCurrentPositionUs()
 功能: 
  获取当前播放器的时间.
 参数:
  @return 当前时间, 单位微秒
  1. public List<LSOLayer> getAllConcatLayers()
 功能: 
  获取播放器的所有拼接图层;
 参数:
  @return 图层list 拼接图层;
  1. public List<LSOLayer> getAllOverLayLayers()
 功能: 
  获取播放器中的所有叠加层
 参数:
  @return 图层数组, 叠加的图层;
  1. public List<LSOAudioLayer> getAllAudioLayers()
功能: 
  获取播放器中的所有声音图层
  1. public void setOnBeforeRenderFrameListener(OnLanSongSDKBeforeRenderFrameListener listener)
 功能: 
  在每一帧绘制前的回调, 里面没有经过handler, 你增加的代码, 在我们render线程中执行,
 参数:
  listener 返回的是时间戳, 单位us;
  1. public void setOnDurationChangedListener(OnLanSongSDKDurationChangedListener listener)
 功能: 
  容器的总时长改变监听;播放器会在拼接层裁剪, 设置显示时间, 转场,变速等场合下, 时长改变;
  返回的是当前总时长;
 参数:
  listener 总时长改变监听, 返回的long类型改变后的当前总时长
  1. public void setOnLanSongSDKPlayProgressListener(OnLanSongSDKPlayProgressListener listener)
 功能: 
  播放进度回调
  监听中的两个参数是: onLanSongSDKExportProgress(long ptsUs, int percent);
  分别对应 当前处理的时间戳 和百分比;
  seekpause的时候,此监听不调用;
 参数:
  listener
  1. public void setOnTimeChangedListener(OnLanSongSDKTimeChangedListener listener)
 功能: 
  容器的当前播放时间改变回调;
  只要是改变了, 不管是seek的改变,还是自动播放的改变,都执行这里;
 参数:
  listener 时间改变监听 long类型是当前时间戳, int类型是当前时间戳占总时长的百分比;
  1. public void setOnPlayCompletedListener(OnLanSongSDKPlayCompletedListener listener)
 功能: 
  视频播放完成进度;
 参数:
  listener 播放完成监听
  1. public void setOnExportProgressListener(OnLanSongSDKExportProgressListener listener)
 功能: 
  导出进度回调;
  监听中的两个参数是: onLanSongSDKExportProgress(long ptsUs, int percent);
  分别对应 当前处理的时间戳 和百分比;
 参数:
  listener 导出进度监听, long类型是当前正在处理的时间戳, int类型是进度百分比;
  1. public void setOnExportCompletedListener(OnLanSongSDKExportCompletedListener listener)
 功能: 
  导出完成回调;
  完成后,  void onLanSongSDKExportCompleted(String dstVideo);
  对应的是:返回完成后的目标视频路径;
 参数:
  listener  导出完成监听, 返回String类型的导出视频完整路径;
  1. public void setOnErrorListener(OnLanSongSDKErrorListener listener)
 功能: 
  错误监听
  1. public boolean start()
 功能: 
  开始播放/恢复播放;
  1. public void startExport(LSOExportType type)
 功能: 
  开始导出
 参数:
  type 导出枚举类型
  1. public void seekToTimeUs(long timeUs)
 功能: 
  定位到某个位置.
 参数:
  timeUs 时间, 单位微秒;
  1. public void pause()
功能: 
  播放预览暂停
  1. public long getDurationUs()
功能: 
  获取当前播放器的总时长;
参数:
@return 时间, 单位微秒;
  1. public void setLooping(boolean is)
 功能: 
  设置容器循环播放;
 参数:
  is 是否循环;
  1. public void cancelExport()
功能: 
  取消导出
  1. public void cancel()
功能: 
  取消当前合成.
  取消后, 会把内部线程全部退出, 所有增加的图层都会释放;
  1. public void setFrameRate(int frameRate)
功能: 
  设置导出帧率
  不建议使用

 参数:
  frameRate 帧率最小20,最大是60
  1. public void setExportBitRate(int bitRate)
 功能: 
  设置导出时的码率,
  不建议使用
 参数:
  bitRate 码率, 最小是300K,不建议使用;

2、Android视频编辑图层LSOLayer类说明
  1. public String getOriginalPath()
 功能: 
  获取原视频/图片的路径
 参数:
  @return
  1. public long getOriginalDurationUs()
 功能: 
  获取视频/图片的原始时长
 参数:
  @return
  1. public int getOriginalWidth()
 功能: 
  获取原始宽度
 参数:
  @return
  1. public int getOriginalHeight()
 功能: 
  获取原始高度
 参数:
  @return
  1. public long getDisplayDurationUs()
 功能: 
  获取显示时长;
  如果播放器中只有一个视频或图片, 则此时长等于播放器的时长;
 参数:
  @return
  1. public long getThumbnailDurationUs()
 功能: 
  获取缩略图的显示时间;
  : 因转场等功能,拼接层可能有重叠区域. 因此显示时长不等于缩略图的时长;

 参数:
  @return
  1. public void setDisplayDurationUs(long durationUs)
 功能: 
  设置显示时长;
 参数:
  durationUs
  1. public long getStartTimeOfComp()
 功能:
  获取当前图层在播放器中的开始时间
 参数:
  @return
  1. public void setCutDurationUs(long startUs, long endUs)
 功能: 
  设置视频的裁剪时长
 参数:
  startUs 开始裁剪时间
  endUs 结束裁剪时间
  1. public long getCutStartTimeUs()
 功能:
  获取裁剪开始时间
 参数:
  @return
  1. public long getCutEndTimeUs()
 功能:
  获取裁剪结束时间

 参数:
  @return
  1. public void setCropRect(LSORect rect)
 功能:
  设置裁剪区域;
 参数:
  @param rect
  1. public void setCropRectToOriginal()
 功能:
  恢复到不裁剪
  1. public void setCropRectPercent(float x, float y, float width, float height)
 功能:
  设置裁剪百分比.整个画面从左到右是0.0--1.0; 从上到下是0.0--1.0;
 参数:
  x  宽度的开始比例
  y  裁剪高的开始比例
  width 裁剪宽度的比例
  height 裁剪高度的比例
  1. public void setLooping(boolean is)
 功能:
  叠加层设置循环
 参数:
   is
  1. public void setStartTimeOfComp(long atCompUs)
 功能:
  设置当前图层在播放器中的开始时间点;

 参数:
  atCompUs
  1. public void setVisibility(boolean is)
 功能:
  设置是否显示
 参数:
  is
  1. public void setVisibility(int visibility)
 功能:
  设置是否显示
  类型是 LSOLayer.VISIBLE  LSOLayer.INVISIBLE
 参数:
  visibility 
  1. public int getVisibility()
 功能:
  获取是否显示
 参数:
  @return
  1. public void resetScaleSize()
 功能:
  恢复到缩放前的大小
  1. public void setScaleType(LSOScaleType type)
 功能:
  设置缩放枚举类型.
  NONE: 无缩放形式.则内部会根据不同的素材,采用默认形式;
  ORIGINAL: 原始大小,直接放入, 不做任意处理;
  FILL_COMPOSITION, 忽略百分比,把宽度等于容器的宽度, 高度等于容器的高度,填满整个容器,这样有些画面可能会变形;
  CROP_FILL_COMPOSITION: 裁剪填满 放入到容器中;把视频的中心点放到容器的中心点,然后 把画面等比例提填满整个容器,把多的部分裁剪掉.
  VIDEO_SCALE_TYPE:视频缩放模式,如果视频宽度大于高度, 则宽度和容器对齐, 然后等比例调整高度;如果高度大于宽度, 则反之.
 参数:
  type
  1. public void setScaledValue(float width, float height)
 功能:
  缩放到的实际值
 参数:
  width
  height
  1. public float getScaleWidth()
 功能:
  获取缩放的宽度
 参数:
  @return
  1. public float getScaleHeight()
 功能:
  获取缩放的高度
 参数:
  @return
  1. public float getRotation()
 功能:
  获取旋转角度.
 参数:
  @return
  1. public void setRotation(float angle)
 功能:
  设置旋转角度
 参数:
  angle
  1. public void setLayerMirror(boolean flipHorizontal, boolean flipVertical)
 功能:
  设置图层是否镜像, 上下镜像, 左右镜像.
 参数:
  flipHorizontal 水平镜像
  flipVertical 垂直镜像
  1. public void cancelLayerMirror()
 功能:
  取消镜像
  1. public boolean isMirrorX()
 功能:
  水平是否镜像
 参数:
  @return
  1. public boolean isMirrorY()
 功能:
  垂直是否镜像
 参数:
  @return
  1. public void setPosition(float xPos, float yPos)
 功能:
  设置当前图层中心点的坐标, xPosX轴的坐标,yPos是设置Y轴的坐标.  
  此坐标是以播放容器的大小为参考, 比如容器的大小是1280x720, 您设置了640,360 ,则图层在播放器中居中显示
 参数:
  xPos
  yPos
  1. public void setPosition(LSOLayerPosition position)
 功能:
  设置图层的枚举位置;
  枚举类型有: 左上/左下/右上/右下/居中////
  1. public float getPositionX()
 功能:
  获取当前图层中心点的位置X
 参数:
  @return  横向坐标中心点, 相对于播放容器本身而言;
  1. public float getPositionY()
 功能:
  获取当前图层中心点的位置Y
 参数:
  @return 竖向坐标中心点, 相对于播放容器本身而言
  1. public void setOpacityPercent(float percent)
 功能:
  设置透明百分比;
 参数:
  percent 百分比 范围从0--1.0;
  1. public void setBrightnessPercent2X(float percent2X)
 功能:
  调节当前图层画面的亮度
 参数:
  percent2X 范围是0--2.0; 1.0为默认值;
  1. public void setContrastFilterPercent2X(float percent2X)
 功能:
  调节当前图层画面的对比度
 参数:
  percent2X 范围是0--2.0; 1.0为默认值;
  1. public void setSaturationFilterPercent2X(float percent2X)
 功能:
  调节画面的饱和度;
 参数:
  percent2X 范围是0--2.0; 1.0为默认值;
  1. public void setWhiteBalanceFilterPercent2X(float percent2X)
 功能:
  调节画面的白平衡
 参数:
  percent2X 范围是0--2.0; 1.0为默认值;
  1. public void setHueFilterPercent2X(float percent2X)
 功能:
  调节画面的色度

 参数:
  percent2X 范围是0--2.0; 1.0为默认值;
  1. public void setExposurePercent2X(float percent2X)
 功能:
  调节画面的曝光度
 参数:
  percent2X 范围是0--2.0; 1.0为默认值;
  1. public void setBeautyLevel(float level)
 功能:
  设置画面的磨皮级别 0.0--1.0;
 参数:
  level 等级 0.0是不磨皮, 1.0是最高磨皮
  1. public void setFilter(LanSongFilter filter)
 功能:
  设置滤镜, 设置时, 会把上一次设置的滤镜删除; 如果不想删除则用addFilter;
 参数:
  filter 滤镜对象, 此对象不可同时设置为多个图层中.
  1. public void removeFilter(LanSongFilter filter)
 功能:
  移出滤镜
 参数:
  filter 增加的滤镜对象
  1. public void addFilter(LanSongFilter filter)
 功能:
  增加滤镜,如增加多个, 则多个滤镜是级联的关系, 即画面把执行上一个滤镜的结果, 作为下一个滤镜的输入;
 参数:
  filter 滤镜对象
  1. public void removeAllFilter()
 功能:
  删除所有滤镜
  1. public void setVideoSpeed(float speed)
 功能:
  设置视频速度.
 参数:
  speed 视频速度值, 范围0.1--10.0;
  1. public float getVideoSpeed()
 功能:
  获取视频速度;
 参数:
  @return 返回速度值
  1. public void setVideoReverseAsync(boolean reverse, OnVideoReverseListener listener)
 功能:
  异步设置视频倒序
 参数:
  reverse 是否倒序
  listener 倒序后的监听;
  1. public boolean isVideoReverse()
 功能:
  当前视频是否倒序
 参数:
  @return 是否倒序
  1. public LSOEffect addEffectAtCompTimeUs(String jsonPath, long compUs)
 功能:
  json的形式增加特效
 参数:
  jsonPath 增加一个特效json路径
  compUs 从播放器的什么时间点开始增加
  @return 增加后, 返回特效对象, 可设置开始时间和播放时长;
  1. public LSOEffect addEffectAtLayerHead(String jsonPath)
 功能:
  在图层的头部增加一个特效
 参数:
  jsonPath json路径
  @return 增加后, 返回特效对象, 可设置播放时长;
  1. public LSOEffect addEffectAtLayerEnd(String jsonPath)
 功能:
  在图层的尾部增加一个特效
 参数:
  jsonPath 特效路径
  @return 增加后, 返回特效对象, 可设置播放时长;
  1. public List<LSOEffect> getAllEffectList()
 功能:
  获取增加的所有特效
 参数:
  @return 所有特效数组
  1. public void removeAllEffectList()
 功能:
  移出当前图层的所有特效
  1. public void removeEffect(LSOEffect effect)
 功能:
  移出指定的特效
 参数:
  effect
  1. public void playEffect(LSOEffect effect)
 功能:
  播放预览特效
 参数:
  effect 指定播放的特效对象,播放后会回到播放前的位置
  1. public LSOAnimation addAnimationAtCompTimeUs(String jsonPath, long compUs)
 功能:
  增加动画
 参数:
  jsonPath json格式的路径
  compUs 从播放器的时间点增加
  @return 返回动画对象, 可设置开始时间和播放时长
  1. public LSOAnimation setAnimationAtLayerHead(String jsonPath)
 功能:
  在图层的头部增加一个动画
 参数:
  jsonPath json动画路径
  @return 返回动画对象, 可设置播放时长
  1. public LSOAnimation setAnimationAtLayerEnd(String jsonPath)
 功能:
  在图层的尾部增加一个动画
 参数:
  jsonPath 动画路径
  @return 返回动画对象, 可设置播放时长
  1. public List<LSOAnimation> getAllAnimationList()
 功能:
  获取所有动画
 参数:
  @return 所有动画对象
  1. public void removeAllAnimationList()
 功能:
  移出所有动画
  1. public void removeAnimation(LSOAnimation animation)
 功能:
  移出指定动画
 参数:
  animation 指定动画对象
  1. public void playAnimation(LSOAnimation animation)
 功能:
  播放动画
 参数:
  animation 动画对象
  1. public boolean setTransitionMaskPath(String maskJsonPath)
 功能:
  设置转场路径
 参数:
  maskJsonPath 遮罩转场路径
  @return 可以设置返回true; 否则返回false
  1. public void setTransitionDurationUs(long duration)
 功能:
  设置转场时长
 参数:
  duration 时长,范围100*100---3*1000*1000;
  1. public void playTransition()
 功能:
  开始播放转场
  1. public void cancelTransition()
 功能:
  取消转场
  1. protected long getTransitionDurationUs()
 功能:
  获取转场时长;
 参数:
  @return
  1. public long getTransitionStartTimeOfComp()
 功能:
  获取从合成的开始时间;
 参数:
  @return
  1. public LSOMosaicRect getMosaicRect1()
 功能:
  获取一个马赛克区域, 返回马赛克对象,
  可设置马赛克区域, 是否禁止,马赛克像素点的宽度;

 参数:
  @return 马赛克对象
  1. public void setAudioVolume(float volume)
 功能:
  设置音频音量
  1. public float getAudioVolume()
 功能:
  获取音频音量
  1. public void setBackGroundBlurLevel(float level)
 功能:
  设置背景模糊级别
  1.0是轻微模糊,毛玻璃模糊. 8.0f是完全,深度模糊;   0.0是删除模糊效果;
 参数:
  level
  1. public void setBackGroundBitmap(String bitmapPath)
 功能:
  设置背景图片
 参数:
   bitmapPath
  1. public void setBackGroundColor(int color)
 功能:
  设置背景颜色
 参数:
  color
  1. public float getMaxBlurLevel()
 功能:
  获取最大模糊系数, 当前返回的是8.0;
  1. public void getThumbnailAsync(OnLanSongSDKThumbnailBitmapListener listener)
 功能:
  异步获取缩略图
 参数:
  listener
  1. public List<Bitmap> getThumbnailListWithCount(int count)
 功能:
  获取缩略图个数, 此方法一定在getThumbnailAsync完成后设置
 参数:
  count 获取的图片张数
  @return 返回bitmap数组;

3.16.2 IOS视频编辑SDK概述:

  1. 我们把视频编辑抽象为两个类, 一个是编辑预览类LSOEditPlayer, 一个图层类LSOLayer。
  2. 播放预览类LSOEditPlayer,和AVPlayer类似, 需要一个播放窗口UIView,本质是一个编辑播放器,可完成素材的:插入或删除,替换,复制,分割,拼接,叠加,定位,播放/暂停等实时容器预览的功能。
  3. 图层类LSOLayer: 图片/视频/文本/特效/GIF等增加到播放器中后,我们把他处理成一层画面 ,增加一个, 就是增加一层画面;增加时会返回LSOLayer对象,用这个对象可以设置:时间点,位置,宽高,角度,镜像,倒序,滤镜,调节,美颜,动画,转场,特效等功能。
  4. 调用流程是: 创建LSOEditPlayer对象, init时可输入图片或视频的url路径和播放器比例,得到播放器容器的宽高,根据宽高创建LSODispLayView作为播放器的显示窗口, 之后正常播放即可.
  5. 素材增加的形式有两种, 一种是前后拼接, 一种是上下叠加, 示意图如下:

image

1、IOS视频播放LSOEditPlayer类说明

1. - (id)initWithUrlArray:(NSArray<NSURL *> *)urlArray ratio:(LSOSizeRatio)ratio

 功能:
  初始化这个类, 可以是一个图片或一个视频, 也可以是多个视频. 可以设置这个播放器的宽高比例, 当比例是原始时, 默认用数组中第一个url的宽高为默认宽高;
  当初始化失败后, 返回nil, 大部分是没有授权文件时会失败;
 参数:
  urlArray 用户选中的视频/图片
  ratio 容器的比例, 如果原始比例, 则填入LSOSizeRatio_ORIGINAL,比例系数;

2. - (void)setCompositionView:(LSODisplayView *)view;

 功能:
  增加预览的显示窗口;
  AVPlayer类似, 视频播放器和播放view是分开的, 你在创建好此对象后, 需要拿到对象的compositionSize,然后布局LSODisplayView, 再设置到此.
  LSODisplayView 继承自UIView,是一个显示控件,显示窗口一定要和合成(容器)的宽高成比例, 可以不相等. 我们提供最简单的集成方法, 方便您参考;
 参数:
  view 显示窗口

3. @property(readonly,atomic) CGFloat compDurationS

 功能:
  当前播放器的总时长.单位秒;
 (当你设置每个图层的时长后, 此属性会改变. 只读, 不可写入)

4. @property (nonatomic,readonly) CGSize compositionSize

 功能:
  您在init的时候, 设置的合成宽高. 或设置的比例;
  当在运行中, 调整播放器的比例后, 此宽高是调整后的宽高

5. @property (nonatomic,assign) CGFloat frameRate

 功能:
  设置帧率,
  [可选],范围是10--60

6. @property (nonatomic,assign) int exportBitRate

 功能:
  设置码率, 单位字节,
  [可选],最低是300*1024

7. @property(nonatomic, readonly) CGFloat currentTimeS

 功能:
  获取,当前播放的时间点,单位秒

8. @property (strong,atomic, readonly) NSMutableArray *overlayLayerArray

 功能:
  当前内部有多少个叠加层;
  如果你获取使用此变量, 则会拷贝一份新的NSMutableArray返回.
  注意: 请不要一直拷贝

9. @property (strong,atomic, readonly) NSMutableArray *concatLayerArray

 功能:
 当前内部有多少个拼接层;
  如果你获取使用此变量, 则会拷贝一份新的NSMutableArray返回.
 注意: 请不要一直拷贝

10. @property (strong,atomic, readonly) NSMutableArray *audioLayerArray

 功能:
  当前有多少个音频层;
  如果你获取使用此变量, 则会拷贝一份新的NSMutableArray
  注意: 请不要一直拷贝

11. @property (nonatomic, readwrite) LSOLayer *selectedLayer

 功能:
  设置一个图层为选中状态;
  当用户通过界面点击别的图层时,这个状态会被改变;
  可以设置, 如果设置不选中, 则设置为nil

12. - (void)setBackGroundVideoLayerWithURL:(NSURL *)url completedHandler:(void (^)(LSOLayer *videoLayer))handler

 功能:
  设置一个背景视频,背景视频默认循环;
 参数:
  url 背景视频的路径
  handler 背景视频设置完成时的回调

13. - (LSOLayer *)setBackGroundImageLayerWithImage:(UIImage *)image

 功能:
  设置一个背景图片

14. - (void)removeBackGroundLayer

 功能:
  删除背景图层

15. - (LSOLayer *)addVideoLayerWithURL:(NSURL *)url atTime:(CGFloat)startTimeS

 功能:
  增加一个视频叠加层. 叠加层是在拼接层的上面;
 参数:
  url 视频的Url路径;
  startTimeS  atStartTime 在合成的指定时间开始增加

16. - (LSOLayer *)addImageLayerWithImage:(UIImage *)image atTime:(CGFloat)startTimeS

 功能:
  叠加一张图片图层;
 参数:
  image 图片对象
  startTimeS 在播放器中的开始叠加时间

17. - (LSOLayer *)addGifLayerWithURL:(NSURL *)url atTime:(CGFloat)startTimeS

 功能:
  叠加一个gif图层
 参数:
   url gif的完整url路径
  startTimeS 在播放器中的开始叠加时间

18. - (LSOLayer *)addMVWithColorURL:(NSURL *)colorUrl maskUrl:(NSURL *) maskUrl atTime:(CGFloat)startTimeS

 功能:
  叠加一个透明动画视频, 我们的透明动画是两个视频合并而成的. 一个是彩色视频/一个是黑白视频;
 参数:
  colorUrl 透明动画视频中的彩色视频
  maskUrl 透明动画视频中的黑白视频
  startTimeS 从播放器中的开始叠加时间

19. - (LSOAudioLayer *)addAudioLayerWithURL:(NSURL *)url atTime:(CGFloat)startTimeS

 功能:
  增加一个声音图层;
 参数:
  url url路径
  startTimeS 开始时间

20. - (void)removeAudioLayer:(LSOAudioLayer *)audioLayer

 功能:
  删除声音图层
 参数:
  audioLayer 声音图层对象

21. -(BOOL)setOverlayerLayerPosition:(LSOLayer *)layer index:(int)index

 功能:
  设置叠加层的位置
 参数:
  layer 图层对象
  index 位置, 最里层是0

22. -(BOOL)setConcatLayerPosition:(LSOLayer *)layer index:(int)index

 功能:
  设置拼接层的位置.
 参数:
  layer 拼接的图层
  index 图层的index, 从前到后, 第一个层是0; 最后面的是: _concatLayerArray.count-1;

23. - (CGSize)updateCompositionRatio:(LSOSizeRatio)ratio

 功能:
  设置合成的比例
 参数:
  ratio 设置的比例

24. - (void)prepareConcatLayerAsync:(void (^)(NSArray *layerAray))handler

 功能:
  调用流程是, init创建好此对象后, 在需要播放时,调用prepare内部会根据输入的图片和视频数量, 创建好对应的图层对象, 在这个handler中返回;

25. - (void)insertConcatLayerWithImageArray:(NSArray<UIImage *> *)imageArray completedHandler:(void (^)(NSArray *layerAray))handler

 功能:
  增加拼接图片图层; 可以是一张图片, 或多张图片
 参数:
  imageArray <#imageArray description#>
  handler 返回的layerAray :是当前新增加的图层对象数组

26. - (void)insertConcatLayerWithArray:(NSArray<NSURL *> *)urlArray atTime:(CGFloat)compTimeS completedHandler:(void (^)(NSArray *layerArray,BOOL insertBefore))handler;

 功能:
  在容器的指定位置增加资源
  在容器的指定时间点插入, 时间点在图层前半部分,插入图层前,反之插入到图层后
 参数:
  urlArray url数组
  compTimeS 在容器的指定时间点插入,
  handle 完成后的回调,是当前新增加的图层对象数组

27. - (void)insertConcatLayerWitImageArray:(NSArray<UIImage *> *)imageArray atTime:(CGFloat)compTimeS completedHandler:(void (^)(NSArray *layerArray,BOOL insertBefore))handler

 功能:
  在容器的指定位置增加图片数组
 参数:
  imageArray 图片数组
  compTimeS 指定时间点插入
  handler 完成后的回调,是当前新增加的图层对象数组

28. - (void)replaceConcatLayerWithLayer:(LSOLayer *)currentLayer replaceUrl:(NSURL *)url completedHandler:(void (^)(LSOLayer *replacedLayer))handler

 功能:
  替换一个图层
 参数:
  currentLayer 当前要替换的图层
  url 要替换的路径 NSURL 格式
  handler 替换完成后的回调

29. -(void)splitConcatLayerByTime:(CGFloat)compTimeS layer:(LSOLayer *)layer

 功能:
  分割图层
 参数:
  compTimeS 从容器的相对时间点开始分割
  layer 要分割的图层对象, 分割后的图层, 会放到到拼接图层数组中, 分离后需要更新时间轴

30. -(void)copyConcatLayerByLayer:(LSOLayer *)layer complete:(void(^)(void))completeBlock

 功能:
  复制一个拼接图层
 参数:
  layer 要复制的图层
  completeBlock 复制完毕后的回调; 复制后的图层会放到到拼接图层数组中, 分离后需要更新时间轴

31. -(LSOLayer *)copyVideoLayerByLayer:(LSOLayer *)layer

 功能:
  复制一个图层
 参数:
  layer 复制的图层对象

32. - (BOOL)removeLayer:(nullable LSOLayer *)layer

 功能:
  删除一个图层.

33. - (void)removeLayerArray:(nullable NSArray<LSOLayer *> *)layers

 功能:
  删除一组图层
 参数:
  layers 图层数组

34. - (BOOL)removeLayerByCompTime:(CGFloat )compTimeS

 功能:
  根据合成中的一个时间点, 删除对应的图层
 参数:
  compTimeS 在合成中的时间,单位秒

35. -(LSOLayer *)getCurrentConcatLayerByTime:(CGFloat)compTimeS

 功能:
  根据当前在合成中的时间点, 来获取一个图层对象;
  当前返回的是 LSOLayer对象

36. - (void)applicationDidEnterBackground

 功能:
  APP 进入后台时的回调;
  当用户从下向上滑动, 让整个APP进入后台的时候,
  你可以调用整个方法, 让合成线程进入后台

37. - (void)applicationDidBecomeActive

 功能:
  APP 从后台恢复时的回调;
  当用户从 后台的状态下, 恢复到当前界面, 则调用这个APP,恢复合成的运行

38. @property(nullable, nonatomic,copy) UIColor *backgroundColor

 功能:
  设置合成容器的背景颜色
  当前暂时导出无用

39. -(BOOL)startPreview

 功能:
  播放预览

40. -(void)pause

 功能:
  暂停

41. -(void)resume

 功能:
  恢复播放

42. - (void)seekToTimeS:(CGFloat)timeS

 功能:
  定位到具体的时间戳;
  在调用后, 会暂停当前界面的执行;
  你需要在完成seek, 调用resume来播放
  预览有效

43. @property (readonly) BOOL isRunning

 功能:
  当前是否在运行

44. @property (readonly) BOOL isPausing

 功能:
  是否暂停

45. -(void)startExportWithRatio:(LSOExportSize)ratioType

 功能:
  开始导出

46. @property (readonly) BOOL isExporting

 功能:
  当前是否正在导出

47. -(void)cancel

 功能:
  取消整个合成线程
  包括预览和导出, 都取消

48. @property(nonatomic, copy) void(^playProgressBlock)(CGFloat progress,CGFloat percent)

功能:
  进度回调,
  当在编码的时候, 等于当前视频图层的视频播放进度 时间单位是秒;;
  工作在其他线程,
  如要工作在主线程,请使用:
   progress: 当前正在播放总合成的时间点,单位秒;
   percent: 当前总合成的时间点对应转换为的百分比; 
  进度则是: progress/_duration;
 dispatch_async(dispatch_get_main_queue(), ^{
 });

49. @property(nonatomic, copy) NSString *_Nullable(^mergeAVBlock)(NSString *video, NSString *audio)

 功能:
  适配ios13export类问题

50. @property(nonatomic, copy) void(^playCompletionBlock)(void)

 功能:
  在异步线程执行此block; 请用一下代码后调用;
 dispatch_async(dispatch_get_main_queue(), ^{
 });

51. @property(nonatomic, copy) void(^exportProgressBlock)(CGFloat progress,CGFloat percent)

 功能:
  导出进度回调;
  在异步线程执行此block; 请用一下代码后调用;
 dispatch_async(dispatch_get_main_queue(), ^{
 });

52. @property(nonatomic, copy) void(^exportCompletionBlock)(NSString *_Nullable dstPath)

 功能:
  编码完成回调, 完成后返回生成的视频路径;
  注意:生成的dstPath目标文件, 我们不会删除.
  在异步线程执行此block; 请用一下代码后调用;
dispatch_async(dispatch_get_main_queue(), ^{
});

53. @property(nonatomic, copy) void(^userSelectedLayerBlock)(LSOLayer *layer)

 功能:
  当前用户选中的图层回调;
  在异步线程执行此block; 请用一下代码后调用;
 dispatch_async(dispatch_get_main_queue(), ^{
 });

54. @property(nonatomic, copy) void(^ _Nullable userTouchDownLayerBlock)(LSOLayer * _Nullable layer)

 功能:
  用户点击事件,用户手指按下.
  中间不需要增加 dispatch_async(dispatch_get_main_queue()

55.@property(nonatomic, copy) void(^ _Nullable userTouchMoveLayerBlock)(CGPoint point)

 功能:
  用户移动图层

56. @property(nonatomic, copy) void(^ _Nullable userTouchScaleLayerBlock)(CGSize size)

 功能:
  用户缩放图层事件

57. @property(nonatomic, copy) void(^ _Nullable userTouchRotationLayerBlock)(CGFloat rotation)

 功能:
  用户旋转图层

58. @property(nonatomic, copy) void(^ _Nullable userTouchUpLayerBlock)(void)

 功能:
  用户手指抬起

59. @property(nonatomic, copy) void(^compositionDurationChangedBlock)(CGFloat durationS)

 功能:
  合成容器时间改变回调;
  当整个容器的合成时间改变了, 则触发回调;
  比如你对视频做裁剪,则会触发这里. 
  在异步线程执行此block; 请用一下代码后调用;
 dispatch_async(dispatch_get_main_queue(), ^{
 });

60. @property (nonatomic, assign) BOOL disableTouchEvent

 功能:
  禁止图层的touch事件

2、IOS视频编辑图层LSOLayer类说明

1. @property (readonly,assign)CGFloat originalDurationS

 功能:
  素材的原始时长.
  比如视频本身的长度, 只读.不会改变

2. @property (readwrite,assign) CGFloat displayDurationS

 功能:
  当前图层的显示时长;
  在没有裁剪时后变速等操作时, 等于原始时长

3. @property (nonatomic,readonly) CGSize originalSize

 功能:
  输入资源的原始大小

4. @property (nonatomic,readonly) CGSize layerSize

 功能:
  图层在容器中的大小.
  视频放到容器中后, 默认是对齐到边缘的,故图层大小会变;
  视频默认对齐到播放器的边缘. 图片居中显示

5. @property (readwrite,assign) BOOL looping

 功能:
  叠加图层是否循环播放;
  拼接图层设置后无效

6. @property(getter=isHidden) BOOL hidden

 功能:
  当前图层是否隐藏,
  可以用这个在新创建的图层做隐藏/显示的效果, 类似闪烁, 或创建好,暂时不显示等效果

7. @property (readwrite, nonatomic) CGFloat rotateAngle

 功能:
  角度值0--360. 默认为0.0
  顺时针旋转

8. @property (readwrite, nonatomic) CGPoint centerPoint

 功能:
  设置或读取  <当前图层的中心点>在容器中的坐标;
  容器坐标的左上角是左上角为0,0. 从上到下 Y, 从左到右是X;
  当一个图层增加到容器中, 则默认是:
   positionX=drawPadSize.width/2;
   positionY=drawPadSize.height/2;

9. @property (readwrite,nonatomic) LSOPositionType positionType

 功能:
  设置当前位置,枚举类型.
  我们举例了常见的位置枚举类型:
  上下左右/左上/左下/右上/右下/居中, 如果这些类型不满足您的需求, 可以通过centerPoint来设置每个素材的位置

10. @property (readwrite,nonatomic) LSOScaleType scaleType

 功能:
  缩放的枚举类型;
  kLSOScaleNONE: 无缩放形式.则内部会根据不同的素材,采用默认形式;
  kLSOScaleOriginal: 原始大小 直接放入, 不做任意处理;
  kLSOScaleFillComposition: 忽略百分比,把宽度等于容器的宽度, 高度等于容器的高度,填满整个容器.
  kLSOScaleCropFillComposition: 匹配放入到容器中,等比例填满整个容器, 把多的部分显示到容器的外面去;
  kLSOScaleVideoScale:视频缩放模式,如果视频宽度大于高度, 则宽度和容器对齐, 然后等比例调整高度,反之亦然
  如果以上不满足您的需求, 则可以 scaleSize 设置具体缩放到的大小

11. @property (readwrite, nonatomic) CGSize scaleSize

 功能:
  把图层缩放到指定的大小;
  以像素为单位

12. @property (readwrite, nonatomic) CGSize scaleSizeInView

 功能:
  以显示窗口为单位, 缩放大小, 此宽高是相对于LSODisplayView而言;
  预览时有效

13. @property (readonly, nonatomic) CGSize layerSizeInView

 功能:
  以显示窗口为单位, 获取图层的宽高;
  预览时有效

14. @property (readonly, nonatomic) BOOL isConcatImageLayer

 功能:
  是否是拼接图片层

15. @property (readonly, nonatomic) BOOL isConcatVideoLayer

 功能:
  是否拼接视频层

16. @property (readonly, nonatomic) BOOL isVideoLayer

 功能:
  是否是叠加的视频层

17. @property (readonly, nonatomic) BOOL isMVLayer

 功能:
  是否是叠加的mv透明动画层

18. @property (readonly, nonatomic) BOOL isImageLayer

 功能:
  是否是图片层

19. @property (readonly, nonatomic) BOOL isGifLayer

 功能:
  是否是Gif图层

20. @property (readonly, nonatomic) BOOL isImageArrayLayer

 功能:
  是否是图片数组图层

21. @property(readwrite,assign) CGFloat startTimeOfComp

 功能:
  在播放器中的开始时间, 只工作在叠加的一些图层,比如叠加的图片/视频等

22. @property (readwrite, nonatomic) BOOL isConvertScalePosition

 功能:
  是否把缩放和位置的参数转换;
  默认是不转换

23. @property (nonatomic,assign)BOOL mirrorDrawX

 功能:
  在绘制的时候, 横向图像镜像, 左边的在右边, 右边的在左边

24. @property (nonatomic,assign)BOOL mirrorDrawY

 功能:
  竖向图像镜像, 上面的放下面, 下面的放上面. 默认不调整

25. @property(readwrite, nonatomic) CGFloat opacityPercent

 功能:
  不透明度.
  默认是1.0; 完全透明是0.0

26. @property (readwrite,assign) CGFloat cutStartTimeS

 功能:
  裁剪时长的开始时间
  相对于原视频的时间而言;
  仅对视频有效

27. @property (readwrite,assign) CGFloat cutEndTimeS

 功能:
  裁剪时长的结束时间;
  仅对视频有效

28. -(void)addKeyFrameAtCompTime:(CGFloat)compTimeS

 功能:
  添加关键帧

29. -(void)removeKeyFrameWithCompTime:(CGFloat)compTimeS

 功能:
  删除关键帧

30. -(void)removeAllKeyframe

 功能:
  删除所有关键帧

31. @property (readwrite, assign) CGFloat brightnessPercent

 功能:
  调节亮度的百分比.
  这里的百分比是两倍的关系,范围是 0--2.0; 其中 1.0 是默认值,
  0---1.0是调小;
  1.0 是默认,
  1.0---2.0 是调大;
  如要关闭,则调整为 1.0.默认是关闭

32. @property (readwrite, assign) CGFloat contrastFilterPercent

 功能:
  调节对比度的百分比.
  这里的百分比是两倍的关系,范围是 0--2.0; 其中 1.0 是默认值,
  0---1.0是调小;
  1.0 是默认,
  1.0---2.0 是调大;
  如要关闭,则调整为 1.0.默认是关闭

33. @property (readwrite, assign) CGFloat saturationFilterPercent

 功能:
  调节饱和度的百分比.
  这里的百分比是两倍的关系,范围是 0--2.0; 其中 1.0 是默认值,
  0---1.0是调小;
  1.0 是默认
  1.0---2.0 是调大;
  如要关闭,则调整为 1.0.默认是关闭

34. @property (readwrite, assign) CGFloat sharpFilterPercent

 功能:
  调节锐化的百分比.
  这里的百分比是两倍的关系,范围是 0--2.0; 其中 1.0 是默认值,
  0---1.0是调小;
  1.0 是默认,
  1.0---2.0 是调大;
  如要关闭,则调整为 1.0.默认是关闭;

35. @property (readwrite, assign) CGFloat whiteBalanceFilterPercent

 功能:
  调节色温的百分比.
  这里的百分比是两倍的关系,范围是 0--2.0; 其中 1.0 是默认值,
  0---1.0是调小;
  1.0 是默认,
  1.0---2.0 是调大;
  如要关闭,则调整为 1.0.默认是关闭

36. @property (readwrite, assign) CGFloat hueFilterPercent

 功能:
  调节色调的百分比.
  这里的百分比是两倍的关系,范围是 0--2.0; 其中 1.0 是默认值,
  0---1.0是调小;
  1.0 是默认,
  1.0---2.0 是调大;
  如要关闭,则调整为 1.0.默认是关闭

37. @property (readwrite, assign) CGFloat exposurePercent

 功能:
  调节曝光度的百分比.
  这里的百分比是两倍的关系,范围是 0--2.0; 其中 1.0 是默认值,
  0---1.0是调小;
  1.0 是默认,
  1.0---2.0 是调大;
  如要关闭,则调整为 1.0.默认是关闭

38. @property(readwrite, nonatomic) CGRect mosaicRect1InView

 功能:
  马赛克区域:
  xy以左上角开始, 左上角是0.0,0.0;
  宽度是一个百分比, 最大是 1.0;
  高度是 一个百分比. 最大是1.0; 
  你实时传递过来的宽高和坐标, 除以当前图层的宽高,转换为百分比后设置过来, 
  宽高坐标可以通过getCurrentRectInView 获取到当前图层在compositionView中的位置; 
  我们举例最大4个马赛克区域;如果你需要更多的马赛克区域, 则用LSOMosaicRectFilter执行增加;
  预览时有效

39. @property (readwrite,nonatomic) CGFloat beautyLevel

 功能:
  设置美颜,
  范围是0.0---1.0; 0.0是关闭美颜; 默认是0.0;

40. @property (nonatomic,nullable, copy)LanSongFilter *filter

 功能:
  设置一个滤镜, 设置后, 之前增加的滤镜将全面清空.
  类似滤镜一个一个的切换.新设置一个, 会覆盖上一个滤镜.
  如果滤镜是无, 或清除之前的滤镜, 这里填nil;

41. -(void)addFilter:(nullable LanSongFilter *)filter

 功能:
  增加一个滤镜,
  增加后, 会在上一个滤镜的后面增加一个新的滤镜.
  是级联的效果 
  源图像--->滤镜1--->滤镜2--->滤镜3--->移动旋转缩放透明遮罩处理--->与别的图层做混合;

42. -(void)removeFilter:(nullable LanSongFilter *)filter

 功能:
  删除一个滤镜

43. -(void)removeAllFilter

 功能:
  删除所有滤镜

44. @property (nonatomic, assign)CGFloat audioVolume

 功能:
  调节素材中的音频音量.
  如果素材有音量,则设置, 如果没有音量,则无效;
  范围是0.0---8.0;
  1.0是原始音量; 大于1.0,是放大; 小于1.0是减低, 如果降低建议是0.1;
  如果是0.0则无声,

45. @property (readwrite, assign) CGFloat volumeFadeOutDurationS

 功能:
  音量淡出时长设置/获取;
  默认是0.0,无淡出效果;
  最大为当前有效时长的1/3;

46. @property (readwrite, assign) CGFloat volumeFadeInDurationS

 功能:
  音量淡入时长设置/获取;
  默认是0.0,无淡入效果;
  最大为当前有效时长的1/3;

47. @property (nonatomic, assign)CGFloat videoSpeed

 功能:
  视频的播放速度;
  范围是 0.1---10.0
  默认1.0; 正常播放;
  建议的设置参数是:
  变慢: 0.1, 0.2, 0.4, 0.6,0.8
  变快: 2.0, 3.0, 4.0, 6.0,8.0;
  当前仅是画面变速, 变速过程中暂时无声音;

48. -(void)setVideoReverseAsync:(BOOL)isReverse asyncHandler:(void (^)(CGFloat percent, BOOL finish))handler

 功能:
  给视频图层设置倒序 
  异步是因为: 在视频第一次倒序的时候, 有一个异步预处理的过程;
  percent:预处理百分比: 0---1.0;
  当前暂时不支持声音倒序. 在倒序时, 默认音量为0;
  调用此方法,会先触发容器暂停;
  在异步线程执行此block; 请在一下代码里调用;
 dispatch_async(dispatch_get_main_queue(), ^{
 });

49. - (void)cancelVideoReverse

 功能:
  取消正在执行的视频倒序功能

50. @property(nonatomic, readonly)BOOL isReverse

 功能:
  当前是否在倒序状态

51. - (void)getThumbnailAsyncWithHandler:(void (^)(UIImage *image, BOOL finish))handler

 功能:
  异步获取当前缩略图;
  当前是每秒钟获取一帧;, 一帧宽高最大是100x100;
 参数:
  image 是获取到的每一张缩略图;
  finish 是否获取完毕;
  获取的缩略图的高度是192像素,高度是192,返回所有图片的宽度总和是 当前要显示时长乘以192;
  比如当前图层显示时长是6.2; 则返回的缩略图是 6192x192的图片和一张 38x192 (38=192*0.2);

52. - (void)getOriginalThumbnailAsyncwithCount:(int)count handler:(void (^)(UIImage *image, BOOL finish))handler

 功能:
  获取原视频的缩略图;
  从原视频的 0,到最后; 返回的所有图片都是192x192像素大小;

 参数:
  count 要获取的张数  , 如果不清楚获取几张图片, 则用(int)originalDurationS;
  handler 获取的异步回调;

53. - (void)getThumbnailAsyncWithDuration:(CGFloat)durationS handler:(void (^)(UIImage *image, BOOL finish))handler

 功能:
  获取指定时长的缩略图;
  从当前裁剪的开始时间,计算, 每秒钟返回一帧, 一帧的宽高是192
 参数:
  durationS 要的时长
  handler 异步回调;

54. @property (readonly,assign) CGFloat thumbnailDisplayTimeS

 功能:
  缩略图的显示时间

55. @property(nonatomic, readwrite) NSMutableArray<UIImage *> *thumbImageArray

 功能:
  在你第一次调用过getThumbnailAsyncWithHandler. 内部会保存到这个属性中.
  在下次获取的时候, 则可以直接读取;

56. @property (nonatomic, assign)BOOL touchEnable

 功能:
  当前图层是否需要touch事件;
  默认是需要的;

57. @property (nonatomic, assign) CGFloat backGroundBlurLevel

 功能:
  背景虚化值.
  设置为0,取消背景;

58. - (void)resetLayerLayout

 功能:
  把图层恢复到刚增加时的位置和大小

59. -(BOOL)isDisplay

 功能:
  当前图层是否在显示状态

60. - (LSOAnimation *) addAnimationWithJsonPath:(NSString *)jsonPath atCompS:(CGFloat) atCompS

 功能:
  AEjson形式增加一个动画
 参数:
  jsonPath 动画文件
  atCompS 从播放器的什么位置增加

61. - (LSOAnimation *) setAnimationAtLayerHead:(NSString *)jsonPath

 功能:
  在图层的头部增加一个动画
 参数:
  jsonPath 动画文件,json格式

62. - (LSOAnimation *) setAnimationAtLayerEnd:(NSString *)jsonPath

 功能:
  在图层的尾部增加一个动画
 参数:
  jsonPath 动画文件, json格式

63. - (void)removeAnimation:(LSOAnimation *)animation

 功能:
  删除一个动画
 参数:
  animation 动画对象,addAnimation的时候增加的

64. - (void)removeAllAnimationArray

 功能:
  删除所有动画

65. - (NSMutableArray *)getAllAnimationArray

 功能:
  获取所有的动画对象数组

66. -(BOOL) playAnimation:(LSOAnimation *)animation

 功能:
  预览一个动画
 参数:
  animation 预览会从动画的开始时间点,播放到结束时间点

67. - (LSOEffect *) addEffectWithJsonPath:(NSString *)jsonPath atCompS:(CGFloat) atCompS

 功能:
  AEjson文件形式在指定时间点增加一个特效
 参数:
  jsonPath 特效的json
  atCompS 从容器的指定时间点

68. - (LSOEffect *) addEffectWithJsonAtLayerHead:(NSString *)jsonPath

 功能:
  在图层的头部增加一个特效
 参数:
  jsonPath 特效的json文件

69. - (LSOEffect *) addEffectWithJsonAtLayerEnd:(NSString *)jsonPath

 功能:
  在图层的尾部增加一个特效
 参数:
  jsonPath 特效的json文件

70. - (void)removeEffect:(LSOEffect *)effec

 功能:
  删除一个特效,
 参数:
  effect 特效对象,addEffectXXX得到的特效对象

71. - (void)removeAllEffectArray

 功能:
  删除所有的特效

72. -(BOOL) playEffect:(LSOEffect *)effect

 功能:
  预览一个特效
 参数:
  effect 预览会从特效的开始时间点,播放到结束时间点

73. - (NSMutableArray *)getAllEffectArray

 功能:
  获取所有的特效对象数组

74. @property(readwrite, assign)NSURL *transitionJsonUrl

 功能:
  设置转场的动画路径, json格式;
  可通过这个获取是否设置了转场; 如果要取消转场;则这里等于nil;
  设置后, 默认转场时间为1;

75. - (void)setMGTransitionWithColorUrl:(NSURL *)colorUrl maskUrl:(NSURL *)maskUrl

 功能:
  增加mg转场动画

76. @property(readwrite, assign)CGFloat transitionDurationS

 功能:
  设置或获取转场时间
  在设置转场后有效;
  时间范围是0---5.0;
  如转场时间 大于图层时间, 则等于图层时间;
  可以通过转场时间,判断当前图层是否有转场功能;

77. @property(readonly, nonatomic)CGFloat transitionMaxDurationS

 功能:
  转场可设置的最大值;
  只能获取;
  最大值等于, 当前图层的1/3 和下一个图层时长的1/3 3 的最小值;

78. @property(readonly, nonatomic)BOOL isAddTransition

 功能:
  是否增加了转场

79. - (BOOL)playTransition

 功能:
  预览转场;
  你需要在设置转场后调用才有效;

80. - (void)cancelTransition

 功能:
  取消转场

81. @property (nonatomic, readonly) CGFloat transitionStartTimeOfCompS

 功能:
  转场相对于播放器的开始时间

82. @property (readwrite,nonatomic)NSURL *videoURL

 功能:
  如果是拼接的是视频, 或叠加的是视频, 则可以获取到videoURL路径

83. @property (readwrite,nonatomic)UIImage *uiImage

 功能:
  拼接或叠加一张图片时, 增加的图片对象

84. @property (readonly, nonatomic, nullable) NSURL *reverseVideoUrl

 功能:
  获取倒序的视频路径;
  在设置倒序,并倒序完成后获取;
  在容器释放或 图层释放后, 内部会删除;

四、AE模版SDK

4.1、模板素材类:LSOAexAeModule 和LSOAexImage

LSOAexModule类是用来设置一个模板的各种素材,比如一个模板在导出时会导出背景视频文件,透明mv视频, 声音等其他素材,加载后你会得到这个模板的宽度,高度, 可替换图片数量,以及每张图片的开始时间和 图片显示时长。 lsoaeximage就是图片类,我们已经在解析时,对每张图片按照时间出现的先后顺序做了排序,你获取的第1个索引,就是最先显示的图片,你要替换视频图片为视频或图片则调用updapath,你可以在开始时间调用,也可以在模板加入到预览播放器中调用; 替换时有一个option选项,当前支持设置缩放形式和开始时间,option的枚举缩放,支持裁剪到全屏、完整缩放, 视频类型缩放;updatePath替换返回布尔类型,表示替换成功或失败。 可多次调用。 如果是视频则可以通过getThumbnailAsync异步获取需要的缩略图。

4.2、AE播放类:LSOAexplayerView

用来播放一个AE模板(LSOAexModule), 支持播放进度回调、播放完成回调,导出进度回调,导出完毕回调、定位到时间,定位到AexImage, 暂停pause、恢复resume,开始播放,开始导出, 有执行错误回调, 播放的AexImage改变回调,并支持手势,当点击播放画面时,会返回用户当前点击了哪个LSOAexImage。当用户在播放过程中要替换素材时, 可通过AexImage的updatePath方法替换, iOS需要在调用updateWithUrl后另外再执行aexComposition的updateAexImage;我们内部检查到你替换后,会显示替换后的画面,并渲染到当前module中。 iOS版本的API 是:LSOAexComposition和LSOAexDisplayView两个类组成, 一个是合成,一个是播放窗口。

4.3、手势说明:

在播放中,当用户手指点击画面时,播放器会暂停,并返回给你用户选中的AexImage对象,可直接更改AexImage中的视频或图片,更改后,播放器会相应的播放替换后的视频或图片。 当用户图片或视频宽高不等于AE模板中的图片宽高时, 在替换时,默认会根据option的缩放类型做缩放,并从画面中心显示; 在用户点击播放画面时, 可单指移动调整要显示画面的哪部分,也可以双指缩放和旋转来调整显示的画面, 调整后的画面就是最终要生成的画面。如果你两个图片在AE制作时是重叠的, 有可能点击图片的时候, 会选中另一张图片,而非你要的图片,建议在制作时不要重叠(下一个版本会做进一步的优化)。

4.4、AexImage的改变回调方法说明:

我们内部是查找哪个aexImage的开始时间点 和当前时间的差值最小, 而返回哪个aexImage, 如果你多个图片在时间点上是重叠的, 有可能返回的aexImage不是你要的结果,这是正常情况,可和AE设计师商量如何避免


五、人像分割SDK

5.1、IOS的人像分割用到的库

库:

模型:

需要依赖系统的库:

调用

唯一类:TLAPISegment
/// 初始化模型
/// @param modelPath model的路径
/// @param protoPath 协议的路径
- (instancetype)initWithModelPath:(NSString *)modelPath protoPath:(NSString *)protoPath;


/// 分割一帧画面
/// @param image_buffer 原始的数据,
/// @param callback 分割完毕后的回调, 回调工作在UI线程;
- (void)segmentPixelBuffer:(CVPixelBufferRef)image_buffer callback:(segmentCallback2)callback;


/// 释放模型
- (void)relaseLSO;

5.2、不用人像分割,可删除的文件

Android:

  1. assets下的tenlinev2.model
  2. jniLibs/arm64-v8a下的libTenLineJni.so
  3. jniLibs/armeabi-v7a下的libTenLineJni.so

IOS:

  1. tnn.framework
  2. TenLineSegmnetFramework.framework
  3. tnn.metallib
  4. TEN_LINE_IOS.MODEL
  5. TEN_LINE_IOS.MODEOPROTO
  6. TenLineFast_ios.MODEL
  7. TenLineFast_ios.MODELPROTO

六、Android端错误代码

6.1、错误码:1200

 编码配置错误.
 一般是当前设备不支持编码分辨率,或编码码率导致.
 SDK内部用的是MediaCodec编码,
 如果分辨率设置超过了MediaCodec的范围, 则抛出此错误信息.

6.2、错误码:1201

编码配置错误.
一般是当前设备不支持编码分辨率,或编码码率导致. SDK内部用的是MediaCodec编码, 如果分辨率设置超过了MediaCodec的范围,则抛出此错误信息.

6.3、错误码:1202

 GPU执行错误.

6.4、错误码:1203

编码器在编码一帧完成后的, 引出数据时发生错误.

6.5、错误码:1204

SDK的授权文件错误.
可能是SDK过期, applicationID 和授权文件中的不一致, 或超出了使用时间.

6.6、错误码:1205

渲染的surface错误.
常见为:没有设置surfacesurface已经被释放

6.7、错误码:1206

容器宽高设置过低的错误.
分辨率设置小于320x320,则会抛出此错误信息

6.8、错误码:1207

当前图层错误.
建议拿到错误信息日志后,分析是哪里的问题.