蓝松短视频SDK开发手册
-
- 一、蓝松SDK组成
- 二、SDK集成和单位说明
- 三、视频编辑SDK
- 四、AE模版SDK
- 五、人像分割SDK
- 六、Android端错误代码
一、蓝松SDK组成
- 蓝松SDK包含了视频编辑SDK和AE模版SDK
- 此文档基于蓝松SDK4.5.8版本编辑
- 文档更新说明:
序号 | 文档更新内容 | 时间 |
---|---|---|
1 | 更新Android、IOS的API说明 | 20210114 |
2 | 更新人像分割SDK库说明 | 20210519 |
3 | 增加Android端错误代码解释 | 20210716 |
二、SDK集成和单位说明
2.1、Android端
- 我们的SDK以module的形式提供, 在你的项目中点击File/import midule导入,并在您主module中的build.gradle中增加implementation project(':LanSongSDK')(如果是更新SDK, 则先删除当前的module,,并屏蔽build.gradle中的字段, 然后在import导入,再打开屏蔽)
- LanSongSDK module下的assets下有LanSongIFxxx开头滤镜用到的各种图片资源, 如您项目没有用到LanSongIFxxx开头的滤镜,则可以删除。
- 其他的代码,各种资源,各种视频素材等均为演示所用,不属于sdk的一部分。
- 代码使用
1. LanSoEditor.initSDK(getApplicationContext(), null);
// 初始化SDK.[必须] (null时,APP名字一定是我们demo名字)
2. LanSoEditor.setTempFileDir();
//设置SDK处理过程中的临时文件缓存路径,也是我们容器最终生成视频的路径, 您可以设置生成视频名字的前后缀. 此代码是公开的, 您点击后会看到更多注释 [可选]
3. LanSoEditor.setSDKLogOutListener
//设置日志输出监听 [可选].
2.2、IOS端
- 拖动LanSongEditorFramework.framework到你的项目中, 并在工程的Build Phases标签页的Link Binary With Libraries中把我们的framework放到最上面.
- 在Build Phases的<Link Binary With Libraries>中增加libz.tbd , libbz2.tbd, libc++.tbd, libiconv.tbd
- 在你代码中包括头文件: #import <LanSongEditorFramework/ LanSongEditor.h>
- LanSongEditorBundle.bundle 是我们sdk中 以LanSongIFxxx开头用到的一些滤镜图片,如果没用到LanSongIFxxx开头的滤镜,则不用增加此文件。如用到则把LanSongEditorBundle.bundle 拖动到你项目的 copy Bundle Resources中
- 其他的代码,各种资源,各种视频素材等均为演示所用,不属于sdk的一部分。
- 代码使用
初始化
1. 增加头文件
#import <LanSongEditorFramework/LanSongEditor.h>
2. 在您程序刚开始的地方初始化我们的SDK:
[LanSongEditor initSDK:nil]
//初始化SDK [必须] (nil时,APP名字一定是我们demo名字)
2.3、时间单位
Android
- 用到两种时间单位:float类型和long类型;
- float类型是秒,long类型是微秒,
- 1秒等于1000*1000微秒;所有时间参数是float类型,即为秒;所有时间参数是long类型,则是微秒;
- 我们的一个容器类在执行的时候,有进度回调OnLanSongSDKProgressListener 和OnLanSongSDKThreadProgressListener, 其中ThreaProgress是工作在内部线程中,直接调用监听给你, 没有经过handle+message机制, 监听的两个参数分别是(long currentPtsUs, int percnet); 其中 currentPtsUs:是当前即将处理的帧的时间戳, percent是当前处理的百分比;
IOS
- ios用到一种单位:CGFloat类型, 浮点类型,单位秒;
- 视频在编码中, 我们默认是一秒钟一个IDR帧;
三、视频编辑SDK
3.1、SDK中用到的名字解释
1.composition: 合成, 是一个容器, 用来存放各种素材的容器, 缩写是: compXXX, 比如compDurationUs, 则表示合成的时长,单位是微秒(Us)
2.original: 原始的, cut:时间裁剪; duration:时长;
3.2、合成容器:ConcatComposition
- 字面意思是:拼接合成.是以图片和视频的拼接的总时长作为最终导出视频的时长, 容器有3大层, 分别是:背景图层 , 拼接类图层 , 叠加类图层.
- 背景层: 给容器整体增加一个背景图层, 支持:颜色背景, 图片背景, 如果你要给不同的图层设置不同的背景,则可以用图层的画布/背景功能来分别设置.
- 拼接层: 把用户选中的图片和视频前后拼接在一起,是前后叠加. 可以在开始前增加, 也可以做预览过程中插入, 可以指定时间点插入, 可复制, 可删除, 可调节每个图层的前后位置, 支持手势调节, 支持图层的各种方法.
- 叠加类图层: 在拼接层上面,叠加多个其他图层, 是上下叠加. 比如叠加水印, 叠加文字, 叠加动画等等这些称之为叠加类型的图层, 图层可调节上下位置, 可设置显示开始时间点, 可设置显示时长;可叠加, 可删除, 支持手势,旋转移动缩放滤镜马赛克等等, 可执行父类图层的所有方法.
- 这些API 的关键词是: 在LSOConcatCompositionView中;, 拼接:(concat), 叠加:(overLay), 背景(backGround).
3.3、视频和图片的混合编辑
- 当前大部分视频编辑是拼接编辑, 比如您选中了几个视频和几个图片, 则是视频和图片混合的前后拼接合成的编辑.
- 可以是单个视频, 也可以是多个视频, 也可以是一张图片或多种图片, 或者图片和视频混合编辑.
- 视频增加后,当前默认是整个视频时长增加进去, 增加后, 你可以设置视频时长, 容器的总时长会改变, 得到图层对象,可执行图层的各种方法.
- 图片增加后, 默认每张图片显示3秒, 可调节显示时长, 可复制,删除,插入图片, 拼接图片不可以循环, 得到图层对象,可执行图层的各种方法.
- 如果设置了转场,则前一个层和后一层有部分画面是重叠, 重叠时间可设置. 设置转场后,
- 最终容器的总长度是各个图片和视频的长度之和 ,如果有转场或视频变速,则对应的时长会改变.
3.4、图层之--时间调节
- 素材本身的的时长. 比如视频时长,声音时长, 图片在放入后, 默认是显示3秒; 图片序列和gif等是其本身的时长; 这个时长是素材本身的, 我们称之为AssetDuration 是资源时长, 只能读取,不能修改, 但你可以修改素材在容器中的显示时间和从什么时间点开始显示;
- 可以修改的有: 素材在容器中的显示时间点, 是否循环, 显示时长, 如果循环,则会从显示时间点开始, 一直循环到整个容器尾部, 时间可以实时设置, 实时调节, 实时获取,当显示时长改变后, 如果你要获取对应的缩略图,则缩略图中图片数组也会相应的改变;
- 如果是视频素材, 则支持裁剪视频长度, 两个方法是: setCutStartTime和 setCutEndTime,从视频的什么时间开始裁剪,和裁剪到什么地方; 视频裁剪当前没有约束, 但建议你最小裁剪值是1秒;
- 这些API的名字是:资源时长(assetDuration), 当前图层的显示时长( displayDuration), 从容器的什么时间点开始显示:(startTimeOfComp);
3.5、图层之--手势 + 移动/缩放/旋转
- 容器在创建时设置了宽度和高度, 素材增加进去后, 会默认放到容器的中间, 即容器的宽度/2和高度/2.
- 每增加一个素材, 会得到一个图层对象, 图层都支持用手指直接操作屏幕 来完成 移动缩放旋转的touch事件,, 你可以单指移动, 双指缩放和旋转; 当选中一个图层时, 它的周边会出现一个红色的方框, 表示选中当前图层, 为了避免在操作时误触别的图层, 你可以把别的图层锁定, 我们提供丰富的API让你设置或获取相关的坐标, 我们甚至定义了一个类LSORect来让你获取相对应当前预览窗的相对坐标 和 相对于容器中的绝对坐标.
- 我们另外定义了各种常见的枚举类型, 比如4种缩放类型, 和上/下/左/右/中/左上/左下/右上/右下这9个位置点供您选择; 提供缩放系数, 缩放到实际大小,设置具体位置, 相对屏幕位置等.
- 如果你要用代码的形式设置, 则设置的位置是当前图层中心点的位置. 可以缩放到指定大小, 旋转则0度则是正上方为0点, 角度是任意角度, 比如设置为-100度, -400度, 或370度, 540度等等.
- 这些API的关键词是: 缩放大小(scaleSize), 缩放类型(scaleType) , 缩放系数(scaleFactor), 位置类型( positionType) , 位置中心点(centerPoint), 位置相对预览窗口坐标(positionInView), 旋转 (rotation), setTouchEnable , xxxInView( 是以当前预览为单位的宽高和位置;)
3.6、图层之--贴纸/水印/文字
- 贴纸, 水印, 文字, 在我们图层处理架构里, 是以图像的形式呈现的, 因为手机GPU处理的是图像, 贴纸, 水印, 文字在底层是一个意思, 认为是一个图像或一组连续的图像做处理.
- 文字在SDK内部会各种转换方法, 让你方便的以文字图层操作, 操作完毕后底层会转换为图像来处理,如果我们提供的绘制文字不够详细, 你也可以自己绘制,然后转换为图片或图片数组,设置到容器中.
- 贴纸和水印是一个意思,我们提供了单个图片的图层,多张联系图片组成的图层, Gif图层等, 这些你可以方便的设置, 可以设置一个,也可以设置多个.
- 图层的增加是通过容器Composition的方法实现的, 增加后, 得到对应的图层对象;
- 这些API 的关键词是: android的图片图层(BitmapLayer) , android的图片序列图层(BitmapListLayer), ios的图片图层(ImageLayer), ios的图片序列图层(ImageListLayer), Gif图层.
3.7、图层之--颜色调节/滤镜/美颜
- 滤镜是对图层的画面做调节, 和图层的缩放移动一样是图层的一个属性, 颜色调节和滤镜和美颜, 都是滤镜的不同效果. 当前我们的美颜是仅对整体画面做磨皮和美白处理,没有做脸识别后的各种功能.
- 当前支持的颜色调节包括: 亮度/ 对比度/ 饱和度/ 锐化/色温/白平衡/色调/曝光度
- 当前支持80种滤镜, 包括常见的17种滤镜,当前建议你使用这17种滤镜, 这些滤镜在我们demo里可以看到.
- 这些API 的关键词是: 设置滤镜(setFilter,设置会把上一个替换掉),增加滤镜(addFilter), 移出滤镜(removeFilter),删除所有滤镜(removeAllFilter);
3.8、图层之--转场设置
- 转场是两个素材前后拼接时播放时的一种过渡效果, 比如上一段淡淡的消失, 下一段逐渐出现等.
- 当前的转场是AE设计师在PC端用after Effect 设置好的, 然后按照我们的格式,导出为json文档,SDK还原出来在PC端设计的效果. 这样的好处是: 开发人员不用自己用代码实现各种效果,只需要根据不同的效果,把对应的json送到SDK中, SDK就实现了这样的效果, 简单高效, 并可以做到Android和ios的统一.
- PC端用Ae软件制作规范: 用一张小于等于544x960的图片创建一个合成, 然后对其做旋转缩放透明处理, 形成动画; 或对其做mask遮罩处理,形成动画; 当前不支持同时做旋转缩放透明+ mask的效果; 合成的分辨率应小于等于544x960, 时长建议不大于3秒, 以实际效果为准;
- 当前支持各种遮罩转场和基础的移动旋转缩放转场; 转场设置是通过每个具体的图层设置的, 比如有图层ABC3个, 要在AB之前增加转场,则设置A的transition; 要给BC之间加转场,则设置B的transition;
- 转场的时间可以设置,默认在是设置路径后, 会默认是1秒钟, 最大可设置为5秒钟; 当前仅支持遮罩转场, 即各种形式的透明.
- 这些API 的关键词是:转场(transition); 设置转场时间:(transitionDuration) , 播放转场(playTransition), 取消(cancelTransition);
- 执行步骤是: 你需要先设置转场路径, 设置后,默认转场时间是1秒钟, 如需预览,则playtransition; 调用cancelTransition取消转场; 在设置路径后, 你可以设置转场时间; 设置后, 如需要播放则playTransition; 如果你要应用到全局,则需要把一个json文件循环设置到每个图层对象; 我们内部会共用同一个json内容;
3.9、图层之--入场动画/出场动画/指定时间点动画
- 入场动画, 出场动画, 和转场一样, 也是Ae设计师在PC端设计好后, 导出为json,送入到SDK中. SDK解析还原出对应的效果.
- PC端用Ae软件制作动画规范: 用一张小于等于544x960的图片创建一个合成, 然后对其做旋转缩放透明处理, 形成动画; 或对其做mask遮罩处理,形成动画; 合成的分辨率应小于等于544x960, 时长建议不大于3秒, , 以实际效果为准; 如果是旋转缩放透明则帧率建议是40, 若是mask遮罩,则帧率建议25.
- 因入场动画和出场动画从技术上讲,仅仅是插入到图层的时间点不同,SDK可以设置开始从图层的哪个时间点开始, 当前入场动画默认是0, 出场动画默认最后json的时间时长; 你可以调节这个出入场的持续时间, 持续时间调节后, 会把调节后的时长作为整个动画走完的时间, 如果你设置的短,则动画走的快; 如果设置的长,则动画走的慢; 入场动画和出场动画是setXXX的方式, 每次设置后, 会把之前的动画移出;同一时刻只能有一个入场或出场动画.
- 指定时间点动画, 是你可以指定一个时间点增加动画, 可以实时设置开始时间点,也可以设置动画时长, 可以增加多个, 每个素材最大支持20个动画。在每次设置后, 可预览或移除.
- 这些API的关键词是: 动画:(Animation) ; 入场动画/出场动画:(setAnimationAtLayerHead/End), 指定时间点动画:(addAnimationAtCompTimeUs)预览动画 playAnimation; 移除removeAnimation.
- 执行步骤是: 增加json文件, 会得到LSOAnimation对象,用这个对象可以playAnimation来预览; removeAnimation删除; 对象里有设置开始时间点和播放时长的方法;. 等要删除时,用removeAnimation; 当一个图层从容器中释放后, 我们会销毁里面的所有的对象.
3.10、图层之--特效
- 和动画一样的制作步骤, 唯一不同的是: 动画是从开始播放到结束, 如果设置的时长不等于json中的默认时长,动画平均分配不同的动画快慢来达到设置的长度; 而特效的效果时间是固定的, 如果设置的时长json中的默认时长,则会循环播放特效.
- 特效可设置当前图层的任意时刻点开始,我们举例了从头(head) 和尾(end)的两种方式.
- 这些API的关键词是: 特效:(Effect), 指定时间点增加特效:(addEffectAtCompTimeUs); 预览特效(playEffect), 移除特效:(removeEffect).
- 执行步骤, 和动画步骤一致.
3.11、图层之--画布(背景)/去水印/透明/镜像
- 画布是对当前每个图层做的操作, 是无论图层缩放多少, 画布都会铺满整个容器, 画布可以是颜色, 图片, 或画面的虚化做背景;
- 去水印当前支持马赛克去水印, 我们在图层类中举例了最大4个去水印的API, 可以设置位置,设置大小,设置马赛克像素的大小; 如果你有更多个马赛克的需求,还是用LanSongMosaicRectFilter自行增加;
- 透明我们描述为:不透明度, 这样更好理解一些, 和调节RGB一样,可以直接设置; 参数1.0是完全不透明, 0.0是完全透明;
- 镜像:是把整个画面的左边镜像到右边, 把右边镜像到左边; 如果你打算把左边的一半镜像到右边,则用我们的LanSongMirrorFilter滤镜;
- 这些API的关键词是: 背景(backGround), 去水印(mosaicRect), 不透明度(opacityPercent) , 镜像(mirror).
3.12、图层之--获取缩略图
- 缩略图是每秒钟一帧, 大小是192x192的图片对象;
- 用getDisplayThumbnailList 获取到每张图片大小是192x192, 每个图层最后获取到的图片宽度总和等于图层的缩略图显示时长(秒为单位)*192;
- 我们有合成总时长改变回调(DurationChanged): 当原视频时长裁剪, 变速,倒序,增加转场,都会触发此回调,建议在这里重新刷新所有的拼接层的时长, 因为一个图片或视频的时长改变了, 别的图片和视频的开始显示点等都会改变;
- 我们的demo演示, 是在durationChanged的时候刷新所有的拼接层的所有图层缩略图;
3.13、图层之--关键帧动画
- 关键帧动画是指:在两个不同时间点分别对视频或图片做动作, 然后SDK就会自动从一个时间点平滑过渡到另一个时间点状态的动画, 称之为关键帧动画;
- 比如你在时间A点把视频缩小一倍, 在B点把视频放大一倍, 则预览时SDK就会自动的从A点平滑的一点一点的放大视频,直到B点放大完毕,从而形成动画.
- 当前关键帧动画支持 移动旋转缩放透明;
- 关键帧的优先级最低, 如果在同一时间段设置了关键帧和动画/特效/转场等json时, 则动画/特效/转场有效果, 关键帧无效;
3.14、图层之--调速
- 视频支持调速, 调速可设置0.1倍到10.0倍
- 0.1倍是放慢10倍, 画面显示时长等于原来的10倍, 10.0倍是加快10倍, 画面时长等于原来的1/10; 1.0 倍是原来的速度, 可以很细小的调节,比如0.1, 0.2, 0.3等;
- 当前在调速时, 暂时不支持声音变速; 声音默认是静音的; 调速后,会触发容器的durationChanged回调, 建议你在回调中去刷新所有缩略图;
- 对应的API 是: setVideoSpeed, getVideoSpeed;
3.15、声音图层
- 外界输入的各种音效, 无论是wav格式的音效, 还是mp3,m4a, 或者录音 或者带有声音的视频, 我们统称为声音. 这些声音是同一个API输入到SDK中, 然后得到对应的声音图层.
- 声音图层, 可以指定时间点增加, 可以设置循环, 设置把声音的那一段裁剪后增加, 设置音量大小, 设置淡入淡出效果
- 声音音量范围是0---5.0 , 1.0是默认声音. 0.0是关闭声音; 5.0是放大5倍; 声音裁剪最小是300毫秒, 最大是声音的原始长度;
- 这些API的关键词是: 音频图层:(LSOAudioLayer); 裁剪时长(setCutStartTime/setCutEndTime) 音量:(volume)
3.16、API介绍
3.16.1 Android视频编辑SDK概述:
- 我们把视频编辑抽象为两个类, 一个是编辑预览类LSOEditPlayer, 一个图层类LSOLayer。
- 播放预览类LSOEditPlayer, 是一个素材容器, 也是一个view,可布局到xml中,当设置宽高比例时,会自动适配并等比例布局播放画面,以监听返回. 可完成素材的:插入或删除,替换,拼接,叠加,定位,播放/暂停等实时容器预览的功能。
- 图层类LSOLayer: 图片/视频/文本/特效/GIF等增加到播放器中后,我们把他处理成一层画面 ,增加一个, 就是增加一层画面;增加时会返回LSOLayer对象,用这个对象可以设置:时间点,位置,宽高,角度,镜像,倒序,滤镜,调节,美颜,动画,转场,特效等功能。
- 调用流程是:在Activity的onCreate/onPause/onResume/onDestroy生命周期中, 分别增加LSOEditPlayer对应的同名方法即可。
- 素材增加的形式有两种, 一种是前后拼接, 一种是上下叠加, 示意图如下:
1、Android视频播放LSOEditPlayer类说明
- public void onCreateAsync(LSORatioType ratio, OnCreateListener listener)
功能:
• 设置播放容器宽高比;
• 在Activity的 onCreate中调用,设置播放容器的宽高比, 设置后, 会根据宽高比等比例缩放到当前view所在layout中;
也可以在播放暂停时, 重写布局此播放容器(relayout);
参数:
• ratio 宽高比;
• listener 重新布局后, 适配到layout后的回调;
- public void onCreateAsync(List<LSOAsset> arrays, OnCreateListener listener)
功能:
• 设置播放容器的资源
参数:
• arrays 容器资源数组, 支持图片和视频.
• listener 默认会以第一个图片或视频的宽度为参考,等比例缩放当前播放容器后回调;
- public void onCreateAsync(List<LSOAsset> arrays,int width, int height, OnCreateListener listener)
功能:
• 设置播放容器资源, 并设置宽度和高度
参数:
• arrays 输入的图片或视频资源;
• width 播放容器的宽度
• height 播放容器的高度
• listener 根据设置的高度和宽度, 重新等比例布局当前view, 布局后返回监听;
- public void onCreateAsync(int width,int height, OnCreateListener listener)
功能:
• 设置容器的宽度和高度, 在播放设置, 不可以用来初始化播放器;
• 在第一次之后设置
参数:
• width 宽度
• height 高度
• listener 适配当前view后的监听;
- public void onResumeAsync(OnResumeListener listener)
功能:
• 在Activity的 onResume中调用, 用来执行activity的返回事件;
参数:
• listener 异步回调;
- public void onPause()
功能:
• 在Activity中的onPause中调用;
- public void onDestroy()
功能:
• 在Activity的onDestroy中调用
- public void prepareConcatAssets(OnAddAssetProgressListener listener)
功能:
• 在当前View布局完毕后, 准备当前播放器;
参数:
• listener 内部会开启一个线程, 内部开启完毕后的回调;
- public void insertConcatAssetAtCurrentTime(List<LSOAsset> assetArray, OnAddAssetProgressListener listener1)
功能:
• 在当前时间点插入图片或视频
参数:
• assetArray 插入的图片或视频数组
• listener1 插入完毕后的回调;
- public void insertConcatAssetWithTime(List<LSOAsset> assetArray, long atCompUs, OnAddAssetProgressListener listener1)
功能:
• 在指定的时间点插入图片或视频.
• 内部流程是:
• 先找指定时间点 在某个图层时间段内.
• 找到图层后, 如果时间点在图层前半部分,则向前插入; 如后半部分,则向后插入;
参数:
• assetArray 插入的图片或视频数组
• atCompUs 在指定的时间点
• listener1 异步插入完毕后的回调;
- public void replaceConcatLayerAsync(LSOAsset asset, LSOLayer replaceLayer, OnAddAssetProgressListener listener)
功能:
• 替换拼接图层;
参数:
• asset 资源
• replaceLayer 被替换的图层
• listener 异步替换;
- public LSOLayer getCurrentConcatLayerByTime(long compUs)
功能:
• 获取指定时间点的拼接图层
参数:
• compUs 指定时间点, 单位微秒; 1秒=1000*1000微秒
• @return 返回图层对象
- public void addAssetAsync(LSOAsset asset, long atCompUs,OnAddAssetProgressListener listener1)
功能:
• 在拼接层上叠加一个资源;
参数:
• asset 图片或视频资源
• atCompUs 指定时间点
• listener1 异步增加完毕后的回调监听;
- public void addVideoEffectAsync(LSOAsset asset, long atCompUs, boolean preview, OnAddAssetProgressListener listener1)
功能:
• 在指定时间点增加一个视频特效, 增加后, 通过异步返回一个LSOLayer对象;
参数:
• asset 一个color和一个mask组成的透明视频动画资源, 宽高:最大720p, 时长:最大5秒钟;
• atCompUs 在指定时间点
• preview 插入后, 是否预览
• listener1 插入完毕后的回调,回调中
- public LSOLayer addBitmapLayer(String path, long atCompUs)
功能:
• 在拼接层上叠加一个图片图层
参数:
• path 图片的完整路径
• atCompUs 在指定时间点增加, 单位微秒
- public LSOLayer addBitmapLayer(Bitmap bmp, long atCompUs)
功能:
• 增加图片图层,
参数:
• bmp 图片对象;
• atCompUs 在指定时间点增加,单位微秒;
- public LSOLayer addGifLayer(String gifPath, long atCompUs)
功能:
• 在拼接层上, 增加一个Gif图层
参数:
• gifPath gif图层路径
• atCompUs 在指定时间点增加,单位微秒;
- public LSOLayer addGifLayer(LSOAsset asset, long atCompUs)
功能:
• 在拼接层上, 增加一个Gif图层
参数:
• asset gif文件的路径
• atCompUs 在指定时间点增加,单位微秒;
• @return 返回LSOLayer图层对象. 此对象可设置图层的移动旋转缩放等功能.
- public LSOAudioLayer addAudioLayer(String path, long startTimeOfComp)
功能:
• 增加声音图层;
参数:
• path 声音的完整路径;
• startTimeOfComp 从合成的什么位置开始增加;
• @return 返回声音对象, 可以设置声音的音量, 循环等功能;
- public void removeLayerAsync(LSOLayer layer)
功能:
• 异步删除图层;
• 删除成功后, 会触发容器时长回调, 在回调中你可以重新布局时间轴
参数:
• layer 图层对象;
- public void removeAllOverlayLayersAsync()
功能:
• 删除所有的叠加图层.
• 叠加图层有:图片图层, gif图层, 图片序列图层等;
- public void removeAudioLayerAsync(LSOAudioLayer layer)
功能:
• 删除声音图层
参数:
• layer
- public void removeALLAudioLayer()
功能:
• 删除所有的增加的声音图层;
- public boolean isPlaying()
功能:
• 画面是否在播放
参数:
• @return 是否在播放
- public boolean isRunning()
功能:
• 当前播放器是否在运行.
• 合成是一个线程, 此返回的是当前线程是否在运行,
• 线程运行不一定画面在播放,有可能画面暂停;
参数:
• @return 线程是否在运行
- public boolean isExporting()
功能:
• 是否在导出;
参数:
• @return
- public long getCurrentPositionUs()
功能:
• 获取当前播放器的时间.
参数:
• @return 当前时间, 单位微秒
- public List<LSOLayer> getAllConcatLayers()
功能:
• 获取播放器的所有拼接图层;
参数:
• @return 图层list 拼接图层;
- public List<LSOLayer> getAllOverLayLayers()
功能:
• 获取播放器中的所有叠加层
参数:
• @return 图层数组, 叠加的图层;
- public List<LSOAudioLayer> getAllAudioLayers()
功能:
• 获取播放器中的所有声音图层
- public void setOnBeforeRenderFrameListener(OnLanSongSDKBeforeRenderFrameListener listener)
功能:
• 在每一帧绘制前的回调, 里面没有经过handler, 你增加的代码, 在我们render线程中执行,
参数:
• listener 返回的是时间戳, 单位us;
- public void setOnDurationChangedListener(OnLanSongSDKDurationChangedListener listener)
功能:
• 容器的总时长改变监听;播放器会在拼接层裁剪, 设置显示时间, 转场,变速等场合下, 时长改变;
• 返回的是当前总时长;
参数:
• listener 总时长改变监听, 返回的long类型改变后的当前总时长
- public void setOnLanSongSDKPlayProgressListener(OnLanSongSDKPlayProgressListener listener)
功能:
• 播放进度回调
• 监听中的两个参数是: onLanSongSDKExportProgress(long ptsUs, int percent);
• 分别对应 当前处理的时间戳 和百分比;
• 在seek或pause的时候,此监听不调用;
参数:
• listener
- public void setOnTimeChangedListener(OnLanSongSDKTimeChangedListener listener)
功能:
• 容器的当前播放时间改变回调;
• 只要是改变了, 不管是seek的改变,还是自动播放的改变,都执行这里;
参数:
• listener 时间改变监听 long类型是当前时间戳, int类型是当前时间戳占总时长的百分比;
- public void setOnPlayCompletedListener(OnLanSongSDKPlayCompletedListener listener)
功能:
• 视频播放完成进度;
参数:
• listener 播放完成监听
- public void setOnExportProgressListener(OnLanSongSDKExportProgressListener listener)
功能:
• 导出进度回调;
• 监听中的两个参数是: onLanSongSDKExportProgress(long ptsUs, int percent);
• 分别对应 当前处理的时间戳 和百分比;
参数:
• listener 导出进度监听, long类型是当前正在处理的时间戳, int类型是进度百分比;
- public void setOnExportCompletedListener(OnLanSongSDKExportCompletedListener listener)
功能:
• 导出完成回调;
• 完成后, 有 void onLanSongSDKExportCompleted(String dstVideo);
• 对应的是:返回完成后的目标视频路径;
参数:
• listener 导出完成监听, 返回String类型的导出视频完整路径;
- public void setOnErrorListener(OnLanSongSDKErrorListener listener)
功能:
• 错误监听
- public boolean start()
功能:
• 开始播放/恢复播放;
- public void startExport(LSOExportType type)
功能:
• 开始导出
参数:
• type 导出枚举类型
- public void seekToTimeUs(long timeUs)
功能:
• 定位到某个位置.
参数:
• timeUs 时间, 单位微秒;
- public void pause()
功能:
• 播放预览暂停
- public long getDurationUs()
功能:
• 获取当前播放器的总时长;
参数:
@return 时间, 单位微秒;
- public void setLooping(boolean is)
功能:
• 设置容器循环播放;
参数:
• is 是否循环;
- public void cancelExport()
功能:
• 取消导出
- public void cancel()
功能:
• 取消当前合成.
• 取消后, 会把内部线程全部退出, 所有增加的图层都会释放;
- public void setFrameRate(int frameRate)
功能:
• 设置导出帧率
• 不建议使用
参数:
• frameRate 帧率最小20,最大是60
- public void setExportBitRate(int bitRate)
功能:
• 设置导出时的码率,
• 不建议使用
参数:
• bitRate 码率, 最小是300K,不建议使用;
2、Android视频编辑图层LSOLayer类说明
- public String getOriginalPath()
功能:
• 获取原视频/图片的路径
参数:
• @return
- public long getOriginalDurationUs()
功能:
• 获取视频/图片的原始时长
参数:
• @return
- public int getOriginalWidth()
功能:
• 获取原始宽度
参数:
• @return
- public int getOriginalHeight()
功能:
• 获取原始高度
参数:
• @return
- public long getDisplayDurationUs()
功能:
• 获取显示时长;
• 如果播放器中只有一个视频或图片, 则此时长等于播放器的时长;
参数:
• @return
- public long getThumbnailDurationUs()
功能:
• 获取缩略图的显示时间;
• 注: 因转场等功能,拼接层可能有重叠区域. 因此显示时长不等于缩略图的时长;
参数:
• @return
- public void setDisplayDurationUs(long durationUs)
功能:
• 设置显示时长;
参数:
• durationUs
- public long getStartTimeOfComp()
功能:
• 获取当前图层在播放器中的开始时间
参数:
• @return
- public void setCutDurationUs(long startUs, long endUs)
功能:
• 设置视频的裁剪时长
参数:
• startUs 开始裁剪时间
• endUs 结束裁剪时间
- public long getCutStartTimeUs()
功能:
• 获取裁剪开始时间
参数:
• @return
- public long getCutEndTimeUs()
功能:
• 获取裁剪结束时间
参数:
• @return
- public void setCropRect(LSORect rect)
功能:
• 设置裁剪区域;
参数:
• @param rect
- public void setCropRectToOriginal()
功能:
• 恢复到不裁剪
- public void setCropRectPercent(float x, float y, float width, float height)
功能:
• 设置裁剪百分比.整个画面从左到右是0.0--1.0; 从上到下是0.0--1.0;
参数:
• x 宽度的开始比例
• y 裁剪高的开始比例
• width 裁剪宽度的比例
• height 裁剪高度的比例
- public void setLooping(boolean is)
功能:
• 叠加层设置循环
参数:
• is
- public void setStartTimeOfComp(long atCompUs)
功能:
• 设置当前图层在播放器中的开始时间点;
参数:
• atCompUs
- public void setVisibility(boolean is)
功能:
• 设置是否显示
参数:
• is
- public void setVisibility(int visibility)
功能:
• 设置是否显示
• 类型是 LSOLayer.VISIBLE 和 LSOLayer.INVISIBLE
参数:
• visibility
- public int getVisibility()
功能:
• 获取是否显示
参数:
• @return
- public void resetScaleSize()
功能:
• 恢复到缩放前的大小
- public void setScaleType(LSOScaleType type)
功能:
• 设置缩放枚举类型.
• NONE: 无缩放形式.则内部会根据不同的素材,采用默认形式;
• ORIGINAL: 原始大小,直接放入, 不做任意处理;
• FILL_COMPOSITION, 忽略百分比,把宽度等于容器的宽度, 高度等于容器的高度,填满整个容器,这样有些画面可能会变形;
• CROP_FILL_COMPOSITION: 裁剪填满 放入到容器中;把视频的中心点放到容器的中心点,然后 把画面等比例提填满整个容器,把多的部分裁剪掉.
• VIDEO_SCALE_TYPE:视频缩放模式,如果视频宽度大于高度, 则宽度和容器对齐, 然后等比例调整高度;如果高度大于宽度, 则反之.
参数:
• type
- public void setScaledValue(float width, float height)
功能:
• 缩放到的实际值
参数:
• width
• height
- public float getScaleWidth()
功能:
• 获取缩放的宽度
参数:
• @return
- public float getScaleHeight()
功能:
• 获取缩放的高度
参数:
• @return
- public float getRotation()
功能:
• 获取旋转角度.
参数:
• @return
- public void setRotation(float angle)
功能:
• 设置旋转角度
参数:
• angle
- public void setLayerMirror(boolean flipHorizontal, boolean flipVertical)
功能:
• 设置图层是否镜像, 上下镜像, 左右镜像.
参数:
• flipHorizontal 水平镜像
• flipVertical 垂直镜像
- public void cancelLayerMirror()
功能:
• 取消镜像
- public boolean isMirrorX()
功能:
• 水平是否镜像
参数:
• @return
- public boolean isMirrorY()
功能:
• 垂直是否镜像
参数:
• @return
- public void setPosition(float xPos, float yPos)
功能:
• 设置当前图层中心点的坐标, xPos是X轴的坐标,yPos是设置Y轴的坐标.
• 此坐标是以播放容器的大小为参考, 比如容器的大小是1280x720, 您设置了640,360 ,则图层在播放器中居中显示
参数:
• xPos
• yPos
- public void setPosition(LSOLayerPosition position)
功能:
• 设置图层的枚举位置;
• 枚举类型有: 左上/左下/右上/右下/居中/上/下/左/右
- public float getPositionX()
功能:
• 获取当前图层中心点的位置X
参数:
• @return 横向坐标中心点, 相对于播放容器本身而言;
- public float getPositionY()
功能:
• 获取当前图层中心点的位置Y
参数:
• @return 竖向坐标中心点, 相对于播放容器本身而言
- public void setOpacityPercent(float percent)
功能:
• 设置透明百分比;
参数:
• percent 百分比 范围从0--1.0;
- public void setBrightnessPercent2X(float percent2X)
功能:
• 调节当前图层画面的亮度
参数:
• percent2X 范围是0--2.0; 1.0为默认值;
- public void setContrastFilterPercent2X(float percent2X)
功能:
• 调节当前图层画面的对比度
参数:
• percent2X 范围是0--2.0; 1.0为默认值;
- public void setSaturationFilterPercent2X(float percent2X)
功能:
• 调节画面的饱和度;
参数:
• percent2X 范围是0--2.0; 1.0为默认值;
- public void setWhiteBalanceFilterPercent2X(float percent2X)
功能:
• 调节画面的白平衡
参数:
• percent2X 范围是0--2.0; 1.0为默认值;
- public void setHueFilterPercent2X(float percent2X)
功能:
• 调节画面的色度
参数:
• percent2X 范围是0--2.0; 1.0为默认值;
- public void setExposurePercent2X(float percent2X)
功能:
• 调节画面的曝光度
参数:
• percent2X 范围是0--2.0; 1.0为默认值;
- public void setBeautyLevel(float level)
功能:
• 设置画面的磨皮级别 0.0--1.0;
参数:
• level 等级 0.0是不磨皮, 1.0是最高磨皮
- public void setFilter(LanSongFilter filter)
功能:
• 设置滤镜, 设置时, 会把上一次设置的滤镜删除; 如果不想删除则用addFilter;
参数:
• filter 滤镜对象, 此对象不可同时设置为多个图层中.
- public void removeFilter(LanSongFilter filter)
功能:
• 移出滤镜
参数:
• filter 增加的滤镜对象
- public void addFilter(LanSongFilter filter)
功能:
• 增加滤镜,如增加多个, 则多个滤镜是级联的关系, 即画面把执行上一个滤镜的结果, 作为下一个滤镜的输入;
参数:
• filter 滤镜对象
- public void removeAllFilter()
功能:
• 删除所有滤镜
- public void setVideoSpeed(float speed)
功能:
• 设置视频速度.
参数:
• speed 视频速度值, 范围0.1--10.0;
- public float getVideoSpeed()
功能:
• 获取视频速度;
参数:
• @return 返回速度值
- public void setVideoReverseAsync(boolean reverse, OnVideoReverseListener listener)
功能:
• 异步设置视频倒序
参数:
• reverse 是否倒序
• listener 倒序后的监听;
- public boolean isVideoReverse()
功能:
• 当前视频是否倒序
参数:
• @return 是否倒序
- public LSOEffect addEffectAtCompTimeUs(String jsonPath, long compUs)
功能:
• 用json的形式增加特效
参数:
• jsonPath 增加一个特效json路径
• compUs 从播放器的什么时间点开始增加
• @return 增加后, 返回特效对象, 可设置开始时间和播放时长;
- public LSOEffect addEffectAtLayerHead(String jsonPath)
功能:
• 在图层的头部增加一个特效
参数:
• jsonPath json路径
• @return 增加后, 返回特效对象, 可设置播放时长;
- public LSOEffect addEffectAtLayerEnd(String jsonPath)
功能:
• 在图层的尾部增加一个特效
参数:
• jsonPath 特效路径
• @return 增加后, 返回特效对象, 可设置播放时长;
- public List<LSOEffect> getAllEffectList()
功能:
• 获取增加的所有特效
参数:
• @return 所有特效数组
- public void removeAllEffectList()
功能:
• 移出当前图层的所有特效
- public void removeEffect(LSOEffect effect)
功能:
• 移出指定的特效
参数:
• effect
- public void playEffect(LSOEffect effect)
功能:
• 播放预览特效
参数:
• effect 指定播放的特效对象,播放后会回到播放前的位置
- public LSOAnimation addAnimationAtCompTimeUs(String jsonPath, long compUs)
功能:
• 增加动画
参数:
• jsonPath json格式的路径
• compUs 从播放器的时间点增加
• @return 返回动画对象, 可设置开始时间和播放时长
- public LSOAnimation setAnimationAtLayerHead(String jsonPath)
功能:
• 在图层的头部增加一个动画
参数:
• jsonPath json动画路径
• @return 返回动画对象, 可设置播放时长
- public LSOAnimation setAnimationAtLayerEnd(String jsonPath)
功能:
• 在图层的尾部增加一个动画
参数:
• jsonPath 动画路径
• @return 返回动画对象, 可设置播放时长
- public List<LSOAnimation> getAllAnimationList()
功能:
• 获取所有动画
参数:
• @return 所有动画对象
- public void removeAllAnimationList()
功能:
• 移出所有动画
- public void removeAnimation(LSOAnimation animation)
功能:
• 移出指定动画
参数:
• animation 指定动画对象
- public void playAnimation(LSOAnimation animation)
功能:
• 播放动画
参数:
• animation 动画对象
- public boolean setTransitionMaskPath(String maskJsonPath)
功能:
• 设置转场路径
参数:
• maskJsonPath 遮罩转场路径
• @return 可以设置返回true; 否则返回false
- public void setTransitionDurationUs(long duration)
功能:
• 设置转场时长
参数:
• duration 时长,范围100*100---3*1000*1000;
- public void playTransition()
功能:
• 开始播放转场
- public void cancelTransition()
功能:
• 取消转场
- protected long getTransitionDurationUs()
功能:
• 获取转场时长;
参数:
• @return
- public long getTransitionStartTimeOfComp()
功能:
• 获取从合成的开始时间;
参数:
• @return
- public LSOMosaicRect getMosaicRect1()
功能:
• 获取一个马赛克区域, 返回马赛克对象,
• 可设置马赛克区域, 是否禁止,马赛克像素点的宽度;
参数:
• @return 马赛克对象
- public void setAudioVolume(float volume)
功能:
• 设置音频音量
- public float getAudioVolume()
功能:
• 获取音频音量
- public void setBackGroundBlurLevel(float level)
功能:
• 设置背景模糊级别
• 1.0是轻微模糊,毛玻璃模糊. 8.0f是完全,深度模糊; 0.0是删除模糊效果;
参数:
• level
- public void setBackGroundBitmap(String bitmapPath)
功能:
• 设置背景图片
参数:
• bitmapPath
- public void setBackGroundColor(int color)
功能:
• 设置背景颜色
参数:
• color
- public float getMaxBlurLevel()
功能:
• 获取最大模糊系数, 当前返回的是8.0;
- public void getThumbnailAsync(OnLanSongSDKThumbnailBitmapListener listener)
功能:
• 异步获取缩略图
参数:
• listener
- public List<Bitmap> getThumbnailListWithCount(int count)
功能:
• 获取缩略图个数, 此方法一定在getThumbnailAsync完成后设置
参数:
• count 获取的图片张数
• @return 返回bitmap数组;
3.16.2 IOS视频编辑SDK概述:
- 我们把视频编辑抽象为两个类, 一个是编辑预览类LSOEditPlayer, 一个图层类LSOLayer。
- 播放预览类LSOEditPlayer,和AVPlayer类似, 需要一个播放窗口UIView,本质是一个编辑播放器,可完成素材的:插入或删除,替换,复制,分割,拼接,叠加,定位,播放/暂停等实时容器预览的功能。
- 图层类LSOLayer: 图片/视频/文本/特效/GIF等增加到播放器中后,我们把他处理成一层画面 ,增加一个, 就是增加一层画面;增加时会返回LSOLayer对象,用这个对象可以设置:时间点,位置,宽高,角度,镜像,倒序,滤镜,调节,美颜,动画,转场,特效等功能。
- 调用流程是: 创建LSOEditPlayer对象, init时可输入图片或视频的url路径和播放器比例,得到播放器容器的宽高,根据宽高创建LSODispLayView作为播放器的显示窗口, 之后正常播放即可.
- 素材增加的形式有两种, 一种是前后拼接, 一种是上下叠加, 示意图如下:
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)
功能:
• 适配ios13的export类问题
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秒; 则返回的缩略图是 6张192x192的图片和一张 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
功能:
• 用AE的json形式增加一个动画
参数:
• 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
功能:
• 用AE的json文件形式在指定时间点增加一个特效
参数:
• 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的人像分割用到的库
库:
- tnn.framework
- TenLineSegmnetFramework.framework
- 说明: 拖动到Build Phases的 Link Binary中.
模型:
- 模型文件:TEN_LINE_IOS.MODEL
- 协议文件: TEN_LINE_IOS.MODEOPROTO
- TNN : tnn.metallib
- 说明: 拖动到工程里,在Build Phases中可以找到即可.
需要依赖系统的库:
- Accelerate.framework (重要)
- CoreML.framework (重要)
- Metal.framework (重要)
- CoreMedia.framework
- CoreGraphics.framework
- libc++.tbd
- UIKit.framework
- AVFoundation.framework
- Foundation.framework
- 说明:以上库加入一次即可.、
调用
- 三个方法:
唯一类: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:
- assets下的tenlinev2.model
- jniLibs/arm64-v8a下的libTenLineJni.so
- jniLibs/armeabi-v7a下的libTenLineJni.so
IOS:
- tnn.framework
- TenLineSegmnetFramework.framework
- tnn.metallib
- TEN_LINE_IOS.MODEL
- TEN_LINE_IOS.MODEOPROTO
- TenLineFast_ios.MODEL
- 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错误.
常见为:没有设置surface或surface已经被释放
6.7、错误码:1206
容器宽高设置过低的错误.
分辨率设置小于320x320,则会抛出此错误信息
6.8、错误码:1207
当前图层错误.
建议拿到错误信息日志后,分析是哪里的问题.