快速入门

本文介绍美颜特效产品对应的OrangeFilter Android SDK 1.4.0及以上版本接入和使用其渲染特效的流程。

开发环境要求:

  • Android Studio 2.0及以上。
  • Android 4.0 (SDK API 14+)以上。

引入 OrangeFilter 库 及 OrangeHelper类文件

1.获取OrangeFilter SDK 和 OrangeHelper类文件、授权序列号。

OrangeFilter Android SDK 以 Android Studio aar 库的形式提供,库文件在 SDK 压缩包 android/lib/orangefilterpub_android-x.x.x.aar(x.x.x表示版本号)

(Android OrangeFilterSDK内部打包了AI模型数据,引擎第一次启动时会自行解压资源。用户升级OrangeFilterSDK时,需要在app层自行清理老版本SDK数据缓存,避免缓存数据可能导致的错误,缓存路径为创建SDK时输入的资源路径)

2.将 orangefilterpub_android-x.x.x.aar 拷贝到 app 模块目录 libs 文件夹内,将OrangeHelper类文件引入到项目。

3.添加库依赖,在 app 模块的 build.gradle 文件中加入库依赖:

dependencies {
    ...
    implementation fileTree(dir: 'libs', include: ['*.aar'])
}

4.AndroidManifest.xml增加权限

<uses-permission android:name="android.permission.CAMERA"/><!--相机权限-->
<uses-permission android:name="android.permission.INTERNET"/><!--网络权限-->

5.关闭SDK API的混淆设置(如业务代码需要混淆)

混淆补充参数:-keep class com.orangefilter.** {*;}

引入SDK依赖的资源

特效包资源作为渲染效果的输入资源,会根据授权功能提供相应功能的资源包。

将授权特效包资源放到指定的项目路径src\main\assets\effects下,以便运行时SDK自动获取资源。(如有动态下载特效包需求,需要将下载后的特效包存放至resDir + "/orangefilter/effects/"路径,resDir为createContext的参数,默认为activity.getFilesDir().getPath())

(1.4.5版本开始支持离线license)将 of_offline_license.license 文件存放到assets路径下。该文件会在接入SDK后自动从服务器下载,将其拷贝至assets文件夹下即可作为离线license使用。

准备 OpenGL ES 渲染环境

OrangeFilter Android SDK 使用 NDK 编译成动态库,Java 层使用 native API 封装,以 Android Studio aar 库的形式提供接入。

OrangeFilter 主要提供视频特效渲染功能,当前版本底层使用 OpenGL ES 渲染,所以首先需要在接入应用层准备好 OpenGL ES 的渲染环境。

1.声明 OpenGL ES 功能需求

AndroidManifest.xml 中加入:

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

以声明应用需要 OpenGL ES 2.0 或以上版本功能。

OpenGL ES 3.x API 向下兼容 2.0 API,只需声明 OpenGL ES 2.0 API 需求作为默认版本,运行时检查和使用 3.x API。

2.创建 OpenGL Context

Android SDK 提供了 GLSurfaceView 视图,可以快速建立 OpenGL Context 用于渲染。

在我们的示例中使用 CameraView 继承 GLSurfaceView 来执行渲染任务。

public class CameraView extends GLSurfaceView implements GLSurfaceView.Renderer

初始化 GLSurfaceView :

private void init() {
    ...
    setEGLConfigChooser(8, 8, 8, 8, 0, 0);
    setEGLContextClientVersion(3);

    setPreserveEGLContextOnPause(true);
    setRenderer(this);
    setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}

GLSurfaceView.Renderer 的实现方法中执行渲染:

@Override
public void onDrawFrame(GL10 gl10) {
    GLES20.xxx
}

由于使用了 GLSurfaceView.RENDERMODE_WHEN_DIRTY 渲染模式,渲染器会在图像变化时触发回调 onDrawFrame

也可以主动通过调用 this.requestRender() 向渲染器发送一次渲染请求。

渲染特效

示例工程(开源demo授权方提供开源demo)的工具类 CameraView 在创建 OpenGL ES 渲染环境的同时,还集成了摄像头图像采集功能。

在渲染回调中,摄像头图像会作为 OpenGL 纹理输入,使用它作为原始图像进行特效渲染。

1.创建视图

mCameraView = new CameraView(this);

2.设置渲染回调

