本文介绍如何在你的项目中集成和使用远鉴人脸活体检测插件,包括 Android 和 iOS 平台。
远鉴人脸活体检测插件是对活体检测 核心 API 的封装。通过声网 SDK v4.x 提供的 setExtensionProperty 或 setExtensionPropertyWithVendor 方法,传入指定的 key
和 value
参数,你可以快速集成远鉴的活体检测能力。
以 setExtensionProperty
为例,其中的 key
参数与远鉴的 API 名称完全对应,value
参数以 JSON 格式包装该 API 的部分或全部参数。因此,调用 setExtensionProperty
时只要传入指定的 key
和 value
,就可以调用对应的远鉴 API,实现活体检测的有关功能。setExtensionPropertyWithVendor
同理。
远鉴人脸活体检测插件需要与声网视频 SDK v4.x 搭配使用。参考以下文档集成视频 SDK v4.x 并实现基础的视频通话:
在声网控制台购买和激活远鉴人脸活体检测插件,保存好获取到的 appKey
和 appSecret
,后续初始化插件时需要用到。
本节介绍插件相关接口的调用流程。接口的参数解释详见接口说明。
.aar
文件保存到项目文件夹的 /app/libs
路径。app/build.gradle
文件,在 dependencies
中添加如下行:implementation fileTree(dir: "libs", include: ["*.jar", "*.aar"])
初始化声网 RtcEngine 时,调用 enableExtension 开启插件。
RtcEngineConfig config = new RtcEngineConfig();
// 监听插件事件,用于接收 onEvent 回调
config.mExtensionObserver = this;
mRtcEngine = RtcEngine.create(config);
// 开启插件
mRtcEngine.enableExtension("fosafer", "alive", enabled);
//初始化活体检测模块
FosaferManager fosaferManager = new FosaferManager();
//用户传入获取的appkey,appsecret
fosaferManager.init(this, mRtcEngine, appkey, appsecret);
成功开始识别后,远鉴人脸活体检测插件会通过 onEvent 回调返回识别结果。识别结果的含义详见 onEvent 回调。
public void onEvent(String vendor, String key, String value) {
//vendor即为上述注册插件时的VENDOR_NAME,key/value是插件消息的键值对
if (TextUtils.equals(key, "text")) {
//更新提示语句
} else if (TextUtils.equals(key, "result")) {
//活体检测结果处理
} else {
//初始化引擎失败
}
}
.framework
库文件保存到你的项目文件夹下。以如下项目结构为例,你可以把库文件保存到 <ProjectName>
路径下。
.
├── <ProjectName>
├── <ProjectName>.xcodeproj
按照 Demo 中 FOSDetectViewController.m 中的 initRtcEngine 方法,启动插件。
AgoraRtcEngineConfig *config = [AgoraRtcEngineConfig new];
config.eventDelegate = self;
config.appId = App_id;
self.agoraKit = [AgoraRtcEngineKit sharedEngineWithConfig:config delegate:self];
[self.agoraKit enableExtensionWithVendor:@"fosafer"
extension:@"alive"
enabled:YES];
[self.agoraKit enableVideo];
[self.agoraKit setChannelProfile:AgoraChannelProfileLiveBroadcasting];
[self.agoraKit setClientRole:AgoraClientRoleBroadcaster];
AgoraRtcVideoCanvas *canvas = [AgoraRtcVideoCanvas new];
canvas.view = self.preview;
[self.agoraKit setupLocalVideo:canvas];
[self.agoraKit startPreview];
initRtcEngine 方法中实现 key 为 set_appKey_appSecret 的 setExtensionPropertyWithVendor 方法,设置 appKey 和 appSecret。
#define App_Key @""
#define App_Secret @""
给插件设置 appKey
和 appSecret
:
NSDictionary *propertyDic = @{@"appKey" : App_Key, @"appSecret" : App_Secret};
NSData *propertyData = [NSJSONSerialization dataWithJSONObject:propertyDic
options:0
error:0];
NSString *propertyStr = [[NSString alloc] initWithData:propertyData
encoding:NSUTF8StringEncoding];
[self.agoraKit setExtensionPropertyWithVendor:@"fosafer"
extension:@"alive"
key:@"set_appKey_appSecret"
value:propertyStr];
在回调方法中,根据返回的数据,做对应的处理。
- (void)onEvent:(NSString *__nullable)provider
extension:(NSString *__nullable)extension
key:(NSString *__nullable)key
value:(NSString *__nullable)value {
NSData *jsonData = [value dataUsingEncoding:NSUTF8StringEncoding];
NSError *err;
NSDictionary *dic =
[NSJSONSerialization JSONObjectWithData:jsonData
options:NSJSONReadingMutableContainers
error:&err];
if (!err) {
NSString *errorCode = [dic objectForKey:@"errorCode"];
NSString *message = [dic objectForKey:@"message"];
switch (errorCode.integerValue) {
case 0:
NSLog(@"成功");
[self detectSuccessAction];
break;
case 1001:
[self timeoutAction];
break;
case 1002:
[self alertTitle:@"提示"
message:@"打开引擎库失败,请重试"
type:1];
break;
case 1003:
[self alertTitle:@"提示"
message:@"引擎库返回人脸图片为空,请重试"
type:1];
break;
case 1004:
[self alertTitle:@"提示"
message:@"setProperty方法参数格式错误"
type:1];
break;
case 1005:
[self alertTitle:@"提示" message:@"appKey不能为空" type:1];
break;
case 1006:
[self alertTitle:@"提示" message:@"appSecret不能为空" type:1];
break;
case 2000:
[self setTips:@"正在处理"];
[self.agoraKit enableLocalVideo:NO];
break;
case 2001:
[self setTips:@"请在检测框中露出人脸"];
break;
case 2002:
[self setTips:@"请在检测框中露出人脸"];
break;
case 2003:
[self setTips:@"靠近点"];
break;
case 2004:
[self setTips:@"离远点"];
break;
case 2005:
[self setTips:@"环境过暗"];
break;
case 2006:
[self setTips:@"环境过亮"];
break;
case 2007:
[self setTips:@"请保持稳定"];
break;
case 2008:
[self setTips:@"请保持手机竖直"];
break;
case 3001:
[self alertTitle:@"提示" message:message type:1];
break;
case 3002:
[self alertTitle:@"提示" message:message type:1];
break;
default:
break;
}
}
}
当检测完成,需要关闭检测页面时,需要调用 FOSDetectViewController.m 中的 destroy 方法,用以释放插件内存。
- (void)destroy {
[self.agoraKit stopPreview];
[self.agoraKit enableLocalVideo:NO];
[AgoraRtcEngineKit destroy];
}
平台 | 语言 | 示例项目 |
---|---|---|
Android | Java | https://github.com/AgoraIO-Usecase/FosaferAgoraDemo/tree/android |
iOS | Objective-C | https://github.com/AgoraIO-Usecase/FosaferAgoraDemo/tree/ios |
Android
克隆仓库:
git clone https://github.com/AgoraIO-Usecase/FosaferAgoraDemo.git
从声网云市场下载页面下载远鉴人脸活体检测插件的 Android 插件包。解压后,将所有 .aar
文件保存到 app/libs
。
在 Android Studio 中打开示例项目 FosaferAgoraDemo
。
将项目与 Gradle 文件同步。
打开 app\src\main\java\com\fosafer\voicenet1\Constants
,进行如下修改:
<YOUR_APP_ID>
替换为你的 App ID。获取 App ID 请参考开始使用声网平台。<YOUR_APP_KEY>
和 <YOUR_APP_SECRET>
分别替换为你的 appKey
和 appSecret
。获取方式详见购买和激活插件。public interface Constants {
String mAppId = "<YOUR_APP_ID>";
String mAppKey = "<YOUR_APP_KEY>";
String mAppSecret = "<YOUR_APP_SECRET>";
}
连接一台 Android 真机(非模拟器),运行项目。
iOS
克隆仓库:
git clone -b ios https://github.com/AgoraIO-Usecase/FosaferAgoraDemo.git
从声网云市场下载页面下载远鉴人脸活体检测插件的 iOS 插件包。解压后,将所有 .framwork
库文件保存到 FOSAgora/FOSAgoraDemo
。
在终端中进入 FOSAgora/
,运行以下命令使用 CocoaPods 安装依赖:
pod install
在 Xcode 中打开项目 FOSAgora/FOSAgoraDemo.xcworkspace
。
打开 FOSDetectViewController.m
,进行如下修改:
<YOUR_APP_ID>
替换为你的 App ID。获取 App ID 请参考开始使用声网平台。<YOUR_APP_KEY>
和 <YOUR_APP_SECRET>
分别替换为你的 appKey
和 appSecret
。获取方式详见购买和激活插件。#define App_id @"<YOUR_APP_ID>"
#define App_Key @"<YOUR_APP_KEY>"
#define App_Secret @"<YOUR_SECRET>"
连接一台 iOS 真机(非模拟器),运行项目。
运行成功后,示例项目会安装到你的 Android 或 iOS 设备上。
Android
进入
按钮。进入
跳转到活体检测页面,手机竖直后开始进行人脸识别。iOS
开始识别
按钮。开始识别
开始活体校验。插件所有相关接口的参数解释详见接口说明。