类似FaceU贴纸功能的快速实现:AiyaEffects项目求Star

版权声明:欢迎转载,转载请保留文章出处。 https://blog.csdn.net/junzia/article/details/72853159

自去年Faceu火爆朋友圈,QQ在拍照、视频聊天中加入了动态贴纸的功能之后,妹子们拍照已经不满足于仅仅瘦脸、磨皮、大眼等对图片的处理。于是一个不能加猫耳朵卖萌的手机相机软件,都不好意思说自己是个相机了。那么如何快速让自己的相机快速拥有这种加猫耳朵类似的功能呢?AiyaEffectsSDK会是一个非常不错的选择。先上几张图:
这里写图片描述这里写图片描述这里写图片描述这里写图片描述这里写图片描述

关于 AiyaEffectsSDK

AiyaEffectsSDK是由深圳哎吖科技开发的一套支持美颜,3D特效,3D动画特效,2D特效等,提供免费使用的贴纸类SDK,可用于相机、视频聊天、直播等领域。项目源码部分开源,托管到Github上,欢迎Fork和StarAndroid AiyaEffectsSDK地址IOS AiyaEffectsSDK地址
AiyaEffectsSDK提供免费使用,而且集成方便,你只需要付出极少的时间成本,就可以在你的相机、视频聊天、直播、视频处理等Android或IOS APP中加入炫酷的贴纸功能。
AiyaEffectsDemoAndroid版下载
这里写图片描述

如何使用AiyaEffectsSDK

为使用户快速集成AiyaEffectsSDK功能,AiyaEffectsSDK提供了CameraView和AiyaController两个类。CameraView是使用Camera1 API配合GLSurfaceView提供相机预览功能。而AiyaController只关注对图像流的处理,数据源和视图由用户指定。使用AiyaController也可快速实现CameraView的所有功能。

使用CameraView集成

1、导入Module

使用AiyaEffectsSDK需先导入AiyaEffectsSDK的Module,然后在需要用到AiyaEffectsSDK的项目Module中增加对AiyaEffectsSDK的依赖。
AiyaEffectsSDK已经加入jitpack仓库,用户也可以通过仓库的来集成。利用jitpack仓库集成,需要先在settings.gradle中加入jitpack仓库:

allprojects {
    repositories {
        jcenter()
        maven { url 'https://jitpack.io'}
    }
}

然后在需要使用AiyaEffectsSDK的项目build.gradle中加入对AiyaEffectsSDK的依赖:

compile 'com.github.aiyaapp:AiyaEffectsAndroid:v3.0.0'

2、注册appId,获取appKey

进入官网,申请免费使用AiyaEffectsSDK,注册appId,获取appKey。

3、AndroidManifest.xml文件配置

使用AiyaEffectsSDK,必须在App Module中添加:

<uses-feature android:glEsVersion="0x00020000" android:required="true"/>

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

其他权限需要根据App自身需求添加。Android6.0需要动态申请权限,具体请参照Android官网。

4、初始化

初始化调用AiyaEffects.getInstance().init(final Context context, final String licensePath,final String appKey),第一个参数为App的Context,第二个参数为AiyaEffectsSDK的license文件路径,第三个参数为当前应用的appKey。在初始化过程中,会进行鉴权,若鉴权失败,则AiyaEffectsSDK无法正常运行。所以建议在开始初始化前,为AiyaEffects注册状态监听器,监听初始化状态,示例如下:

 final ActionObserver observer=new ActionObserver() {
      @Override
      public void onAction(Event event) {
          if(event.eventType== Event.RESOURCE_FAILED){
              Log.e("resource failed");
              AiyaEffects.getInstance().unRegisterObserver(this);
          }else if(event.eventType== Event.RESOURCE_READY){
              Log.e("resource ready");
          }else if(event.eventType== Event.INIT_FAILED){
              Log.e("init failed");
              Toast.makeText(LoadActivity.this, "注册失败,请检查网络", Toast.LENGTH_SHORT)
                  .show();
              AiyaEffects.getInstance().unRegisterObserver(this);
          }else if(event.eventType== Event.INIT_SUCCESS){
              Log.e("init success");
              setContentView(R.layout.activity_load);
              AiyaEffects.getInstance().unRegisterObserver(this);
          }
      }
  };
  AiyaEffects.getInstance().registerObserver(observer);
  AiyaEffects.getInstance().init(LoadActivity.this,getExternalFilesDir(null)
      .getAbsolutePath()+"/config","");

常见状态如下:
- INIT_SUCCESS 初始化成功
- RESOURCE_FAILED 资源准备失败
- INIT_FAILED 初始化失败

5、在布局中增加CameraView

<com.aiyaapp.aiya.widget.CameraView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/mSurfaceView" />

6、CameraView实例获取及控制

引入AiyaEffectsSDK module、完成AiyaEffectsSDK的初始化、给应用添加相关权限后、增加CameraView视图后就可以获取CameraView实例,并进行特效处理了。处理示例代码如下:

private void initCameraView(){
    //获取cameraview实例
    mCameraView = (CameraView)findViewById(R.id.mCameraView);
    //设置特效,参数为特效的配置文件路径
    mCameraView.setEffect(effectJsonPath);
    //设置美颜等级0-6,0表示不美颜
    mCameraView.setFairLevel(level);
    //设置回调
    mCameraView.setFrameCallback(bmpWidth,bmpHeight,this);

    //默认使用前置摄像头,此方法可切换摄像头
    //mCameraView.switchCamera();
    //触发拍照回调
    //mCameraView.takePhoto();
    //触发录制回调
    //mCameraView.startRecord();
    //停止录制回调
    //mCameraView.stopRecord();
}

