最近更新时间:2024.01.11 16:20:32
首次发布时间:2022.08.30 16:59:12
直播 SDK 提供与智能美化特效(CV)SDK 联合方案,您可以通过调用直播 SDK 提供的美颜处理接口,快速接入 CV 功能,对本地采集的视频添加美颜、滤镜、贴纸等特效,相较于通过直播 SDK 自定义视频处理功能接入第三方美颜,集成更快捷、使用更方便、效果更佳。
本文介绍如何在直播应用中接入 CV SDK,并调用直播 SDK 接口实现美颜、滤镜等功能。另外,您也可以参考 veVOS Demo 中直播推流部分的实现,完成 CV SDK 的接入。
说明
完整的授权信息参考智能特效在线授权说明。
您可以按需集成 CV SDK 的动态库或静态库。直播 SDK 会动态加载 CV SDK 的函数地址。由于链接器在链接过程会优化掉静态库中未被直接依赖的符号和代码,因此需要修改主工程编译配置,防止链接器优化掉 CV SDK 中相关符号和代码。
解压 CV 提供的 SDK 文件压缩包,找到动态库和 podspec
文件。4.5.0 之前版本,podspec
文件名称为 ByteEffectSDK.podspec
;4.5.0 及后续版本,podspec
文件名称为 EffectsARSDK.podspec
。
在主工程中和 Podfile
文件同级的目录下新建 EffectsARSDK
文件夹 (文件夹名称需要和步骤一中的 podspec
文件名称一致),并将您在步骤一中获取的动态库和 podspec
文件拷贝到该文件夹内。
在步骤二创建的文件夹内新建 Resource
文件夹,把 CV 资源文件解压拷贝到该目录。
参照以下示例修改 podspec
文件。
Pod::Spec.new do |s| # ... 旧的配置 # 静态库文件,如果原有配置有,则无需增加 s.vendored_frameworks = 'effect-sdk.framework' # 资源文件 s.resources = "Resource/*.bundle" end
Podfile
文件,重新执行 pod install
。target 'APP_TARGET' do # pod 'PODSPEC_FILE_NAME', :path => 'PODSPEC_FILE_PATH' # 此处以文件夹名为 EffectsARSDK, podspec 文件名为 EffectsARSDK.podspec 举例 pod 'EffectsARSDK', :path => './EffectsARSDK' end
说明
如配置时出现异常,可参考异常处理操作。
解压 CV SDK 文件压缩包,找到静态库和 podspec
文件。4.5.0 之前版本,podspec
文件名称为 ByteEffectSDK.podspec
;4.5.0 及后续版本,podspec
文件名称为 EffectsARSDK.podspec
。
在主工程和 Podfile
文件同级的目录下新建 EffectsARSDK
文件夹(文件夹名称需要和步骤一中的 podspec
文件名称一致),并将您在步骤一中获取的静态库和 podspec
文件拷贝到该文件夹内。
在步骤二创建的文件夹内新建 Resource
文件夹,并将 CV 资源文件解压拷贝到该目录。
参照以下示例修改 podspec
文件。
Pod::Spec.new do |s| # ... 旧的配置 # 注意 -Wl 前面没有空格 be_effect_symbols = <<EOF -Wl,-u,_bef_effect_ai_get_version -Wl,-u,_bef_effect_ai_check_license -Wl,-u,_bef_effect_ai_check_license_buffer -Wl,-u,_bef_effect_ai_create -Wl,-u,_bef_effect_ai_destroy -Wl,-u,_bef_effect_ai_init -Wl,-u,_bef_effect_ai_use_pipeline_processor -Wl,-u,_bef_effect_ai_set_intensity -Wl,-u,_bef_effect_ai_set_color_filter_v2 -Wl,-u,_bef_effect_ai_set_camera_device_position -Wl,-u,_bef_effect_ai_composer_set_nodes -Wl,-u,_bef_effect_ai_algorithm_texture -Wl,-u,_bef_effect_ai_process_texture -Wl,-u,_bef_effect_ai_composer_set_mode -Wl,-u,_bef_effect_ai_set_width_height -Wl,-u,_bef_effect_ai_composer_update_node -Wl,-u,_bef_effect_ai_matting_check_license -Wl,-u,_bef_effect_ai_portrait_matting_init_model -Wl,-u,_bef_effect_ai_portrait_matting_destroy -Wl,-u,_bef_effect_ai_portrait_matting_set_param -Wl,-u,_bef_effect_ai_portrait_matting_do_detect -Wl,-u,_bef_effect_ai_portrait_get_output_shape -Wl,-u,_bef_effect_ai_portrait_matting_create -Wl,-u,_bef_effect_ai_set_orientation -Wl,-u,_bef_effect_ai_get_face_detect_result -Wl,-u,_bef_effect_ai_get_license_wrapper_instance -Wl,-u,_bef_effect_ai_set_render_api -Wl,-u,_bef_effect_ai_use_builtin_sensor -Wl,-u,_bef_effect_ai_check_online_license -Wl,-u,_bef_effect_ai_set_effect -Wl,-u,_bef_effect_ai_composer_set_nodes_with_tags -Wl,-u,_bef_effect_ai_composer_append_nodes -Wl,-u,_bef_effect_ai_composer_append_nodes_with_tags -Wl,-u,_bef_effect_ai_composer_remove_nodes -Wl,-u,_bef_effect_ai_load_resource_with_timeout -Wl,-u,_bef_effect_ai_set_algorithm_force_detect -Wl,-u,_bef_effect_ai_process_touch -Wl,-u,_bef_effect_ai_process_gesture -Wl,-u,_bef_effect_add_log_to_local_func_with_key -Wl,-u,_bef_effect_remove_log_to_local_func_with_key -Wl,-u,_bef_effect_load_egl_library_with_func -Wl,-u,_bef_effect_load_glesv2_library_with_func -Wl,-u,_bef_effect_ai_face_detect_create -Wl,-u,_bef_effect_ai_face_detect_destroy -Wl,-u,_bef_effect_ai_face_detect_setparam -Wl,-u,_bef_effect_ai_face_detect -Wl,-u,_bef_effect_ai_face_check_license -Wl,-u,_bef_effect_ai_set_render_cache_texture_with_buffer EOF # 注意:EOF 前面没有空格 # 修改主工程编译配置,防止链接器优化掉 CV SDK 中相关符号和代码 ldflags = be_effect_symbols.split(" ").map{|s| s.strip}.join(' ') s.user_target_xcconfig = { 'STRIP_STYLE' => "non-global", 'OTHER_LDFLAGS' => "#{ldflags}" } # 静态库文件,如果原有配置有,则无需增加 s.vendored_libraries = 'libeffect-sdk.a' # 资源文件 s.resources = "Resource/*.bundle" end
Podfile
文件,重新执行 pod install
。target 'APP_TARGET' do # pod 'PODSPEC_FILE_NAME', :path => 'PODSPEC_FILE_PATH' # 此处以文件夹名为 EffectsARSDK, podspec 文件名为 EffectsARSDK.podspec 举例 pod 'EffectsARSDK', :path => './EffectsARSDK' end
本章节介绍如何调用直播 SDK 接口,实现美颜、贴纸等功能。
调用 initWithConfig
创建引擎并开启视频采集后,您需先初始化美颜资源,并设置美颜资源和证书路径,方可开启美颜,在本地预览画面中看到美颜效果。您需设置完整的证书文件路径,即指定到具体的证书文件;模型文件路径指定到 ModelResource.bundle
这层即可。
集成完成后,可通过调用 setEnable:
查看返回值,0 表示集成成功,非 0 表示集成失败。
// 注意:本方法只在工程中集成过智能美化特效的SDK时生效 VeLiveVideoEffectManager *effectManager = [self.livePusher getVideoEffectManager]; // License 路径,请根据工程配置查找正确的路径 NSString *licensePath = [NSBundle.mainBundle pathForResource:@"LicenseBag.bundle/xxx.licbag" ofType:nil]; // 资源包路径 NSString *algoModelPath = [NSBundle.mainBundle pathForResource:@"ModelResource.bundle" ofType:nil]; if (![NSFileManager.defaultManager fileExistsAtPath:licensePath]) { return; } // 创建美颜配置 VeLiveVideoEffectLicenseConfiguration *licConfig = [[VeLiveVideoEffectLicenseConfiguration alloc] initWithPath:licensePath]; // 设置美颜配置 [effectManager setupWithConfig:licConfig]; // 设置算法包路径 [effectManager setAlgoModelPath:algoModelPath]; // 开启美颜特效处理 if ([effectManager setEnable:YES] != 0) { NSLog(@"VeLiveQuickStartDemo: license unavailable, please check"); } // 关闭所有美颜特效 [effectManager setEnable:NO];
美颜特效素材存放在 ComposeMakeup.bundle
文件中,您需使用 setComposeNodes
设置素材路径并使用 updateComposerNodeIntensity
更新特效强度才会显示美颜效果。updateComposerNodeIntensity
可以设置的素材 key 可以参考素材 key 对应说明。
注意
资源路径需要指定到 ../ComposeMakeup.bundle/ComposeMakeup/beauty_IOS_lite
这层。
// 根据特效资源包,查找正确的资源路径,一般到 reshape_lite、beauty_IOS_lite 目录 NSString *beautyPath = [NSBundle.mainBundle pathForResource:@"ComposeMakeup.bundle/xxx" ofType:nil]; if (![NSFileManager.defaultManager fileExistsAtPath:beautyPath]) { return; } // 设置美颜美型特效资源包 [self.livePusher.getVideoEffectManager setComposeNodes:@[beautyPath]]; // 设置美颜美型特效强度, NodeKey 可在 资源包下的 .config_file 中获取,如果没有 .config_file ,请联系商务咨询 [self.livePusher.getVideoEffectManager updateComposerNodeIntensity:beautyPath nodeKey:@"whiten" intensity:0.5];
滤镜特效素材存放在 FilterResource.bundle
文件中,您需使用 setFilter
设置素材路径并使用 updateFilterIntensity
设置滤镜强度后方可显示滤镜效果。
注意
滤镜路径需要指定到特定滤镜名,例如 ../FilterResource.bundle/Filter/Filter_01_38
。
// 滤镜资源包,查找正确的资源路径,一般到 Filter_01_xx 目录 NSString *filterPath = [NSBundle.mainBundle pathForResource:@"FilterResource.bundle/xxx" ofType:nil]; if (![NSFileManager.defaultManager fileExistsAtPath:filterPath]) { return; } // 设置滤镜资源包路径 [self.livePusher.getVideoEffectManager setFilter:filterPath]; // 设置滤镜特效强度 [self.livePusher.getVideoEffectManager updateFilterIntensity:0.5];
贴纸特效素材存放在 StickerResource.bundle
文件中,您需使用 setSticker
设置素材路径后方可显示贴纸效果。
注意
贴纸路径需要指定到特定贴纸名,例如 ../StickerResource.bundle/stickers/stickers_zhaocaimao
。
// 贴纸资源包,查找正确的资源路径,一般到 stickers/xxx 目录 NSString *stickerPath = [NSBundle.mainBundle pathForResource:@"StickerResource.bundle/xxx" ofType:nil]; if (![NSFileManager.defaultManager fileExistsAtPath:stickerPath]) { return; } // 设置贴纸资源包路径 [self.livePusher.getVideoEffectManager setSticker:stickerPath];
风格妆特效素材存放在 ComposeMakeup.bundle
文件中,您需使用 setComposeNodes
设置素材路径并使用 updateComposerNodeIntensity
更新特效强度方可显示风格妆效果。updateComposerNodeIntensity
可以设置的素材 key 可以参考素材 key 对应说明。
注意
风格妆路径需要指定到特定风格妆名,例如 ../ComposeMakeup.bundle/ComposeMakeup/style_makeup/aidou
。
// 根据特效资源包,查找正确的资源路径,一般到 style_makeup 目录 NSString *beautyPath = [NSBundle.mainBundle pathForResource:@"ComposeMakeup.bundle/style_makeup/xxx" ofType:nil]; if (![NSFileManager.defaultManager fileExistsAtPath:beautyPath]) { return; } // 设置美颜美型特效资源包 [self.livePusher.getVideoEffectManager setComposeNodes:@[beautyPath]]; // 设置美颜美型特效强度 [self.livePusher.getVideoEffectManager updateComposerNodeIntensity:beautyPath nodeKey:@"Filter_ALL" intensity:0.5]; [self.livePusher.getVideoEffectManager updateComposerNodeIntensity:beautyPath nodeKey:@"Makeup_ALL" intensity:0.5];
pod install
报错,请检查 -Wl
前面是否有空格,以及结尾的 EOF
符号前面是否有空格。pod install
报 target overrides the STRIP_STYLE
错误,表示 podspec
中的 STRIP_STYLE
配置不生效,可参考手动配置中的说明修改。_bef_xxx
符号不存在,请检查是否已集成 CV SDK 静态库以及版本号是否正确。目前直播 SDK 支持的 CV SDK 最低版本为 4.4.3。