You need to enable JavaScript to run this app.
导航

美颜特效

最近更新时间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 的接入。

前提条件

  • 本功能需付费使用,您可通过提交工单联系技术支持获取 4.4.3 及以上版本的 Standard 或 Lite 版 CV SDK,以及符合业务功能需求的 License 和素材资源包。

说明

完整的授权信息参考智能特效在线授权说明

集成 CV SDK 及资源文件

您可以按需集成 CV SDK 的动态库或静态库。直播 SDK 会动态加载 CV SDK 的函数地址。由于链接器在链接过程会优化掉静态库中未被直接依赖的符号和代码,因此需要修改主工程编译配置,防止链接器优化掉 CV SDK 中相关符号和代码。

集成 CV SDK 动态库及资源文件

  1. 解压 CV 提供的 SDK 文件压缩包,找到动态库和 podspec 文件。4.5.0 之前版本,podspec 文件名称为 ByteEffectSDK.podspec;4.5.0 及后续版本,podspec 文件名称为 EffectsARSDK.podspec
    alt

  2. 在主工程中和 Podfile 文件同级的目录下新建 EffectsARSDK 文件夹 (文件夹名称需要和步骤一中的 podspec 文件名称一致),并将您在步骤一中获取的动态库和 podspec 文件拷贝到该文件夹内。
    alt

  3. 在步骤二创建的文件夹内新建 Resource 文件夹,把 CV 资源文件解压拷贝到该目录。
    alt

  4. 参照以下示例修改 podspec 文件。

Pod::Spec.new do |s|
# ... 旧的配置
# 静态库文件,如果原有配置有,则无需增加
s.vendored_frameworks = 'effect-sdk.framework'
# 资源文件
s.resources = "Resource/*.bundle"
end
  1. 修改 Podfile 文件,重新执行 pod install
target 'APP_TARGET' do
  # pod 'PODSPEC_FILE_NAME', :path => 'PODSPEC_FILE_PATH'
  # 此处以文件夹名为 EffectsARSDK, podspec 文件名为 EffectsARSDK.podspec 举例
  pod 'EffectsARSDK', :path => './EffectsARSDK'
end
  1. 执行完成后,打开工程检查资源及 SDK 是否集成完成。

alt

说明

如配置时出现异常,可参考异常处理操作。

集成 CV SDK 静态库及资源文件

  1. 解压 CV SDK 文件压缩包,找到静态库和 podspec 文件。4.5.0 之前版本,podspec 文件名称为 ByteEffectSDK.podspec;4.5.0 及后续版本,podspec 文件名称为 EffectsARSDK.podspec
    alt

  2. 在主工程和 Podfile 文件同级的目录下新建 EffectsARSDK 文件夹(文件夹名称需要和步骤一中的 podspec 文件名称一致),并将您在步骤一中获取的静态库和 podspec 文件拷贝到该文件夹内。
    alt

  3. 在步骤二创建的文件夹内新建 Resource 文件夹,并将 CV 资源文件解压拷贝到该目录。
    alt

  4. 参照以下示例修改 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
  1. 修改 Podfile 文件,重新执行 pod install
target 'APP_TARGET' do
  # pod 'PODSPEC_FILE_NAME', :path => 'PODSPEC_FILE_PATH'
  # 此处以文件夹名为 EffectsARSDK, podspec 文件名为 EffectsARSDK.podspec 举例
  pod 'EffectsARSDK', :path => './EffectsARSDK'
end
  1. 执行完成后,打开工程检查资源及 SDK 是否集成完成。

alt

调用直播 SDK 接口

本章节介绍如何调用直播 SDK 接口,实现美颜、贴纸等功能。

API 时序图

alt

初始化

调用 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 installtarget overrides the STRIP_STYLE 错误,表示 podspec 中的 STRIP_STYLE 配置不生效,可参考手动配置中的说明修改。
  • 如果编译 app 提示 _bef_xxx 符号不存在,请检查是否已集成 CV SDK 静态库以及版本号是否正确。目前直播 SDK 支持的 CV SDK 最低版本为 4.4.3。