图层容器SDK说明

15
发表时间:2023-06-07 08:40

一、图层容器说明

名词解释

  1. 图像源:我们把外面的所有输入统称为图像源,比如图片、视频,网络视频、GIF,UI界面、RGBA、NV21、Surface等可以显示出来的,统称为图像源;(文字需要先转换为图像才可以显示,比如bitmap等),如果图像源是路径,我们是同一个接口(switchPath),内部通过路径的后缀名判断是图片或视频或gif;

  1. 图层容器:是一个线程,内部运行OpenGLES语境,并可以设置绘制宽高,可以增加,删除,修改图层位置大小的一个容器, 之所以称之为容器,是因为他有宽度和高度,并可以让您自由的增加一层一层的画面,每增加一个一层,我们称之为一个图层,并指定图层的位置,类似一个画布;我们设计了两个容器类, LSOCameraLive和LSOLayerRender, 两者的的图层完全一致,是工作性能的优化方向不同, LSOCameraLive侧重点是预览显示,一般用在APP场合;LSOLayerRender侧重点是图像数据引出,一般用在直播机场合;

  1. 图层:是我们设计的一种图像显示形式,也是一个类, 类似UI中的一个控件,可以增加多个,可以实时增删,每增加一个,即是一层,比如您增加10个,则是增加了10层,则会返回10个图层对象;增加后, 这些图层里面因为没有图像源,所以不会显示; 你需要给每个图层设置一个图像源,才会显示出来, 一个图层可以不断的切换不同图像源。

  1. 一句话总结:容器里可以放多个图层(addForegroundLayer), 每个图层里可以切换多个图像源(switchxxx);

LSOLayerRender类的输出说明

  • 提供了输出窗口(DisplayView)让您把每个图层对象指定到什么地方去显示。

  • 最后合成后的 图像输出通过异步监听回调引出,可输出yuv420/nv21/nv12/rgba。

  • 比如您增加了一个显示窗口DisplayView,并给这个窗口指定了几个图层对象来显示,则几个图层的画面就会显示到这个DisplayView上; 指定图层参数是一个List列表数组,你先向List中增加的图层,则显示在最下层; 后面增加到List中的图层则显示到最上层, 你可以不断的更新List中图层的顺序,从而调整每个图层在当前窗口中的显示前后,也可以不断的增减List中图层的数量。

  • Java版本可以增加多个这样的DisplayView,最大可增加5个;

  • Java版本容器中的一个图层, 可同时显示在不同的窗口上;

  • 如果您没有增加图层或者所有的图层都释放了,只要设置了窗口或数据流,则也会有输出, 因没有任何的图层,这时会输出黑色的图像,图像的宽高等于容器的宽高;

  • 对于已经增加到容器中的图层, 如果您确定已经用不到了,则可以用releaseLayer把这个图层从容器里释放,比如展示过的图片、视频等。

能力受限

  • 视频最大分辨率:4K视频, 小于等于1080P的视频;内部是通过系统MediaPlayer得到的图像, 需确保Android系统中的MediaPlayer正常工作。

  • gif最大尺寸是: 1280x1280。

  • 图片最大尺寸是:5000x5000,图片如果太大, 会在内部做缩放处理, 内部会调用BitmapFactory去解码,需确保Android系统中的BitmapFactory正常工作。

  • RGBA和NV21: 输入最大是1080x1920,并宽度和高度是4的倍数。

  • Surface图层只支持4k, 2k,和不大于1080P的图像分辨率;

  • 最大叠加图层数:无限制,建议不超过20层。

