绿幕抠图的使用说明

提供两种形式.

方式1: 业务功能型

  • 完整的拍摄,抠图,叠加背景/前景,多机位,网络流输入, 最后图像输出等一整套直播采集图像解决方案API
  • 对应的类是:LSOCameraLive;是一个容器类, 内部把系统的Camera封装为一个图层, 把背景图片/视频,前景图片等封装为一个一个的图层, 然后每个图层都可以设置抠绿调节等;最后输出图像流.
  • LSOCameraLive类每个API说明见下面;
  • 演示代码在:GreenMattingLiveActivity.java(android) / ios是:LSOLiveBroadController.m(IOS)

形式2: 纯净API类型

  • 一个类:LSOGreenMatting
  • 使用方法是:
//工作在opengles中, 纹理输入+ 宽度+高度输入, 内部抠图后, 以纹理的形式返回.
public int renderOnGPU(Context context, int textureId, int width, int height)

集成说明

  • 见我们的A2文档的sdk集成说明,大致是:android是import LanSongSDK module; ios是把LanSongSDK拖入到您工程里.

常见问答

1. 如何支持多机位.
  • 我们提供了多个输入接口, 让你把外面的图像数据实时的输入到SDK里.
  • android系统常见的有:MediaPlayer播放器, ijkplayer, usb摄像头, MediaCodec接口等 这些接口都有一个API叫 setSurface, 意思是设置一个图像输入口, 我们SDK提供了一个创建surface的可与之匹配.把我们创建好的surface设置到这些播放控件中, 即可把外面的图像数据引入到我们SDK中.
  • 接入后,我们把多机位的控制分为两部分, 播放控制和图像画面控制, 播放控制是在外面完成, SDK因只传递了画面进来, 故需要用您的控件来控制播放流的各种动作,比如暂停/调速,切换等; 对图像画面的显示位置,显示大小,是否抠绿等的调节, 是在SDK内部完成的.
  • 现在支持的有MediaPlayer, ijkPlayer, MediaCodec, USB摄像头-uvc格式.
  • USB摄像头举例代码如下:
//增加一个图层到容器里,可增加多层,返回这一次的控制对象LSOCamLayer
 usbUvcLayer=lsoCamera.addSurfaceLayer(width ,height, true, 0);
                if(usbUvcLayer!=null){
                //图层对象获取到surface设置到usb播放控件中
                    uvcCameraHandler.startPreview( usbUvcLayer.getSurface());
                    //图层设置抠绿功能
                    usbUvcLayer.setGreenMatting(LSOSegmentType.GREEN_MATTING);
                }
// 可增加多层, 并有removeLayer()删除这个图层. 
  • 视频播放器MediaPlayer的举例:
