├── 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 |
--------------------------------------------------------------------------------