前景图层操作

  1. 设计思路:

    1. 我们定义的容器中是两种图层类型:即人像前面为前景图层(ForeGround),人像后面是背景图层(BackGround);

    2. 区别:前景图层可以有很多个,背景图层是一个;前景图层可以增加和删除和调节,背景图层无论图像大小都满屏显示,并不可以移动,背景只可以替换,可以没有(如果没有背景,则会把LSOCameraLive这个view的下面的view显示出来, 我们demo有露出底部树叶图片的那个演示);

    3. 人像层也属于前景层的一种, 只是我们默认已经增加好,如果不需要内部的人像层(Camera)可在start()之前,设置setDisableSystemCamera()来禁止内部相机; 禁止后所有和Camera的接口都无法使用;可通过switchSurface来增加外部的相机(demo有举例,搜outsideCamera即可找到);

    4. 前景层可以通过LSOCameraLive的setLayerPosition()调整每个图层的前后位置,默认是先add的图层放下面,后增加的图层放上面;最下面的前景层的index=0;最上面的index=array.size()-1;

    5. 您可以不用我们的背景层和人像层, 则把前景层的一个作为背景, 然后其他前景层在这个背景的上面也可以;

    6. 当前图层数量没有限制, 您可以增加多个前景层,但建议小于20层;图层越多则越耗性能;

    7. 如果您要增加动画或各种UI界面, 建议先把您的动画或UI界面转换为bitmap或rgba, 用bitmap或rgba的形式不断的输入到图层中,switchBitmap或switchRgba可以不断的调用,建议调用的最小间隔是33毫秒一次,最好是大于100毫秒一次;


  2. 增加前景图层流程:

    1. 用LSOCameraLive的addForeGroundLayer()方法增加前景图层对象zsLayer

    2. 用zsLayer的方法switchxxxx()来切换不同的图像源,即给此图层对象设置一个图像源;

    3. 【完毕】

    4. 另外说明:可以在一个图层对象里不断的切换不同的图像源, switchPath的意思是:可输入不同的路径,内部通过后缀名来判断当前是图片或视频或gif, 当前支持的后缀名有: jpg, jpeg,png,mp4,mov,gif;

    5. 另外说明:切换后, 会在同一个位置显示这些图像,如果图像的宽高不同,则会以上一个图像的缩放模式为参考来缩放当前的大小,如果是第一次增加图像,则默认居中显示,并显示宽高是容器的0.6倍,当然也可以在切换状态监听中直接设置当前图像的大小位置角度等信息,设置后会立即改变

    6. 另外说明:设置缩放只会改变当前图层的显示大小,而不会改变图像源的原始大小,即图像源的原始大小在没有切换掉之前始终不变的,切换后如再次获取原始宽高,则是正在显示的图像源的原始宽高;

    7. 另外说明:如果增加的是视频,则在Switch完成后,可通过getVideoController得到要控制播放的各种方法和进度监听;


  3. 释放:图层不需要时,则通过容器的释放图层方法释放掉,释放后不可以再对此图层做任何的操作;

  4. 可以增加多个前景图层对象ZSLayer,每个图层都可以单独调节;

  5. 不建议频繁的增加和释放图层, 如果一个图层使用不到,则可以设置为隐藏setVisibility(),如果频繁的增加和释放图层,则会影响执行性能;

  6. 因为一个图层可以切换不同的素材,故建议容器中的图层数量是3--4个图层, 比如一个背景层(用来切换不同的背景), 一个人像层(用来抠绿等操作),一个前景层(用来不断的切换不同的商品),一个其他前景层。

直播机中图层容器示意图

二、C++图层容器说明

  1. 调用流程:

    1. 创建:调用LSORender_createRender,传递宽高等各种参数创建容器大小,比如1920x1080。

    2. 增加:用LSORender_addLayer向内部增加多个图层,图层有宽高和当前图层是否抠图等参数,增加后得到一个long类型的句柄,后续用这个句柄来调节当前图层的各种参数,比如实时传递图像数据,位置,大小,角度,抠绿抠蓝抠红切换,抠图强度等各种参数,上下层关系,这个句柄就是代表了当前图层的对象;

    3. 送图像:可通过LSORender_layerPushData 向指定的图层里传递图像数据, 在传递时候, 可以切换不同的格式,比如上一帧是rgba,下一帧是nv21并指定角度;

    4. 获取:要获取一帧图像时,通过LSORender_renderOneFrame 触发一帧的渲染,渲染后得到RGBA的图像数据,rgba的是外接分配的指针,指针的总长度是宽度x高度x4;此方法阻塞执行,只到得到一帧数据才返回。

    5. 释放图层: 如果一个图层不需要了,则用LSORender_removeLayer释放,释放后当前图层 已经不可使用,内部的各种参数也随即释放;

    6. 释放容器:通过LSORender_releaseRender释放当前容器, 容器释放后,则所有的图层和各种参数均失效;


  2. 当前支持摄像头的外部EXT类型的纹理, 支持外部播放器的纹理(有举例)

  3. 支持和外界共享glContext。

  4. 支持同一个图层切换不同的图像。


微信公众号:
蓝松文档:
地址:浙江省杭州市余杭区仓前街道龙园路88号3号楼A1318室(创鑫时代广场)