mCameraView.setDrawFrameCallback(720, 1280, new CameraView.DrawFrameCallback() {
    接口实现...
});

前2个参数 720, 1280 用于指定渲染纹理的分辨率。

在渲染回调接口实现中,完成渲染工作:

a. 创建 OrangeFilter Context,创建特效 Effect,准备渲染数据

	@Override
    public void onInit() {

        // 授权码,从授权方获取
        final String ofSerialNumber = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
        
        // 初始化ofsdk引擎
        boolean ret =
                OrangeHelper.createContext(MainActivity.this, ofSerialNumber,
                        OrangeHelper.VENUS_ALL, null);

        if (!ret) {
            Log.e(TAG, OrangeHelper.LogMsg);//失败报错
        }
        
        
        ...

	    // 预加载特效。(也可以在需要的时候在渲染线程(ofsdk引擎同一个线程即可)去开启关闭特效)
	    
	    // 加载并开启特效。(只要加载效果,可以后面关闭该特效)
	    ret = OrangeHelper.enableEffect(OrangeHelper.EffectType.ET_BasicBeauty, true);
	    /*
	    //如果需要设置初始默认值,可以像下面这样操作。
        if (!bInit) {
            bInit = true;
            OrangeHelper.setEffectParam(OrangeHelper.EffectParamType.EP_BasicBeautyIntensity, 70);
            OrangeHelper.setEffectParam(OrangeHelper.EffectParamType.EP_BasicBeautyOpacity, 70);
        }*/
        //关闭特效显示。这样完成了类似加载的功能。不关闭就会显示了该特效。
        OrangeHelper.enableEffect(OrangeHelper.EffectType.ET_BasicBeauty, false);
	    
	    
	    
	    //其他想要预加载的特效
	    ...
        
    }

b. 在渲染回调中渲染特效

	@Override
    public void onDrawFrame(GLTexture textureIn, GLTexture textureOut) {
	    ...
	    //放到成员变量里提升性能
	    /*OrangeHelper.OrangeGLTexture mInTexture = new OrangeHelper.OrangeGLTexture();
        OrangeHelper.OrangeGLTexture mOutTexture = new OrangeHelper.OrangeGLTexture();
        OrangeHelper.OrangeImageInfo mImageInfo = new OrangeHelper.OrangeImageInfo();*/
        
        mInTexture.mTextureId  = textureIn.getTextureId();//opengl输入纹理id,该纹理作为输入和特效效果混合。
        mInTexture.mWidth      = textureIn.getWidth();//纹理宽
        mInTexture.mHeight     = textureIn.getHeight();//纹理高
        mOutTexture.mTextureId = textureOut.getTextureId();//opengl输出纹理id,该纹理是渲染特效后的纹理输出结果。
        mOutTexture.mWidth     = textureOut.getWidth();//纹理宽
        mOutTexture.mHeight    = textureOut.getHeight();//纹理高
        mImageInfo.data        = image.data;//识别人脸的输入图像
        mImageInfo.format      = OrangeFilter.OF_PixelFormat_NV21; //android默认摄像头的数据格式,用户使用三方sdk的需要根据实际图像格式来修改
        mImageInfo.dir         = isLandScape() ? (image.dir + 1) % 4 : image.dir; //识别图像的方向, isLandScape() 用户判断是否是横屏模式
        mImageInfo.frontCamera = image.frontCamera;//是否前置摄像头
        mImageInfo.width       = isLandScape() ? image.height : image.width;//识别图像的宽
        mImageInfo.height      = isLandScape() ? image.width : image.height;//识别图像的高
        mImageInfo.orientation = image.orientation;//摄像头获取的camera硬件信息,只有android需要。
        
        //刷新引擎的输入参数信息
        if (!OrangeHelper.updateFrameParams(mInTexture, mOutTexture,
                mImageInfo)) {
            //失败的处理,可以将原输入图像作为输出返回。也可以报错,定位错误原因。
            ...
        }
	}

    `mInTexture` 是摄像头采集的图像,`mOutTexture` 是叠加特效后最终渲染到屏幕的图像。

c. 释放资源

	@Override
	public void onRelease() {
	    ...
	    //释放引擎
	    OrangeHelper.destroyContext();
	}

文档是否有解决您的问题?

有帮助 没帮助
提交成功,非常感谢您的反馈!

反馈

TOP