├── Android-SDK接入.md ├── README.md ├── README_Android.md └── README_iOS.md /Android-SDK接入.md: -------------------------------------------------------------------------------- 1 | # PGSkinPrettifyEngine SDK接入流程说明(Android版) 2 | 品果视频美肤引擎Android版,最低SDK版本15 3 | 4 | 采用授权key的方式,一个key支持3个包名 5 | 6 | ## 1 申请key 7 | [申请地址](http://www.camera360.com/filter/apply.html) 8 | 9 | 10 | ## 2 导入相关文件 11 | 12 | 第一步:项目根目录下新建:us.pinguo.pgskinprettifyengine的package 13 | 放入文件:PGGLContextManager.java和PGSkinPrettifyEngine.java 14 | (注意:路径不能变,否则so会找不到文件) 15 | 第二步:在libs->armeabi-v7中导入so:libPGSkinPrettifyEngine.so 16 | 17 | ## 3 初始化SDK(Engine的初始化和数据处理必须在同一个线程中) 18 | 19 | step1:在onResume中实例化PGSkinPrettifyEngine 20 | m_pPGSkinPrettifyEngine = new PGSkinPrettifyEngine(); 21 | 22 | step2: 初始化相机 监听surfaceCreated 在surfaceCreated回调中初始化egl 23 | m_pGlContext = new PGGLContextManager(); 24 | m_pGlContext.initGLContext(0); 25 | 26 | //构造surface 如果不需要渲染,仅做数据处理,addSurface参数设置为null, m_pGlContext.addSurface(null); 27 | m_pGlContext.addSurface(holder); 28 | 29 | //将渲染上下文绑定到渲染面 30 | m_pGlContext.activateOurGLContext(); 31 | 32 | m_iCameraTextureID = m_pGlContext.createGLExtTexture(); 33 | m_pCameraTexture = new SurfaceTexture(m_iCameraTextureID); 34 | 35 | //把生成的SurfaceTexture对象设置了输出载体 36 | m_pCamera.setPreviewTexture(m_pCameraTexture); 37 | m_pCamera.startPreview(); 38 | 39 | step3:在onPreviewFrame中对预览帧数据进行处理 40 | 41 | // 初始化引擎(一个pPGSkinPrettifyEngine生命周期内只允许初始化一次) 42 | // SDK_KEY 申请链接 http://www.camera360.com/filter/apply.html 43 | m_pPGSkinPrettifyEngine.InitialiseEngine(this,SDK_KEY,false); 44 | m_pPGSkinPrettifyEngine.SetSizeForAdjustInput(m_sCameraPreviewFrameSize.height, m_sCameraPreviewFrameSize.width); 45 | m_pPGSkinPrettifyEngine.SetOrientForAdjustInput(PGSkinPrettifyEngine.PG_Orientation.PG_OrientationRightRotate90); 46 | 47 | //设置输出格式 48 | //PG_Pixel_RGBA(0), /*输出 RGBA 格式 */ 49 | //PG_Pixel_BGRA(1), /*输出 BGRA 格式 */ 50 | //PG_Pixel_NV21(2), /*输出 YUV420 格式(NV21格式) */ 51 | //PG_Pixel_YV12(3); /*输出 YUV420 格式(YV12格式) */ 52 | m_pPGSkinPrettifyEngine.SetOutputFormat(PGSkinPrettifyEngine.PG_PixelFormat.PG_Pixel_BGRA); 53 | 54 | 55 | //设置输出方向 56 | //PG_OrientationNormal(0), /* 原样输出 */ 57 | //PG_OrientationRightRotate90(1), /* 右旋90度输出(注意改变输出宽高) */ 58 | //PG_OrientationRightRotate180(2), /* 右旋180度输出 */ 59 | //PG_OrientationRightRotate270(3), /* 右旋270度输出(注意改变输出宽高) */ 60 | //PG_OrientationFlippedMirrored(4), /* 翻转并镜像输出 */ 61 | //PG_OrientationFlipped(5), /* 上下翻转输出 */ 62 | //PG_OrientationMirrored(6), /* 左右镜像输出 */ 63 | //PG_OrientationRightRotate90Mirrored(7), /*右旋90并左右镜像输出*/ 64 | //PG_OrientationRightRotate180Mirrored(8), /*右旋180并左右镜像输出*/ 65 | //PG_OrientationRightRotate270Mirrored(9); /*右旋270并左右镜像输出*/ 66 | m_pPGSkinPrettifyEngine.SetOutputOrientation(PGSkinPrettifyEngine.PG_Orientation.PG_OrientationFlippedMirrored); 67 | 68 | //控制整体的美肤强度 0~100(可动态调用) 69 | m_pPGSkinPrettifyEngine.SetSkinSoftenStrength(mnSoftenValue); 70 | 71 | //控制滤镜效果的程度(可动态调用) 72 | //mfPinkValue   粉嫩程度 0~1.0f 73 | //mfWhitenValue 白皙程度 0~1.0f 74 | //mfReddenValue 红润程度 0~1.0f 75 | m_pPGSkinPrettifyEngine.SetSkinColor(mfPinkValue, mfWhitenValue, mfReddenValue); 76 | 77 | ## 4 数据处理 78 | 79 | //帧处理 80 | //如果输入的是YV12格式的字节流 81 | m_pPGSkinPrettifyEngine.SetInputFrameByYV12(data,m_sCameraPreviewFrameSize.width, m_sCameraPreviewFrameSize.height); 82 | m_pPGSkinPrettifyEngine.RunEngine(); 83 | m_pPGSkinPrettifyEngine.GetOutputToScreen(m_iSurfaceWidth, m_iSurfaceHeight); 84 | m_pGlContext.presentSurface(); 85 | 86 | //得到处理后的字节流 87 | m_pPGSkinPrettifyEngine.SkinSoftenGetResult(); 88 | 89 | 90 | 91 | //如果输入的是texture id 92 | m_pPGSkinPrettifyEngine.SetInputFrameByTexture(m_iCameraTextureID, m_sCameraPreviewFrameSize.width, m_sCameraPreviewFrameSize.height); 93 | m_pPGSkinPrettifyEngine.RunEngine(); 94 | m_pPGSkinPrettifyEngine.GetOutputToScreen(m_iSurfaceWidth, m_iSurfaceHeight); 95 | m_pGlContext.presentSurface(); 96 | 97 | //得到处理后的texture id 98 | m_pPGSkinPrettifyEngine.GetOutputTextureID(); 99 | 100 | ## 5 销毁 101 | 102 | if (m_pGlContext!=null) 103 | m_pGlContext.activateOurGLContext(); 104 | // 销毁 PGHelixEngine 105 | if (m_pPGSkinPrettifyEngine != null) 106 | { 107 | m_pPGSkinPrettifyEngine.DestroyEngine(); 108 | m_pPGSkinPrettifyEngine = null; 109 | m_bIsFirstFrame = true; 110 | } 111 | 112 | // 销毁 GL Texture 113 | if (m_pCameraTexture != null) 114 | { 115 | m_pGlContext.deleteGLExtTexture(m_iCameraTextureID); 116 | m_pCameraTexture.release(); 117 | m_pCameraTexture = null; 118 | } 119 | 120 | // 销毁 GL Surface 121 | if (m_pGlContext != null) 122 | { 123 | Log.i(LOG_TAG, "releasing window surface"); 124 | m_pGlContext.releaseSurface(); 125 | } 126 | 127 | ## 6 常见问题 128 | 129 | *1:初始化engin时,程序crash。 130 | 产生原因:PGGLContextManager.java和PGSkinPrettifyEngine.java需要放到指定路径否则so会找不到。 131 | 132 | *2:预览帧数据的处理后无美肤效果。 133 | 产生原因:1.engin的初始化和数据处理必须在同一个线程中。2.sdk授权key失效。 134 | 135 | *3:m_pPGSkinPrettifyEngine.SkinSoftenGetResult返回byteBuffer 从缓冲器中拿bute[]时error 136 | 参考方案:ByteBuffer buffer = m_pPGSkinPrettifyEngine.SkinSoftenGetResult(); 137 | buffer.clear(); 138 | bytes = new byte[buffer.capacity()]; 139 | buffer.get(bytes,0,bytes.length); 140 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PGSkinPrettifyEngine 2 | 品果视频美肤引擎 3 | 4 | ## 支持的效果 5 | 6 | * 磨皮美肤,强度可调 7 | * 肤色的白晰、粉嫩、红润程度调节 8 | 9 | 实际处理效果可参看[刊例](http://www.camera360.com/filter/index.html),或者下载Demo进行体验。 10 | 11 | ### Change Log 12 | #### 2017.02.27 13 | 1. 修改了YUV色彩转换矩阵,尝试解决嘿秀反馈的播放端发黄问题。 14 | 2. 删除滤镜:Rokkor,Fuji,Prospect,Ultramax。 15 | 3. 增加滤镜:Memory,Mintgreen,Movie,Vista。 16 | 4. 初始化时输出当前版本号。 17 | 18 | ## 支持的平台 19 | ### iOS 20 | * [Demo安装](http://www.camera360.com/filter/download.html?k=5xdNAApspj8DcVH2T9owooKC%2Bwe9h2u4jtDbHGbhWWsqaIU6nks3pw%3D%3D) 21 | * [SDK引擎及Demo源码请联系我们](#联系我们) 22 | * [API文档](README_iOS.md) 23 | 24 | ### Android 25 | * [Demo安装](http://www.camera360.com/filter/adrdownload.html?k=hylVnDMi62bhog%2BED1c819SPZ0zgYKpjT4sDY6IOLWs%3D) 26 | * [SDK引擎及Demo源码请联系我们](#联系我们) 27 | * [API文档](README_Android.md) 28 | * [SDK接入流程](Android-SDK接入.md) 29 | 30 | ## 性能测试 31 | 视频美肤引擎的处理性能测试为:从数据输入引擎开始,至引擎输出数据结束(不包括屏幕显示)。 32 | 33 | 分辨率 |iphone5 | iphone5s | iPhone6plus | iPhone6 | iPhone6s 34 | :------- |:--------|:----- |:----- |:----- |:----- 35 | 360p(480x360)| 4ms| 6ms| 5ms| 5ms| 4ms 36 | 480p(640x480)| 4ms| 7ms| 6ms| 6ms| 4ms 37 | 720p(1280x720)| 5ms| 7ms| 4ms| 5ms| 4ms 38 | 39 | * 每帧处理耗时 40 | 41 | 分辨率 | vivo x7 | 三星s7 | 三星note3   42 | :------- |:------|:----- |:----- 43 | 480p(640x480)| 2ms| 4ms| 8ms 44 | 720p(1280x720)| 3ms| 3ms| 6ms 45 | 1080p(1920x1080)|3ms| 4ms| 4ms 46 | 47 | * 增加了GetSkinPrettifyResult接口调用,获取美肤结果,接口性能 48 | 49 | 分辨率 | vivo x7 | 三星s7 | 三星note3 50 | :------- |:------|:----- |:----- 51 | 480p(640x480)| 6ms| 7ms| 10ms 52 | 720p(1280x720)| 11ms| 15ms| 25ms 53 | 1080p(1920x1080)| 85ms| 60ms| 50ms 54 | 55 | * SDK内存消耗 56 | 57 | 分辨率 | vivo x7 | 三星s7 | 三星note3 58 | :------- |:------|:----- |:----- 59 | 480p(640x480)| 4M| 8M| 10M 60 | 720p(1280x720)| 4M| 8M| 10M 61 | 1080(1920x1080)| 7M| 14M| 15M 62 | 63 | 分辨率 | iPhone5s | iPhone6 | iPhone6plus 64 | :------- |:------|:----- |:----- 65 | 480p(640x480)| 11M| 11M| 9M 66 | 720p(1280x720)| 11M| 11M| 9M 67 | 68 | * CPU占用 69 | 70 | 分辨率 | vivo x7 | 三星s7 | 三星note3 71 | :------- |:------|:----- |:----- 72 | 480p(640x480)| 3%| 6%| 5% 73 | 720p(1280x720)| 3%| 4%| 5% 74 | 1080p(1920x1080)| 3%| 10%| 5% 75 | 76 | 分辨率 | iPhone5s | iPhone6 | iPhone6plus 77 | :------- |:------|:----- |:----- 78 | 480p(640x480)| 28%| 25%| 31% 79 | 720p(1280x720)| 28%| 25%| 32% 80 | 81 | ## 联系我们 82 | ### 声明 83 | 美颜SDK是一款付费产品,在产品里使用前需要联系商务,签署协议并获取对应的Key。 84 | 85 | 为了更好的为您服务,请填写一些[基本信息](http://www.camera360.com/filter/apply.html)。 86 | 87 | ### 商务合作及授权 Authorization 88 | 89 | 联系人 Contact |职位 Title | Mobile | QQ | E_mail 90 | :------- |:--------|:----- |:----- |:----- 91 | 杨颂 Amiel Yang | 商务合作总监 Director of Business Cooperation| 18615700177 13980706252| 2851258101| yangsong@camera360.com 92 | 93 | ### 技术支持 Technical 94 | Email: zhanglu@camera360.com 95 | 96 | QQ: 2851258101 97 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /README_Android.md: -------------------------------------------------------------------------------- 1 | # PGSkinPrettifyEngine(Android版) 2 | 品果视频美肤引擎Android版,最低SDK版本15 3 | 4 | ## 1 使用概览: 5 | 品果视频美肤引擎(PGSkinPrettifyEngine)的总体使用步骤分为五个部分: 6 | 7 | * [创建并初始化引擎](#创建并初始化引擎) 8 | * [设置相关参数并进行美肤处理](#设置相关参数并进行美肤处理) 9 | * [显示及获取美肤结果](#显示及获取美肤结果) 10 | * [销毁引擎](#销毁引擎) 11 | 12 | 以下对这五个部分分别进行详细的介绍。 13 | 14 | ## 2 创建并初始化引擎 15 | ### 2.1 相关接口 16 | 17 | /** 18 | * 描述:初始化引擎 19 | * 返回值:成功返回 true,失败或已经初始化过了返回 false 20 | * 参数:context 上下文 21 | * 参数:key 字符串 22 | * 参数:bInitEGL - 是否在 Native 层自己初始化 EGLContex 23 | */ 24 | public boolean InitialiseEngine(Context context, String key, boolean bInitEGL); 25 | 26 | 27 | 28 | ### 2.2 接口描述 29 | 此接口会初始化引擎必须的所有组件,包括创建 OpenGL ES 上下文及各种缓冲区等等。 30 | 31 | ### 2.3 调用示例 32 | 33 | // 创建美肤引擎对象 34 | PGSkinPrettifyEngine m_pPGSkinPrettifyEngine = new PGSkinPrettifyEngine(); 35 | // 初始化美肤引擎 36 | String key = "S4JWSqgZKtQwTOmSYV/K+lPfT5EF3DhdWzc9h5Mf1I7gY1SHhaGokAVpTaTSWXbs6AEmO+Wmx7tS6MrX4KxHy4g752TfC4x4KibafcUtrIiCfvmnPTCeAT6K9J0sYcPycmwJFbYUgyn0zEc76WYGsGOPJCe4zNFQ2iWD6H4+fGA=" 37 | m_pPGSkinPrettifyEngine.InitialiseEngine(this, key, false); 38 | 39 | 40 | ## 3 设置相关参数并进行美肤处理 41 | ### 3.1 相关接口 42 | 43 | /** 44 | * 描述:设置输入帧 45 | * 返回值:成功返回 true,失败返回 false 46 | * 参数:iTextureID - 相机回调所给的预览帧,iTextureWidth - 帧宽度,iTextureHeight - 帧高度 47 | */ 48 | public boolean SetInputFrameByTexture(int iTextureID, int iTextureWidth, int iTextureHeight); 49 | 50 | /** 51 | * 描述:设置输入帧的人脸信息 52 | * 返回值:成功返回 true,失败返回 false 53 | * 参数:sFaceRect - 帧所对应的人脸信息,用于人形虚化及基准肤色计算,若没有人脸则置为(0,0,0,0),此时会对全图进行美肤,并关闭人形虚化 54 | */ 55 | public boolean SetInputFrameFaceInfo(Rect sFaceRect); 56 | 57 | /** 58 | * 描述:设置一个方向,用于校正输入的预览帧 59 | * 返回值:成功返回 true,失败返回 false 60 | * 参数:eAdjustInputOrient - 方向值 61 | */ 62 | public boolean SetOrientForAdjustInput(PG_Orientation eAdjustInputOrient); 63 | 64 | /** 65 | * 描述:设置一个尺寸,用于调整输入帧的宽高,也是最终输出帧的宽高 66 | * 返回值:成功返回 true,失败返回 false 67 | * 参数:iAdjustWidth - 输出帧宽度,iAdjustHeight - 输出帧高度 68 | */ 69 | public boolean SetSizeForAdjustInput(int iAdjustWidth, int iAdjustHeight); 70 | 71 | /** 72 | * 描述:设置美肤步骤中磨皮的强度 73 | * 返回值:成功返回 true,失败返回 false 74 | * 参数:iSoftenStrength - 磨皮强度,范围 0 - 100 75 | */ 76 | public boolean SetSkinSoftenStrength(int iSoftenStrength); 77 | 78 | /** 79 | * 描述:设置人形虚化的强度 80 | * 返回值:成功返回 true,失败返回 false 81 | * 参数:iBlurStrength - 虚化强度,范围 0 - 100,iVideoOrientation 当前相机的预览方向 82 | */ 83 | public boolean SetPortraitBlurStrength(int iBlurStrength, int iVideoOrientation); 84 | 85 | /** 86 | * 描述:设置美肤步骤中的肤色调整参数 87 | * 返回值:成功返回 true,失败返回 false 88 | * 参数:fPinking - 粉嫩程度, fWhitening - 白晰程度,fRedden - 红润程度,范围都是0.0 - 1.0 89 | */ 90 | public boolean SetSkinColor(float fPinking, float fWhitening, float fRedden); 91 | 92 | /** 93 | * 描述:设置美肤结果的输出方向 94 | * 返回值:成功返回 true,失败返回 false 95 | * 参数:eOutputOrient - 方向值 96 | */ 97 | public boolean SetOutputOrientation(PG_Orientation eOutputOrient); 98 | 99 | /** 100 | * 描述:设置美肤结果的输出格式 101 | * 返回值:成功返回 true,失败返回 false 102 | * 参数:eOutFormat - 输出的色彩格式 103 | */ 104 | public boolean SetOutputFormat(PG_PixelFormat eOutFormat); 105 | 106 | /** 107 | * 描述:根据所设置的参数,运行引擎 108 | * 返回值:成功返回 YES, 失败返回 NO 109 | * 参数:无 110 | */ 111 | public void RunEngine(); 112 | 113 | 114 | ### 3.2 接口描述 115 | #### 3.2.1 关于人脸信息 116 | 为了更细致和精确的美肤效果,所以在使用 SetInputFrameByTexture 接口设置输入图像时,引擎需要使用当前输入帧中的人脸信息,部分 Android 系统本身有提供人脸框检测的功能,具体使用方法可参考完整 Demo 源码,也可以使用第三方人脸识别库进行识别,但需要转换为 Android 系统所给的人脸坐标格式后再传给引擎。 117 | 118 | #### 3.2.2 关于输出方向 119 | 引擎提供了两个用于调整方向的接口,SetOrientForAdjustInput 用于调整输入帧的方向,此接口会影响到 Surface 所显示的内容,及输出缓冲区中的内容。另外,由于坐标系原点的不同,输出缓冲区中的帧可能和显示的不一样,所以要想显示的和输出的一致,还需要使用 SetOutputOrientation 接口对输出缓冲区进行调整。这两个接口的参数类型为方向枚举,引擎目前提供了如下七个方向: 120 | 121 | 122 | // 用于控制输出旋转方向的枚举 123 | public enum PG_Orientation 124 | { 125 | PG_OrientationNormal(0), /* 原样输出 */ 126 | PG_OrientationRightRotate90(1), /* 右旋90度输出(注意改变输出宽高) */ 127 | PG_OrientationRightRotate180(2), /* 右旋180度输出 */ 128 | PG_OrientationRightRotate270(3), /* 右旋270度输出(注意改变输出宽高) */ 129 | PG_OrientationFlippedMirrored(4), /* 翻转并镜像输出 */ 130 | PG_OrientationFlipped(5), /* 上下翻转输出 */ 131 | PG_OrientationMirrored(6),; /* 左右镜像输出 */ 132 | } 133 | 134 | 135 | #### 3.2.3 关于输出格式 136 | 引擎目前支持3种输出格式,以方便后续的视频编码,分别为如下三种格式 137 | 138 | // 用于控制输出帧数据格式的枚举 139 | public enum PG_PixelFormat 140 | { 141 | PG_Pixel_RGBA(0), /*输出 RGBA 格式 */ 142 | PG_Pixel_BGRA(1), /*输出 BGRA 格式 */ 143 | PG_Pixel_YUV420(2); /*输出 YUV420 格式 */ 144 | } 145 | 146 | ### 3.3 调用示例 147 | 148 | // 设置美肤引擎输出的帧宽高 149 | m_pPGSkinPrettifyEngine.SetSizeForAdjustInput(m_sCameraPreviewFrameSize.height, m_sCameraPreviewFrameSize.width); 150 | // 将原始输入帧右旋(顺时针)270 度 151 | m_pPGSkinPrettifyEngine.SetOrientForAdjustInput(PGSkinPrettifyEngine.PG_Orientation.PG_OrientationRightRotate270); 152 | // 设置美肤引擎的输出格式为BGRA 153 | m_pPGSkinPrettifyEngine.SetOutputFormat(PGSkinPrettifyEngine.PG_PixelFormat.PG_Pixel_BGRA); 154 | // 设置美肤引擎输出方向为翻转并镜像 155 | m_pPGSkinPrettifyEngine.SetOutputOrientation(PGSkinPrettifyEngine.PG_Orientation.PG_OrientationFlippedMirrored); 156 | // 设置美肤强度为80 157 | m_pPGSkinPrettifyEngine.SetSkinSoftenStrength(80); 158 | // 设置背景模糊强度为80,此时需要同时告诉引擎目前的视频相机方向,用于引擎修正人脸坐标 159 | m_pPGSkinPrettifyEngine.SetPortraitBlurStrength(80, 270); 160 | // 设置输入图像,以及图像上的人脸信息 161 | m_pPGSkinPrettifyEngine.SetInputFrameFaceInfo(m_FaceRect); 162 | // 设置肤色高速参数,粉嫩,白皙,红润均为 0.5 163 | m_pPGSkinPrettifyEngine.SetSkinColor(0.5f, 0.5f, 0.5f); 164 | // 运行引擎,进行美肤处理 165 | m_pPGSkinPrettifyEngine.RunEngine(); 166 | 167 | 168 | ## 4 显示及获取美肤结果 169 | ### 4.1 相关接口 170 | 171 | /** 172 | * 描述:将显示内容左右镜像 173 | * 返回值:成功返回 true,失败返回 false 174 | * 参数:bDislpayMirrored - 为 true 时显示内容会左右镜像 175 | */ 176 | public boolean SetDisplayMirroredEnable(boolean bDislpayMirrored); 177 | 178 | /** 179 | * 描述:将美肤结果刷新到 Surface 180 | * 返回值:成功返回 true,失败返回 false 181 | * 参数:iScreenWidth - Surface的宽,iScreenHeight - Surface的高 182 | */ 183 | public boolean GetOutputToScreen(int iScreenWidth, int iScreenHeight); 184 | 185 | /** 186 | * 描述:手动获取美肤结果 187 | * 返回值:用于存放结果的缓冲区,数据格式为初始化美肤引擎所设置的格式 188 | * 参数:无 189 | */ 190 | public ByteBuffer SkinSoftenGetResult(); 191 | 192 | 193 | ### 4.2 接口描述 194 | #### 4.2.1 关于美肤结果获取 195 | 使用者通过调用 GetSkinPrettifyResult 主动获取美肤结果缓冲区,此缓冲区的具体格式通过 SetOutputFormat 接口设置,需要注意的是,当输出格式设置为 BGRA 和 YUV 时,缓冲区的长度是不一样的。外部无需释放所返回的缓冲区,引擎会自行管理。 196 | 197 | #### 4.2.2 关于美肤预览 198 | 预览美肤的方式有多种,一种是通过引擎提供的 PGGLContextManager 类,将 SurfaceView 或 TextureView 的 Surface 添加到类中,并在适当的地方进行切换 GL 上下文,当有美肤结果后,调用 GetOutputToScreen 可将美肤结果呈现到 Surface 中。也可以使用 GLSurfaceView,此时无需使用 PGGLContextManager 来管理 GL 上下文,需要注意的是,对引擎所有接口的调用都需要放在 GL 线程中进行,否则会出现干扰主界面显示,或作图不正确的问题。 199 | 200 | ### 4.3 调用示例 201 | 202 | // 主动获取输出结果 203 | ByteBuffer pResult = m_pPGSkinPrettifyEngine.SkinSoftenGetResult(); 204 | // 将美肤结果呈现到 Surface 205 | m_pPGSkinPrettifyEngine.GetOutputToScreen(m_iSurfaceWidth, m_iSurfaceHeight); 206 | m_pGlContext.presentSurface(); 207 | 208 | ## 5 销毁引擎 209 | ### 5.1 相关接口 210 | 211 | /** 212 | * 描述:销毁引擎 213 | * 返回值:无 214 | * 参数:无 215 | */ 216 | public void DestroyEngine(); 217 | 218 | ### 5.2 接口描述 219 | 销毁引擎时,会释放和删除引擎所创建一切组件,包括各种缓冲区,Mesh 数据,纹理等等,所以销毁引擎后,不应该再对这些对象进行任何操作。 220 | 221 | ### 5.3 调用示例 222 | 223 | // 销毁美肤引擎 224 | m_pPGSkinPrettifyEngine.DestroyEngine(); 225 | m_pPGSkinPrettifyEngine = null; 226 | 227 | 228 | -------------------------------------------------------------------------------- /README_iOS.md: -------------------------------------------------------------------------------- 1 | # PGSkinPrettifyEngine(iOS版) 2 | 品果视频美肤引擎iOS版 3 | 4 | ## 1 使用概览: 5 | 品果视频美肤引擎(PGSkinPrettifyEngine)的总体使用步骤分为四个部分: 6 | 7 | * [创建并初始化引擎](#创建并初始化引擎)。 8 | * [设置相关参数并进行美肤处理](#设置相关参数并进行美肤处理)。 9 | * [显示及获取美肤结果](#显示及获取美肤结果)。 10 | * [销毁引擎](#销毁引擎)。 11 | 12 | 以下对这四个部分分别进行详细的介绍。 13 | 14 | ## 2 创建并初始化引擎 15 | ### 2.1 相关接口 16 | 17 | /** 18 | * 描述:初始化引擎 19 | * 参数:pKey,字符串 20 | * 返回值:成功返回 YES,失败或已经初始化过返回 NO 21 | * 参数:无 22 | */ 23 | - (BOOL) InitEngineWithKey:(NSString*) pKey; 24 | 25 | 26 | ### 2.2 接口描述 27 | 此接口会初始化引擎必须的所有组件,包括创建 OpenGL ES 上下文及各种缓冲区等等。 28 | 29 | ### 2.3 调用示例 30 | 31 | // 创建美肤引擎对象 32 | PGSkinPrettifyEngine* m_pPGSkinPrettifyEngine = [[PGSkinPrettifyEngine alloc] init]; 33 | // 初始化美肤引擎 34 | NSString *pKey = @"KDpbdC/aXRvikWVkD1bT6FB/+dCAFt67nHDFut3P+q+c8YeFVh79PWntsGq0JfVGXLHaODWjq+n2h9EgX4FRw4oHuq6GiuV6LL3p0/55rJ9uWBRV+P/Uo5XJuNWz7CEdl6Ebs9CiCFaghqxgfvswFkpt+ah1C427XLs7PQGcaM0="; 35 | [m_pPGSkinPrettifyEngine InitEngineWithKey:pKey]; 36 | 37 | 38 | ## 3 设置相关参数并进行美肤处理 39 | ### 3.1 相关接口 40 | 41 | /** 42 | * 描述:设置输入帧 43 | * 返回值:无 44 | * 参数:pInputPixel - 相机回调所给的预览帧,sFaceRect - 帧所对应的人脸信息,用于人形虚化及基准肤色计算,若没有人脸则置为(0,0,0,0),此时会对全图进行美肤,并关闭人形虚化 45 | */ 46 | - (void) SetInputFrameByCVImage:(CVPixelBufferRef)pInputPixel FaceRect:(CGRect)sFaceRect; 47 | 48 | /** 49 | * 描述:设置一个方向,用于校正输入的预览帧 50 | * 返回值:无 51 | * 参数:eAdjustInputOrient - 方向值 52 | */ 53 | - (void) SetOrientForAdjustInput:(PGOrientation)eAdjustInputOrient; 54 | 55 | /** 56 | * 描述:设置一个尺寸,用于调整输入帧的宽高,也是最终输出帧的宽高 57 | * 返回值:无 58 | * 参数:sSize - 宽和高 59 | */ 60 | - (void) SetSizeForAdjustInput:(CGSize)sSize; 61 | 62 | /** 63 | * 描述:设置美肤步骤中磨皮的强度 64 | * 返回值:无 65 | * 参数:iSoftenStrength - 磨皮强度,范围 0 - 100 66 | */ 67 | - (void) SetSkinSoftenStrength:(int)iSoftenStrength; 68 | 69 | /** 70 | * 描述:设置人形虚化的强度 71 | * 返回值:无 72 | * 参数:iBlurStrength - 虚化强度,范围 0 - 100,videoOrientation 当前相机的预览方向 73 | */ 74 | - (void) SetPortraitBlurStrength:(int)iBlurStrength VideoOrient:(AVCaptureVideoOrientation)videoOrientation; 75 | 76 | /** 77 | * 描述:设置美肤步骤中的肤色调整参数 78 | * 返回值:无 79 | * 参数:fPinking - 粉嫩程度, fWhitening - 白晰程度,fRedden - 红润程度,范围都是0.0 - 1.0 80 | */ 81 | - (void) SetSkinColor:(float)fPinking Whitening:(float)fWhitening Redden:(float)fRedden; 82 | 83 | /** 84 | * 描述:设置美肤结果的输出方向 85 | * 返回值:无 86 | * 参数:eOutputOrientation - 方向值 87 | */ 88 | - (void) SetOutputOrientation:(PGOrientation)eOutputOrientation; 89 | 90 | /** 91 | * 描述:设置美肤结果的输出方向 92 | * 返回值:无 93 | * 参数:eOutFormat - 输出的色彩格式 94 | */ 95 | - (void) SetOutputFormat:(PGPixelFormat)eOutFormat; 96 | 97 | /** 98 | * 描述:根据所设置的参数,运行引擎 99 | * 返回值:成功返回 YES, 失败返回 NO 100 | * 参数:无 101 | */ 102 | - (BOOL) RunEngine; 103 | 104 | 105 | ### 3.2 接口描述 106 | #### 3.2.1 关于人脸信息 107 | 为了更细致和精确的美肤效果,所以在使用 SetInputFrameByCVImage 接口设置输入图像时,引擎需要使用当前输入帧中的人脸信息,iOS 系统本身有提供人脸框检测的功能,具体使用方法可参考完整 Demo 源码,也可以使用第三方人脸识别库进行识别,但需要转换为 iOS 系统所给的人脸坐标格式后再传给引擎。 108 | 109 | #### 3.2.2 关于输出方向 110 | 引擎提供了两个用于调整方向的接口,SetOrientForAdjustInput 用于调整输入帧的方向,此接口会影响到 PGOglView 所显示的内容,及输出缓冲区中的内容。另外,由于坐标系原点的不同,输出缓冲区中的帧可能和显示的不一样,所以要想显示的和输出的一致,还需要使用 SetOutputOrientation 接口对输出缓冲区进行调整。这两个接口的参数类型为方向枚举,引擎目前提供了如下七个方向: 111 | 112 | // 用于控制输出旋转方向的枚举 113 | typedef enum 114 | { 115 | PGOrientationNormal = 0, // 原样输出 116 | PGOrientationRightRotate90, // 右旋90度输出(注意改变输出宽高) 117 | PGOrientationRightRotate180, // 右旋180度输出 118 | PGOrientationRightRotate270, // 右旋270度输出(注意改变输出宽高) 119 | PGOrientationFlippedMirrored, // 翻转并镜像输出 120 | PGOrientationFlipped, // 上下翻转输出 121 | PGOrientationMirrored // 左右镜像输出 122 | } PGOrientation; 123 | 124 | 125 | #### 3.2.3 关于输出格式 126 | 引擎目前支持3种输出格式,以方便后续的视频编码,分别为如下三种格式 127 | 128 | // 用于控制输出帧数据格式的枚举 129 | typedef enum 130 | { 131 | PGPixelFormatRGBA = 0, // 输出 kCVPixelFormatType_32BGRA 格式的 PixelBuffer, 内部数据为 RGBA 132 | PGPixelFormatBGRA, // 输出 kCVPixelFormatType_32BGRA 格式的 PixelBuffer, 内部数据为 BGRA 133 | PGPixelFormatYUV420 // 输出 kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, 内部数据为 YUV420 134 | } PGPixelFormat; 135 | 136 | ### 3.3 调用示例 137 | 138 | // 设置美肤引擎输出的帧宽高 139 | [m_pPGSkinPrettifyEngine SetSizeForAdjustInput:CGSizeMake(size.width, size.height)]; 140 | // 将原始输入帧右旋(顺时针)90 度 141 | [m_pPGSkinPrettifyEngine SetOrientForAdjustInput:PGOrientationRightRotate90]; 142 | // 设置美肤引擎的输出格式为BGRA 143 | [m_pPGSkinPrettifyEngine SetOutputFormat:PGPixelFormatBGRA]; 144 | // 设置美肤引擎输出方向为翻转并镜像 145 | [m_pPGSkinPrettifyEngine SetOutputOrientation:PGOrientationFlippedMirrored]; 146 | // 设置美肤强度为80 147 | [m_pPGSkinPrettifyEngine SetSkinSoftenStrength:80]; 148 | // 设置背景模糊强度为80,此时需要同时告诉引擎目前的视频相机方向,用于引擎修正人脸坐标 149 | [m_pPGSkinPrettifyEngine SetPortraitBlurStrength:80 VideoOrient:AVCaptureVideoOrientationLandscapeLeft]; 150 | // 设置输入图像,以及图像上的人脸信息 151 | [m_pPGSkinPrettifyEngine SetInputFrameByCVImage:imageBuffer FaceRect:m_sOrigFaceRect]; 152 | // 启用肤色红润效果 153 | [m_pPGSkinPrettifyEngine SetSkinColor:0.5 Whitening:0.5 Redden:0.5]; 154 | // 运行引擎,进行美肤处理 155 | [m_pPGSkinPrettifyEngine RunEngine]; 156 | 157 | ## 4 显示及获取美肤结果 158 | ### 4.1 相关接口 159 | 160 | /** 161 | * 描述:设置美肤结果的输出回调 162 | * 返回值:无 163 | * 参数:outputCallback - 委托 164 | */ 165 | - (void) SetSkinPrettifyResultDelegate:(id )outputCallback; 166 | 167 | /** 168 | * 描述:主动获取美肤结果 169 | * 返回值:无 170 | * 参数:pResultBuffer - 指向 CVPixelBufferRef 的指针 171 | */ 172 | - (void) GetSkinPrettifyResult:(CVPixelBufferRef *)pResultBuffer; 173 | 174 | /** 175 | * 描述:创建一个预览美肤效果的 View ,返回的 View 会在 DestroyEngine 时销毁,不需要外部销毁 176 | * 返回值:所创建的 PGOglView 指针 177 | * 参数:View 的尺寸 178 | */ 179 | - (PGOglView *) PGOglViewCreateWithFrame:(CGRect)sFrame; 180 | 181 | /** 182 | * 描述:将美肤结果刷新到 PGOglView 183 | * 返回值:成功返回 YES,引擎未初始化,或 View 未成功创建返回 NO 184 | * 参数:View 的尺寸 185 | */ 186 | - (BOOL) PGOglViewPresent; 187 | 188 | /** 189 | * 描述:将显示内容左右镜像 190 | * 返回值:无 191 | * 参数:无 192 | */ 193 | - (void) PGOglViewMirrored; 194 | 195 | /** 196 | * 描述:外部更改了 PGOglView 的 Size 后通过调用此方法通知引擎更新 PGOglView 相关的组件 197 | * 返回值:无 198 | * 参数:无 199 | */ 200 | - (void) PGOglViewSizeChanged; 201 | 202 | /** 203 | * 描述:设置一个矩阵用于调整输入帧,使用此方法意味着将输入的预处理变换操作交由调用者控制,调用此方法后会影响SetOrientForAdjustInput产生的设置 204 | * 返回值:无 205 | * 参数:pMatrix - MVP矩阵 206 | */ 207 | - (void) SetMatrixForAdjustInput:(float *)pMatrix; 208 | 209 | /** 210 | * 描述:设置一个矩阵用于调节输出,使用此方法意味着将输出的变换操作交由调用者控制,调用此方法后会影响SetOutputOrientation产生的设置 211 | * 返回值:无 212 | * 参数:pMatrix - MVP矩阵 213 | */ 214 | - (void) SetMatrixForAdjustOutput:(float *)pMatrix; 215 | 216 | /** 217 | * 描述:设置一个矩阵用于控制显示画面的变换 218 | * 返回值:成功返回 YES 219 | * 参数:pMatrix - MVP矩阵 220 | */ 221 | - (BOOL) PGOglViewSetMVPMatrix:(float *)pMatrix; 222 | 223 | ### 4.2 接口描述 224 | #### 4.2.1 关于美肤结果获取 225 | 引擎提供了两种获取美肤输出的方式,一种是通过 SetSkinPrettifyResultDelegate 接口设置一个回调,当引擎完成了一帧美肤后,会调用所设置的回调,传入美肤结果。另一种是通过 GetSkinPrettifyResult 主动获取美肤结果缓冲区,此缓冲区的具体格式通过 SetOutputFormat 接口设置,外部无需释放所返回的缓冲区,引擎会自行管理。 226 | 227 | #### 4.2.2 关于美肤预览 228 | 预览美肤的方式也有两种,一种是通过引擎提供的 PGOglViewCreateWithFrame 接口创建一个 UIView ,并添加到 App 的 View 层级中,当有美肤结果后,调用 PGOglViewPresent 可将美肤结果呈现到 View 中,外部也无需释放此 View,引擎会自行管理。另一种方式是,通过 4.2.1 中的方式获取到缓冲区,然后开发者自行将此缓冲区显示出来。 229 | 230 | ### 4.3 调用示例 231 | 232 | CVPixelBufferRef pResultBuffer; 233 | // 主动获取输出结果 234 | [m_pPGSkinPrettifyEngine GetSkinPrettifyResult:&pResultBuffer]; 235 | // 设置美肤引擎的输出回调 236 | [m_pPGSkinPrettifyEngine SetSkinPrettifyResultDelegate:self]; 237 | // 将美肤结果呈现到 PGOglView 238 | [m_pPGSkinPrettifyEngine PGOglViewPresent]; 239 | 240 | 241 | ## 5 销毁引擎 242 | ### 5.1 相关接口 243 | 244 | /** 245 | * 描述:销毁引擎 246 | * 返回值:无 247 | * 参数:无 248 | */ 249 | - (void) DestroyEngine; 250 | 251 | ### 5.2 接口描述 252 | 销毁引擎时,会释放和删除引擎所创建一切组件,包括各种缓冲区,以及预览 View,所以销毁引擎后,不应该再对这些对象进行任何操作。 253 | 254 | ### 5.3 调用示例 255 | 256 | // 销毁美肤引擎 257 | [m_pPGSkinPrettifyEngine DestroyEngine]; 258 | 259 | --------------------------------------------------------------------------------