@Override
public void onFrame(final byte[] bytes,long time) {
    if(isTakePhoto){
        //拍照回调
        saveBitmapAsync(bytes,bmpWidth,bmpHeight);
    }else{
        //编码回调
        mEncoder.feedData(bytes,time);
    }
}

@Override
protected void onResume() {
    super.onResume();
    if(mCameraView!=null){
        mCameraView.onResume();
    }
}

@Override
protected void onPause() {
    super.onPause();
    if(mCameraView!=null){
        mCameraView.onPause();
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if(mCameraView!=null){
        mCameraView.onDestroy();
    }
}

使用AiyaController集成

使用AiyaController集成与使用CameraView类似,前四步完全一样。相对CameraView,AiyaController更加灵活。初始化AiyaEffectsSDK后,集成AiyaController的步骤如下:

1、提供数据源

AiyaController可以接受以SurfaceTexture共享出来的数据流,在Demo中,提供了包括Camera1 API、Camera2 API、视频流三类数据源示例,分别为Camera1Model、Camera2Model和MediaModel。用户可直接使用,也可以根据它们的实现自行定制。它们所做的工作主要为:

  • 1、 实现Renderer。
private class SampleRender implements Renderer{
        @Override
        public void onDestroy() {
            //在此处释放销毁数据源
        }

        @Override
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            //在此处创建数据源
            //......
            //务必在此处设置将数据源中图像的大小告知AiyaController
            //controller.setDataSize(width,height);
            //对于相机需要将相机ID作为ImageDirection告知AiyaController
            //controller.setImageDirection(cameraId);
        }

        @Override
        public void onSurfaceChanged(GL10 gl, int width, int height) {
            //数据源图像大小改变
        }

        @Override
        public void onDrawFrame(GL10 gl) {
            //如果数据需要回收利用,在此处执行
        }
}
  • 2、将Renderer的实例设置给Controller:
mRenderer=new SampleRender();
controller.setRenderer(mRenderer)

2、准备接收处理后数据的视窗

AiyaController给图像流增加特效、美颜处理后的,会将数据输出出来。接收输出的对象可以为Surface、SurfaceTexture、SurfaceHodler或者TextureView。这些对象可以通过Java代码new,也可以在布局中增加相关视图来获得。

3、使用AiyaController处理数据并展示

以Camera1Model提供数据、SurfaceView展示处理结果为例。取得SurfaceView后,通过getHolder()方法,取得SurfaceView的SurfaceHolder。然后给SurfaceHolder增加回调,并在回调中,做相应处理:

//实例化AiyaController
mAiyaController=new AiyaController(SurfaceHolderActivity.this);
//设置AiyaController的回调,用于获取增加特效后的图像数据
mAiyaController.setFrameCallback(bmpWidth,bmpHeight,SurfaceHolderActivity.this);
//实例化数据源
mCamera1Model=new Camera1Model();
mSurfaceView= (SurfaceView)findViewById(R.id.mSurfaceView);
//取得展示视窗,并增加监听,在监听中调用AiyaController相关方法
mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mNowHolder=holder;
        mAiyaController.surfaceCreated(holder);
        mAiyaModel.attachToController(mAiyaController);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        mWidth=width;
        mHeight=height;
        mAiyaController.surfaceChanged(width, height);
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        mAiyaController.surfaceDestroyed();
        mNowHolder=null;
    }
});

4、生命周期相关处理

同使用SurfaceView、GLSurfaceView类似,使用AiyaController也需要根据Activity或者Fragment等的生命周期,做相应的处理:

@Override
protected void onResume() {
    super.onResume();
    if(mAiyaController!=null){
        mAiyaController.onResume();
    }
}

@Override
protected void onPause() {
    super.onPause();
    if (mAiyaController!=null){
        mAiyaController.onPause();
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if(mAiyaController!=null){
        mAiyaController.destroy();
    }
}

5、其他处理

AiyaController更多API:

//设置特效
public void setEffect(String effect);
//设置美颜等级,0-6
public void setFairLevel(int level);
//视图大小和数据源图像大小不同时,图像的展示方式
public void setShowType(int type);
//设置处理完成后的回调和回调图像的大小
public void setFrameCallback(int width,int height,FrameCallback frameCallback);
//开始持续回调,录制、推流等使用
public void startRecord();
//停止持续回调
public void stopRecord();
//回调一帧数据,拍照、截屏等使用
public void takePhoto();

高级使用

  1. 自定义滤镜
    在AiyaController和CameraView中可以使用自定义滤镜来实现更多功能,AiyaEffectsSDK滤镜基类为AFilter,存在包com.aiyaapp.camera.sdk.filter之下。AiyaEffectsSDK中包含了水印滤镜、黑白滤镜、美颜滤镜的示例。需要自定义滤镜,可参照Beauty、GrayFilter、WaterMarkFilter等类进行实现。

  2. 使用自定义滤镜
    在使用AiyaController或者CameraView时,如果希望在预览和输出中增加其他元素,比如自定义美颜滤镜、复古滤镜、水印等可调用:

/**
 * 增加滤镜
 * @param filter 滤镜
 * @param isBeforeProcess 滤镜是否在加特效前增加
 */
public void addFilter(AFilter filter,boolean isBeforeProcess);

第二个参数为true还是false视需求而定,通常美颜滤镜之类的滤镜为true,水印之类的滤镜为false。

猜你喜欢

转载自blog.csdn.net/junzia/article/details/72853159
今日推荐