MediaPlayer mediaPlayer=null;
    private void addMediaPlayer(){
        if(mediaPlayer==null){
            mediaPlayer=new MediaPlayer();
            try {
                mediaPlayer.setDataSource(CopyFileFromAssets.copyAssets(getApplicationContext(),"bg.mp4"));
                mediaPlayer.prepare();

                LSOCamLayer layer=lsoCamera.addSurfaceLayer(mediaPlayer.getVideoWidth(),mediaPlayer.getVideoHeight(),true,0);
                if(layer!=null){
                    mediaPlayer.setSurface(layer.getSurface());
                }
                mediaPlayer.start();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    // 可增加多层, 并有removeLayer()删除这个图层.
  • ios系统常见的是AVPlayer, 此控件支持网络url数据流, 只需要设置好URL的路径, 即可播放.
  • 如果需求是大于2个机位,则可以调节每个位置在上层或下层, 也可以调节缩放每个机位的话, 并上下左右平面布局;
2. 如何支持合流
  • 如果是外面输入的图像流,则类似我们说的多机位.
  • 如果是自定义的UI界面, 想叠加到图像中,则我们也支持的. 我们提供了一个UI控件容器, 你把您的各种控件增加到此容器中即可. 比如android, 我们提供了LSORelativeLayout, ios提供了UIView, 可以让您把很多文本/按钮,动画等绘制到此根view中. 绘制后, 会在推流的时候, 合并为同一个图像输出;
3. 绿色物体不想被抠去怎么办?
  • 有两个方法. 1. 背景用蓝布或红布; 2. 区域保护.
  • 背景用蓝布或红布: 步骤是把背景换成一块蓝布或红布, 然后在SDK里设置抠蓝色或红色即可.
  • 区域保护: 可设置图像画面中某个区域,不被抠去. 比如产品是固定在左下方,则把图像的左下方设置为不被抠去的地方即可.
4. 如何推流
  • 我们提供了引出图像的方法, android可引出NV21格式或RGBA格式的图像, ios引出的图像格式是:bgra或CVImageBufferRef, 并均支持在引出过程中,设置图像的宽高.
  • 输出的图像数据, 是在内部已经叠加成一帧图像;
  • 拿到这些图像数据后, 可设置到推流SDK或外部使用.
5. 如何外接美颜
  • 我们演示demo里已经接入了相芯的美颜SDK,
  • 如果你要接入别家SDK,也支持的, android的图像以纹理的形式引出, ios以sampeBuffer形式引出.
  • 可参考我们的代码, 把输入的图像,经过别家SDK,把美颜的结果一纹理或数据的格式返回即可.
6. 如何自定义界面.
  • 我们提供了最简单的抠绿工程:
  • android 下载:https://github.com/LanSoSdk/android_green_matting
  • ios下载地址:https://github.com/LanSoSdk/ios_green_matting
  • 以上工程, 是以最少的代码,演示了抠绿的效果. 您可以把演示代码拷贝过去, 然后在此基础上开发您的界面.
  • 最简单的演示和我们完整工程的演示, 用的是同一份SDK, 只是一个简单易读, 一个功能演示丰富.
7. 预置点和 蓝牙键盘支持吗?
  • 全面支持
  • 具体是: 你可以拿到每一层画面的控制对象, 根据此对象, 你可以设置此画面在任意位置/任意宽高/任意角度显示,并可以设置是否抠图等;
  • 我们演示demo里有蓝牙键盘的控制代码, 这些都是开源的, 修改对应的判断语句即可自定义
8.实际直播场景要注意哪些?
  • 不要距离绿布太近, 如果太近,绿布在灯光的照射下,会反光到人或物体上, SDK的抠绿原理可想象为判断每个像素是否是绿色, 如果是绿色则抠去, 这样的话,一些反射到人或物体上的绿色,就会被抠去.
  • 调节办法是: 先关闭绿幕抠图功能, 一个人或物体站在绿布前面, 另一个人调节灯光强弱和调节距离绿幕的远近, 以人或物体的表面没有反光为好. 可配合我们的抠绿强度调节.

美颜接口

android
  • android 的接口如下, 工作在内部opengles2.0纹理语境中.
  • 对应的演示代码在GreenMattingLiveActivity中的startCamera方法中.
public interface OnLayerTextureOutListener {

    /**
     * 引出的纹理 工作在内部的OpengGLES线程中.
     * 没有创建方法, 如果你需要创建,则在这个方法中初始化您的参数.
     *
     * @param textureId 纹理, sample2D格式, 此纹理是图像流的fbo用到的纹理, 返回的也是fbo用到的纹理.
     * @param width 纹理的宽度
     * @param height 纹理的高度;
     * @return 返回处理后的纹理. 返回需要sample2D格式的纹理. 如果不需要执行此方法(比如关闭美颜等),则返回-1;
     */
    int textureProcessOnGPU(int textureId, int width,int height);

    /**
     * 释放纹理, 在整个图层释放时, 释放
     */
    void onReleaseOnGPU();
}


iOS
  • ios的接口接口如下,只有一个方法, 外部处理完毕后, 返回的数据放到同一个对象sampleBuffer中. 格式是RGBA.
  • 对应的演示代码在LSOLiveBroadController.m中的 startPreview中.
@property(nonatomic, copy) void(^cameraSampleBufferBlock)(CMSampleBufferRef sampleBuffer);

推流接口

Android
  • 引出的是是NV21格式的图像数据.
/**
     *
     * 引出图像数据.
     * 宽高建议不要大于1080P, 不然读取数据会卡顿;
     * @param width 数据的缩放到的宽度,内部会缩放到16的倍数
     * @param height 数据缩放到的高度,内部会缩放到16的倍数
     * @param listener 引出数据监听, 工作在内部的opengles线程中.
     */
    public void  setOnPlayerDataOutListener(int width, int height, OnPlayerDataOutListener listener){
        if(render!=null){
            render.setOnPlayerDataOutListener(width,height,listener);
        }
    }
    
    //其中 OnPlayerDataOutListener参数说明:
    public interface OnPlayerDataOutListener {

    /**
     * 播放容器的输出的图像
     * @param nv21 nv21格式的数据
     * @param width 宽度
     * @param height 高度
     * @param ptsUs 当前时间戳.(暂时没有用到)
     */
    void onFrameNv21(byte[] nv21, int width, int height, long ptsUs);

}

iOS
  • 在LSOCameraView.h中, 引出的 数据格式是kCVPixelFormatType_32BGRA
/**
 设置的输出数据的大小, 仅可设置一次, 并且宽高等于16的倍数, 建议是720x1280;或1080x1920
 */
@property (nonatomic, assign) CGSize outDataSize;


/**
 设置outDataSize后, 每一帧都会通过这个block输出,工作在其他线程;
 输出的格式是: kCVPixelFormatType_32BGRA ; 宽高是设置的outDataSize
 len: 等于outDataSize.width * outDataSize.height *4;
 bgraPtr 是内部使用, 外部不要释放;
 */
@property(nonatomic, copy) void(^frameDataOutBlock)(int len , void *bgraPtr);

纯净API说明

一个类 LSOGreenMatting

获取对象

LSOGreenMatting greenMatting=LSOGreenMatting.getInstance();

抠图渲染

   /**
     * 执行绿幕抠图
     * 此方法工作在opengles语境中.
     *
     * @param context android的Context的语境 可以是getApplicationContext()
     * @param textureId sample2D类型的纹理, 建议是fbo渲染后的.
     * @param width 纹理的宽度
     * @param height 纹理的高度
     * @return 返回渲染后的纹理
     */
    public int renderOnGPU(Context context, int textureId, int width, int height);
    
    
    
    /**
     * 释放纹理
     */
    public void releaseOnGPU();
    

外部控制调节

//设置开启抠像
public void setGreenMatting();


//设置抠像强度,范围0--100;
public void setGreenMattingLevel(int level);


//获取抠像强度;
public int getGreenMattingLevel();


/**
 * 颜色保护的最大值.
 */
public void setGreenMattingHoldValue(int max);


/**
 * 颜色保护范围;
 * @param min 颜色保护的最小值 最小建议是0
 * @param max 颜色保护的最大值. 建议不超过100;
 */
public void setGreenMattingColorHoldRange(int min,int max);
 

LSOCameraLive的API说明

  • android版本:

  • LSOCameraLive.java类是开放的, 在LanSongSDK文件夹的下的src/main/com.lansosdk.videoeditor下.

  • 代码的每个API有对应的接口, 这里不再列举.

  • ios版本:

  • LSOCameraLive.h在LANSongEditorFramework.framework下的Headers中.

  • 代码的每个API有对应的接口, 这里不再列举.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值