一:集成
android端
-
我们的SDK以module的形式提供, 在你的项目中点击File/import midule导入,并在您主module中的build.gradle中增加implementation project(':LanSongSDK')
-
LanSongSDK module下的assets下有LanSongIFxxx开头滤镜用到的各种图片资源, 如您项目没有用到LanSongIFxxx开头的滤镜,则可以删除。
-
其他的代码,各种资源,各种视频素材等均为演示所用,不属于sdk的一部分。
-
授权和混淆,在我们提供的另一个文档中.
-
代码使用
初始化:
1.LanSoEditor.initSDK(getApplicationContext(), null); // 初始化SDK.[必须] (null时,APP名字一定是我们demo名字)
2.LanSoEditor.setTempFileDir(); //设置SDK处理过程中的临时文件缓存路径 [可选]
3.LanSoEditor.setSDKLogOutListener //设置日志输出监听 [可选].
使用流程[仅参考]:
1.明白我们SDK的各种DrawPadxxx图层的意思, 各种xxxLayer图层的意思.和容器里放图片,类似合成里放图层一样的思想.
2.先在我们demo上运行您要的各种演示功能, 然后拷贝我们的相关demo代码,各种Activity.java, 在您的工程里运行一遍.
3.我们每个Activity.java都有注释, 并尽量简单清晰. 您明白大概流程后, 整合归纳成您自己的代码.
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的一部分。
-
如果您选择ios设备中的视频,则应该先拷贝到沙盒里,然后再用我们SDK处理.我们SDK提供了拷贝的方法LSOEditMode. 拷贝后再处理.
-
代码使用
初始化
1. [LanSongEditor initSDK:nil]//初始化SDK [必须] (nil时,APP名字一定是我们demo名字)
2. [LanSongEditor setTempFileDir:@"xxx"]; //设置SDK的临时文件路径 [可选]
使用流程[仅参考]:
1.明白我们SDK的各种DrawPad/Layer的意思. 我们每个公开类的注释,都在对应的.h头文件里, 您可以简单看下.
2.先在我们demo上运行您要的各种演示功能, 然后拷贝我们的相关demo代码,各种Activity.java, 在您的工程里运行一遍.
3.我们每个Activity.java都有注释, 并尽量简单清晰. 您明白大概流程后, 整合归纳成您自己的代码.
二:API的命名方式
-
我们尽量把常见的处理用一个类来表示:VideoOneDo.比如视频裁剪时长,裁剪画面,缩放,增加图片/文字,增加滤镜,压缩,增加封面,增加背景音乐等,让您一次性执行.
-
所有以DrawPad开头的都是视频容器;AudioPad开头的是音频容器;BitmapPad开头的是图片容器;
-
所有以xxxLayer或xxxPen的类(ios版本用pen表示),都是图层, 图层个独立的一层,两层之间互不干扰, 您执行一次addxxxLayer/addxxxPen就增加一层, 执行removexxxLayer
就删除一层, 在执行addxxxLayer/Pen后返回给你一个图层对象,利用图层对象,您可以做所有图层的操作,比如图层继承自父类Layer/Pen, 可以移动/缩放/旋转/滤镜/区域显示/
-
隐藏/镜像/增删子图层/美颜/亮暗调节/圆形显示等操作.
-
所有以executeXXX开头的各种方法或函数,都是阻塞执行的方法,只有当前方法执行完毕后,才执行下一行代码;
-
我们尽量做到:
1.所有以addxxxLayer开头的, 都可以执行多次;执行一次,则增加一个图层
2.所有以remove开头的,都是删除;
3.所有以set开头的, 都是设置一个参数,如果多次设置,则覆盖上一次的设置参数.
4.所有以get开头的, 都是获取一个参数, 多次获取根据每个方法名字而定, 如果有getNextXXX,则表示依次获取.
功能用到的英文单词:
-
video:视频 videoLayer视频图层
-
audio:音频 audioLayer 音频图层
-
cut:裁剪视频时长crop:裁剪画面/scale:缩放/Rotate:旋转/Adjust:调节/visible:可视/hiden:隐藏/switch:切换(比如切换图片,切换滤镜)/
-
Extract:提取/convert:转换/position:位置/merge:合并/speed:速度/FrameRate:帧率/BitRate:码率/reverse:倒序/Layout:布局;
-
cover 封面; overlay:叠加 类似一层一层的叠加.
-
logo:水印
-
concat 拼接.
-
您可以通过在我们demo中搜索这些单词,来找到我们的对应的各种功能.
二:SDK由三部分组成
第一部分. 容器和图层(DrawPad):
-
视频容器 向容器里增加各种图层, 对图层进行任意的增删调节, 从而实现你们特定的需求。
-
工作原理类似Photoshop的图层处理或Adobe After Effect软件的图层处理。
-
对应的图层有:
-
CameraLayer 摄像头图层.
-
VideoLayer(视频图层),
-
BitmapLayer(图片图层),
-
ViewLayer(android/ios中的UI图层),
-
MVLayer(有透明通道的视频图层),
-
CanvasLayer(Android的绘制Canvas类封装为一个图层,IOS的UIView本身就可以工作在异步线程,只需要UI图层既可.),
-
DataLayer(输入的RGBA的数据,您如果有别的数据,比如BPG或自己定义的图像数据,也可以根据这个输入)
-
GifLayer,YUVLayer,纹理图层,双视频图层等等, (IOS中用Pen来表示)
-
-
您可以认为:所有的素材都是一层一层铺上去的。
-
容器回调: 有每一帧进度回调,完成回调, 错误回调,截图回调,拉流回调(把每一帧拉出来).
-
音频容器: AudioPadExecute.后台执行, 把各种声音增加到音频容器里,可以指定在特定时间段内增加,增加音频的多长,在addSubAudio后,会得到一个AudioSource对象,
-
通过这个对象,可以设置声音的音量,是否循环,是否静音,声音暂停,声音重复,声音快慢,声音的频率和幅度调整(变声,萝莉,大叔声音)等.
-
图片容器:前台执行,是从视频容器演变而来,用来把各种图层编辑好后, 输出为一张图片.有具体的举例.
-
Ae模板特效:Ae模板实际也是容器和图层的一种扩展,因Ae太强大,可以做各种炫酷的效果,特说明一下。流程是:设计师用Adobe After Effect做好各种视频动画,
-
比如炫酷视频,文艺/搞笑的场景,相册效果等,根据我们的指导文件导出。蓝松SDK会解析导出的文件,自动还原成AE设计时的动画效果;
-
无需开发者再一帧一帧的绘制,开发者只需要做的是:引导用户选择素材,然后替换即可,执行后,即可得到用户自己的效果。
第二部分. VideoEditor/AudioEditor:
-
用来处理常见的功能,比如 替换背景音乐,获取音视频,裁剪,剪切,分离,拼接,合并,音频调节,视频转码,压缩,倒序,加减速等工作。这些常见的功能,
-
用VideoEditor即可完成,不用容器+图层的架构,当然用图层架构也可以。
-
使用说明:在VideoEditor是对视频做处理,AudioEditor是对音频做处理.每个方法都是直接阻塞执行.建议在您的主线程中创建VideoEditor/AudioEditor对象,并设置进度回调,
-
然后在其他线程执行executeXXX;
-
VideoEditor/AudioEditor,不可以多个同时执行,因为大部分手机只有一个编解码器;
-
建议:对于需要视频编码的功能, 推荐用我们的 容器+图层的架构,VideoEditor作为补充和特定个别功能使用,因为GPU对图像的处理速度比ffmpeg的软处理速度快百倍.
第三部分. 辅助和各种特定功能类:
-
LanSongFileUtil:视频编辑会产生一些临时文件, 用此类中的各种静态方法操作,临时文件会在处理完毕后删除.
-
MediaInfo : 用来获取当前视频的一些信息, 比如宽度,高度,时长,帧率,码率,旋转角度,是否是视频,是否有音频,是否有B帧。给视频编辑做参考使用。
-
ExtractVideoFrame : 获取视频里的每一帧, 异步处理,可以获取全部,也可以间隔几帧获取.我们的举例在DisplayFramesActivity和ExtractVideoFrameDemoActivity.
-
各种以LanSongxxx开头的类,特定功能的类;
-
ios的一些特定功能包含在LanSongEditorFramework/LanSongEditor.h中, 并在LanSongEditor.h里针对每个头文件进行的简单说明,
-
点击进去就可以看到使用,并在每个具体类的最下面有注释的使用举例代码,这里不再介绍.
三:错误查找.
-
看打印信息. 在您设置SDK内部log信息执行回调后,SDK执行时会把所有的Log信息给您, 你可以分析原因或发送给我们.
-
MediaInfo.checkFile:大部分的错误是输入文件路径错误导致的, 您在增加路径的上一行增加MediaInfo.checkFile("你的完成路径");从而打印
-
在我们demo上测试.
-
向我们发送所有的打印信息, 从initSDK初始化,到出错的地方的所有log信息,
-
不要这是一句话或一个视频发过来,让我们看为什么,因为不了解你的场景,很可能彼此需要好长时间沟通
-
四:图层说明
所有的图层继承自父类图层.
父类图层支持的功能有
-
移动 -------->注释:我们设计了一个容器, 你可以把素材放到容器里 , 从而调整素材在容器中的位置.
-
缩放 --------->注释: 同移动属性
-
旋转 ---------->注释:同移动属性;
-
RGBA和透明度调节
-
隐藏
-
设置显示时间段
-
单一滤镜
-
同时设置多个滤镜,滤镜级联
-
图片遮罩,支持半透明,从而形成融合的效果;
-
画面镜像
-
区域显示
-
圆形显示
-
获取图层宽高 , 获取 容器宽高.
-
创建子图层 (Android 的视频图层 和Camera图层支持 . ios所有图层都支持)
位置(移动)属性
-
DrawPad的宽高是以像素为单位的, 比如宽度是1280,高度是720,则容器横向坐标有1280个像素,纵向坐标有720个像素点.
-
当前android的UI界面是像素为单位,但ios的UI界面是以点为单位,请注意.
-
移动在实质是通过实时的设置每一帧的位置来实现的, 通过不同位置,随着时间的走动,就有了移动的效果;
-
当一个图层放到容器中, 默认位置是容器的中心点,XY坐标是:getPadWidth()/2; getPadHeight()/2
-
设置图层的位置, 是设置图层中心点的位置, 注意!!!不是左上角;
-
如果你要把图层移动到左上方,则设置的位置是:getLayerWidth()/2; getLayerHeight()/2;
-
如果你要把图层从容器的最左侧移动到最右侧消失:则android代码是(ios类似):
//容器的X坐标最左侧是0; Y坐标最上侧为0;float percent=progress *1.0f/100f;//百分比;
float posX=(videoLayer.getPadWidth()+videoLayer.getLayerWidth())*percent -videoLayer.getLayerWidth()/2;
videoLayer.setPosition((int)posX, videoLayer.getPositionY());
缩放属性
-
当一个图层放到容器中, 拿到图层对象,你再次的设置就是对图层的设置,图层设置不会改变原有素材的尺寸;只是改变的图层尺寸;
-
和您把一张图片放到UI上,拿到ImageView对象,再次操作图片,则是对ImageView进行的操作,和图片本身已经没有关系。
-
缩放的是当前图层的宽高,而不是原素材的宽高,
-
缩放方法1:setScale(); 同时缩放视频的宽高;参数是缩放系数,如setScale(0.5f)则是缩放0.5倍;3.5f则是缩放3.5倍;
-
理论是缩放没有限制;建议范围在0.01--10.0之间
-
缩放方法2:setScale(float,float); 分别对图层的宽高进行缩放;
-
缩放方法3: setScaleValue(int ,int);直接缩放到具体的目标值,比如缩放到容器宽高:setScaleValue(getPadWidth(),getPadHeight());
-
图层缩放是以当前图层的中心为缩放的中心点;
-
通过getScaleX/getScaleWidth/getScaleY/getScaleHeight获取到缩放后的值;
-
缩放设置后,不会对图层原大小有影响;即getLayerWidth和getLayerHeight不变。
旋转属性:
-
旋转以中心点做旋转中心;
-
旋转是顺时针旋转;0--360度;
具体图层的另外支持功能
图片图层:
-
-
支持切换图片.
视频图层
-
支持倒序, 精确定位, 画面裁剪,画面缩放,循环.
MV图层
-
我们定义的一种透明动画视频, 可根据我们的制作说明,把您的各种动画素材做为一层,叠加在别 的 层上面.
-
支持当 走到文件尾的时候, 设置是否循环/停留最后一帧/消失;
-
默认是循环
GIF图层
-
支持apk自带 gif和外面 绝对路径的gif.
-
GIF默认自动播放.
Canvas图层/UIView图层
-
Android 端你可以向容器 中 增加一个Canvas, 从而形成一个 Canvas图层 , 您在拿到Canvas对象后, 做各种绘制.
-
IOS端 ,您可以增加 一个 UIView图层, 并绘制您的各种UIView画面.
ViewLayer (UI图层)
-
如果您有录制容器的需求,您可以把您的UI界面叠加到容器里, 比如在视频图层上面,从而您的 各种绘制,都会实时的录制下来.
-
比如 电子白板 ,教育行业 等.
Camera图层
-
相机图层, 用来录制视频.具体见我们的CameraLayer类.
-
五:子图层和声音图层
-
子图层是拷贝当前图层的画面,而形成完全独立的一个图层,继承自父类图层,支持父类图层的所有方法;
-
主图层在容器里是相互独立的图层。用来给子图层做一些特效使用,比如我们举例的灵魂出窍,错位,多画面显示,局部静止,录制时的实时滤镜效果等等,
-
子图层支持在任意时刻增删,移动,缩放,旋转图层操作。
-
当前Android版本的摄像头图层和 视频图层 支持子图层,子图层支持实时切换滤镜。
-
当前IOS版本的所有图层都支持 子图层,子图层支持实时切换滤镜。
-
声音在我们SDK也是一层, 你在addAudioLayer后,会得到一个AudioLayer,可以多次增加,类似多个音频叠加在在一起,可以设置把声音的某段叠加到某个位置.
六: AE模板
-
AE软件:是指Adobe公司出的一款视频编辑软件,(PhotoShop就是他们的),用来做视频动画, 目前绝大部分的视频动画都是此软件创建而成,
-
你们可以根据这个软件设计好各种动画效果,然后根据我们的插件,把您的动画导出为SDK支持的格式。在手机端,我们SDK会根据导出文件来还原之前的AE效果。
-
当前大部分的手机编辑APP,都是事先做好各种动画效果,让用户选择图片,编辑文字,选择视频,选择声音,然后在APP中处理,
-
从而得到各式各样的视频效果。而Ae模板我们认为是最简单最快速的替换方法。
-
android或ios开发者不需要再重复的写各种动画代码, Ae设计师直接在PC端设计好动画效果,用我们提供的插件导出。
-
开发者在手机端拿到导出文件,送到SDK中,SDK即会还原出各种效果。开发者只需要做引导用户选择图片,视频,声音、文字,然后调用我们SDK即可。
-
比较传统的绘制动画,AE模板具有:扩展性好,灵活,开发者节省大量的绘制时间,android和ios两端的动画能统一一致。
-
Ae设计师无论做多少种动画效果,开发者只需要一套代码即可完成。
-
android/ios开发者可以对Ae模板做的有:替换Ae模板中的声音,图片,文字,视频,变速,得到所有的文本、图片资源,得到所有的图片图层,
-
可在SDK处理Ae模板时,对图片,视频做实时的修改编辑;后期增加 得到每一帧的资源位置和每一帧的变换信息.
-
android和ios都支持实时预览和 后台处理。
-
更多资料, 请参考我们的<<F5蓝松SDK-Ae模板设置规范和相关介绍.PDF>>
七: 时间单位
-
android用到两种时间单位:float类型和long类型;float类型是秒,long类型是微秒,
-
1秒等于1000*1000微秒;所有时间参数是float类型,即为秒;所有时间参数是long类型,则是微秒;
-
ios用到一种单位:CGFloat类型, 浮点类型,单位秒;
-
视频在编码中, 我们默认是一秒钟一个IDR帧;
八:滤镜和美颜
-
提供了大概80多种常见滤镜,包括常用的IFxxx开头的滤镜
-
每个滤镜都可以实时切换,精确到每一帧;
-
当前版本android中的滤镜在一个图层容器中使用后,会销毁内部的各种参数, 不能再次放入另一个容器中使用;
-
ios版本的滤镜对象,在前台容器使用后,可以放入后台容器中使用
-
android的录制视频过程中,支持实时滑动切换滤镜.
-
滤镜属于父类图层的方法, 你可以实时切换单个滤镜,也可以替换多个滤镜.方法:switchFilterTo()是切换单个滤镜,switchFilterList是切换多个滤镜;
-
每次在切换滤镜的时候, 都要重新创建一个新的滤镜,传递到switchXXX中,不要用已经存在的滤镜对象 ,实际的代码中,你可以用一个map或方法来管理您的多个滤镜.