将所需相关依赖文件放到指定目录
依赖文件 | 存放路径 |
---|---|
agora-rtc-sdk.jar |
AgoraWithAIWorksAndroid\app\libs |
64位libagora-rtc-sdk-jni.so |
AgoraWithAIWorksAndroid\app\src\main\jniLibs\arm64-v8a |
32位libagora-rtc-sdk-jni.so |
AgoraWithAIWorksAndroid\app\src\main\jniLibs\armeabi-v7a |
64位换背景libaw_portrait.so |
AgoraWithAIWorksAndroid\agora-aiworks\src\main\jniLibs\arm64-v8a |
32位换背景libaw_portrait.so |
AgoraWithAIWorksAndroid\agora-aiworks\src\main\jniLibs\armeabi-v7a |
64位mnn libMNN.so |
AgoraWithAIWorksAndroid\agora-aiworks\src\main\jniLibs\arm64-v8a |
32位mnn libMNN.so |
AgoraWithAIWorksAndroid\agora-aiworks\src\main\jniLibs\armeabi-v7a |
64位c++库 libc++_shared.so |
AgoraWithAIWorksAndroid\agora-aiworks\src\main\jniLibs\arm64-v8a |
32位c++库 libc++_shared.so |
AgoraWithAIWorksAndroid\agora-aiworks\src\main\jniLibs\armeabi-v7a |
64位opencv库 libopencv_java3.so |
AgoraWithAIWorksAndroid\agora-aiworks\src\main\jniLibs\arm64-v8a |
32位opencv库 libopencv_java3.so |
AgoraWithAIWorksAndroid\agora-aiworks\src\main\jniLibs\armeabi-v7a |
换背景资源包 | AgoraWithAIWorksAndroid\agora-aiworks\src\main\assets\resource |
换背景模型文件 | AgoraWithAIWorksAndroid\agora-aiworks\src\main\assets\AIWorksModels\PS_C_v1_n_small.m.bin |
使用 RtcEngine create(RtcEngineConfig config)
初始化方法
//更换为开发者自己的appID
private static final String appId = "#YOUR APP ID#";
......
RtcEngineConfig config = new RtcEngineConfig();
config.mContext = this;
config.mAppId = appId;
//通过插件提供的接口获取native provider句柄
long provider = ExtensionManager.nativeGetExtensionProvider(this, ExtensionManager.VENDOR_NAME);
//注册native provider句柄,其中:vender用于区分不同的插件,observer用于监听该插件的消息
config.addExtensionProvider(ExtensionManager.VENDOR_NAME, provider);
......
mRtcEngine = RtcEngine.create(config);
//enable插件(废弃)
//mRtcEngine.enableExtension(ExtensionManager.VENDOR_NAME, true);
2.1 addExtensionProvider
可多次调用,以注册多个插件(需使用不同的VENDOR_NAME
)
2.2 注册插件的消息回调需要实现 io.agora.rtc2.IMediaExtensionObserver
的 onEvent
接口
并需要调用config.mExtensionObserver = this;
@Override
public void onEvent(String vendor, String key, String value) {
//vendor即为上述注册插件时的VENDOR_NAME,key/value是插件消息的键值对
......
}
设置插件参数
参数用 json 的方式传输,第一个参数是VideoSourceType的类型,第二个参数是注册的vendor名,第三个参数是参数的键,第四个参数是json字符串。
// Android
RtcEngine.setExtensionProperty(VideoSourceType,VENDOR_NAME, propertyKey, propertyString);
参数解释如下
{
"plugin.aiworks.awEnabled": "true,启用插件功能 false,不启用插件功能",
"plugin.aiworks.awSensorOri": "设备传感器方向角",
"plugin.aiworks.awBGModelPath": "换背景模型路径",
"plugin.aiworks.awBGResourcePath": "换背景资源路径",
"plugin.aiworks.awBGRelease": "换背景资源释放"
}
AIWorks 换背景 API 说明
/*
* 虚拟背景SDK初始化前调用,用于程序性能微调,一般情况下保持默认
* @threadNum cpu 线程数默认值2
* @useGPU true启用GPU,false不启用GPU
*/
AW_SDK_API
void aw_effect_set_params(int threadNum, bool useGPU);
/*
*虚拟背景SDK初始化
*@modelDir: 模型文件所在目录
*@return: 返回1正常,其他异常
*/
AW_SDK_API
int aw_effect_bg_init(const char* modelDir);
/*
* 虚拟背景图切换
*@pic_path: 背景图所在的完整路径
*@is_front:true前摄,false后摄
*/
AW_SDK_API
int aw_effect_bg_pic(const char* pic_path, bool is_front);
/*
* 虚拟背景渲染引擎
* @data[inout] 预览数据[YUV420sp(NV21)/YUV420p(YV12)/YUVI420/RGBA]
* @preview_width 预览宽
* @preview_height 预览高
* @oration 设备旋转角度
* @is_front:true前摄,false后摄
*/
AW_SDK_API
int aw_effect_bg_replace(unsigned char* data, int preview_width, int preview_height, int oration, bool is_front);
/**
* 虚拟背景SDK资源释放
*/
AW_SDK_API
int aw_effect_bg_release();
将所需相关依赖文件放到指定目录
功能模块 | 依赖文件 |
---|---|
虚拟背景背景模块 | AWPortrait.framework |
虚拟背景背景模块 | mnn.metallib (注意:此文件需要放在工程的根目录下) |
功能模块 | 资源文件 |
---|---|
虚拟背景背景模块 | AWPortrait.framework -> backmodel/PS_C_n_v3_finger_small.m.bin (模型文件) |
虚拟背景背景模块 | AWPortrait.framework -> pics (资源文件) |
初始化AIWorks plugin
使用 RtcEngine sharedEngineWithConfig
初始化方法
// iOS
AgoraRtcEngineConfig *cfg = [AgoraRtcEngineConfig new];
cfg.appId = appID;
AwVideoFilterManager *provider = [AwVideoFilterManager sharedInstance];
[provider loadPlugin];
AwVideoExtensionObject *obj = [provider mediaFilterExtension];
obj.observer = self;
cfg.mediaFilterExtensions = @[obj];
self.agoraKit = [AgoraRtcEngineKit sharedEngineWithConfig:cfg delegate:self];
注册虚拟背景的回调
// iOS
cfg.eventDelegate = self; // self为实现了AgoraMediaFilterEventDelegate接口的对象
其中 self 需要实现以下 protocol
// iOS
@protocol AgoraMediaFilterEventDelegate <NSObject>
- (void)onEvent:(NSString * __nullable)vendor
key:(NSString * __nullable)key
json_value:(NSString * __nullable)json_value;
@end
设置插件参数
设置模型加载,虚拟背景,参数用 json 的方式传输
// iOS
[[AwVideoFilterManager sharedInstance] setParameter:jsonString];
参数解释如下
{
"plugin.aiworks.awEnabled": "true,启用插件功能 false,不启用插件功能",
"plugin.aiworks.awSensorOri": "设备传感器方向角",
"plugin.aiworks.awBGModelPath": "换背景模型路径",
"plugin.aiworks.awBGResourcePath": "换背景资源路径",
"plugin.aiworks.awBGRelease": "换背景资源释放"
}
PS: 需要使用SDK Cpp相关Interface,需要引入AgoraRtcKit2.framework
, 需要Emedded & Sign
AIWorks 虚拟背景 API 说明
/*
*虚拟背景SDK初始化
*@modelDir: 模型文件所在目录
*@return: 返回1正常,其他异常
*/
AW_SDK_API
int aw_effect_bg_init(const char* modelDir);
/*
* 虚拟背景图切换
*@pic_path: 背景图所在的完整路径
*@is_front:true前摄,false后摄
*/
AW_SDK_API
int aw_effect_bg_pic(const char* pic_path, bool is_front);
/*
* 虚拟背景渲染引擎
* @data[inout] 预览数据[YUV420sp(NV21)/YUV420p(YV12)/YUVI420/RGBA]
* @preview_width 预览宽
* @preview_height 预览高
* @oration 设备旋转角度
* @is_front:true前摄,false后摄
*/
AW_SDK_API
int aw_effect_bg_replace(unsigned char* data, int preview_width, int preview_height, int oration, bool is_front);
/**
* 虚拟背景SDK资源释放
*/
AW_SDK_API
int aw_effect_bg_release();