tencent cloud

腾讯特效 SDK

动态与公告
产品动态
关于腾讯特效 SDK V3.5 版本更新公告
关于腾讯特效 SDK V3.0 版本相关接口及素材变更公告
产品简介
产品概述
产品功能
基本概念
产品优势
应用场景
购买指南
价格总览
购买流程
欠费退费说明
新手指引
Demo 体验
免费测试
License 指引
移动端 License 新增与续期
PC 端 License 新增与续期
Web端 License 新增与续期
常见问题
SDK 下载
功能说明
SDK 下载
版本历史
SDK 集成指引(无 UI)
通用集成腾讯特效
原子能力集成指引
SDK 集成指引(含 UI)
通用集成腾讯特效
直播 SDK 集成腾讯特效
TRTC SDK 集成腾讯特效
短视频 SDK 集成腾讯特效
Avatar 虚拟人集成指引
API 文档
iOS
Android
Flutter
Web
功能实践
SDK 包瘦身
SDK 集成问题排查
性能调优
效果调优
素材使用
美颜参数说明
美颜场景推荐参数
短视频企业版迁移指引
第三方推流接入美颜(Flutter)
小程序美颜特效实践
素材制作工具使用
Web 美颜特效
产品概述
快速上手
SDK 接入
API 文档
控制台指南
Demo 体验
内置素材总览
实践教程
常见问题
常见问题
通用类相关
技术类相关
License 相关
旧版文档
美颜场景推荐参数
美颜参数表
一分钟集成 TRTC
一分钟集成直播
TE SDK 政策
隐私协议
数据处理和安全协议
联系我们

iOS(3.3.0及以前)

PDF
聚焦模式
字号
最后更新时间: 2024-07-05 12:35:44

集成准备

1. 下载并解压 Demo 包,将 Demo 工程中的 xmagic 模块(bundle,XmagicIconRes,Xmagic 文件夹)导入到实际项目工程中。
2. 如果使用的 XMagic SDK 版本在2.5.0之前,导入 SDK 目录中的 libpag.frameworkMasonry.frameworkXMagic.frameworkYTCommonXMagic.framework如果使用的 XMagic SDK 版本在2.5.1及以后,导入 SDK 目录中的 libpag.frameworkMasonry.frameworkXMagic.frameworkYTCommonXMagic.frameworkAudio2Exp.frameworkTEFFmpeg.framework(version3.0.0以后,改名为:TECodec.framework)
3. framework 签名 General > Masonry.frameworklibpag.frameworkEmbed & SignYTCommonXMagic.framework 在版本2.5.1之前选 Do Not Embed,在版本2.5.1及以后选 Embed & Sign。
4. 将 Bundle ID 修改成与申请的测试授权一致。

开发者环境要求

开发工具 XCode 14 及以上:App Store 或单击 下载地址
建议运行环境:
设备要求:iPhone 5 及以上;iPhone 6 及以下前置摄像头最多支持到 720p,不支持 1080p。
系统要求:iOS 10.0 及以上。

C/C++层开发环境

XCode 默认 C++ 环境。
类型
依赖库
系统依赖库
Accelerate
AssetsLibrary
AVFoundation
CoreMedia
CoreFoundation
CoreML
Foundation
JavaScriptCore
libc++.tbd
libz.b
libresolv.tbd
libsqlite3.0.tbd
MetalPerformanceShaders
MetalKit
MobileCoreServices
OpneAL
OpneGLES
Security
ReplayKit
SystemConfiguration
UIKit
自带的库
YTCommon(鉴权静态库)
XMagic(美颜静态库)
libpag(视频解码动态库)
Masonry(控件布局库)
TXLiteAVSDK_Professional
TXFFmpeg(version3.0.0以后,改名为:TECodec.framework)
TXSoundTouch
Audio2Exp(xmagic sdk version在2.5.1及以后的版本才有)
TEFFmpeg(xmagic sdk version在2.5.1及以后的版本才有)

SDK 接口集成

objective-c
swift
步骤一步骤二 可参考 Demo 工程中,ThirdBeautyViewController 类 viewDidLoad,buildBeautySDK 方法;AppDelegate类的application方法进行了Xmagic鉴权。
步骤四步骤七 可参考 Demo 工程的 ThirdBeautyViewControllerBeautyView 类相关示例代码。
步骤一 可参考 Demo 工程中,ThirdBeautyEnterViewController 类viewDidLoad中的TELicenseCheck.setTELicense。
步骤二步骤七 可参考 Demo 工程的 ThirdBeautyViewController,BeautyView 类相关示例代码。
说明
在 swift 项目中集成 XMagic SDK 时,如果 XMagic SDK 的版本在version3.0.0.3及以上版本时,支持模块引用。
import XMagic
如果 XMagic SDK 的版本在version3.0.0.3以前,需要以桥接文件的方式引入头文件,具体步骤是:
1. 创建桥接头文件。例如***-Bridging-Header.h,并添加如下代码#import "XMagic.h"。
2. 配置工程BuildSettingObjective-c Bridging header选项。设置桥接文件的路径并添加到 Objective-c Bridging header中( 如:$(SRCROOT)/SwiftCallOC/***-Bridging-Header.h,根据项目具体路径确定),编译运行即可。

步骤一:初始化授权

XMagic 鉴权:在相关业务模块的初始化代码中设置 URL 和 KEY,触发 License 下载,避免在使用前才临时去下载。也可以在 AppDelegatedidFinishLaunchingWithOptions 方法里触发下载。其中,LicenseURLLicenseKey 是控制台绑定 License 时生成的授权信息。SDK 版本在2.5.1以前,TELicenseCheck.hXMagic.framework里面;SDK 版本在2.5.1及以后,TELicenseCheck.hYTCommonXMagic.framework里面。
objective-c
swift
[TELicenseCheck setTELicense:LicenseURL key:LicenseKey completion:^(NSInteger authresult, NSString * _Nonnull errorMsg) {
if (authresult == TELicenseCheckOk) {
NSLog(@"success");
} else {
NSLog(@"failed");
}
}];
TELicenseCheck.setTELicense(LicenseURL, key: LicenseKey) { authresult, errorMsg in
if authresult == 0{
print("success")
}else{
print("failed")
}
}
鉴权 errorCode 说明
错误码
说明
0
成功。Success
-1
输入参数无效,例如 URL 或 KEY 为空
-3
下载环节失败,请检查网络设置
-4
从本地读取的 TE 授权信息为空,可能是 IO 失败引起
-5
读取 VCUBE TEMP License文件内容为空,可能是 IO 失败引起
-6
v_cube.license 文件 JSON 字段不对。请联系腾讯云团队处理
-7
签名校验失败。请联系腾讯云团队处理
-8
解密失败。请联系腾讯云团队处理
-9
TELicense 字段里的 JSON 字段不对。请联系腾讯云团队处理
-10
从网络解析的 TE 授权信息为空。请联系腾讯云团队处理
-11
把TE授权信息写到本地文件时失败,可能是 IO 失败引起
-12
下载失败,解析本地 asset 也失败
-13
鉴权失败
其他
请联系腾讯云团队处理

步骤二:设置 SDK 素材资源路径

objective-c
swift
- (void)buildBeautySDK:(int)width and:(int)height texture:(unsigned)textureID {
NSDictionary *assetsDict = @{@"core_name":@"LightCore.bundle",
@"root_path":[[NSBundle mainBundle] bundlePath]};
// 初始化SDK:width和height分别是texture的宽高
self.xMagicKit = [[XMagic alloc] initWithRenderSize:CGSizeMake(width,height) assetsDict:assetsDict];
}
///初始化SDK
func buildBeautySDK(width:UInt32,height:UInt32,texture:GLuint){
let assetsDict:[String:String] = ["core_name":"LightCore.bundle", "root_path":Bundle.main.bundlePath]
let sise = CGSize(width: CGFloat(width), height: CGFloat(height))
xMagic = XMagic.init(renderSize: sise, assetsDict: assetsDict)
}


步骤三:添加日志和事件监听

objective-c
swift
// Register log
[self.xMagicKit registerSDKEventListener:self];
[self.xMagicKit registerLoggerListener:self withDefaultLevel:YT_SDK_ERROR_LEVEL];
xMagic?.register(self)
xMagic?.registerLoggerListener(self, withDefaultLevel: YtSDKLoggerLevel.YT_SDK_DEBUG_LEVEL)

步骤四:配置美颜各种效果(详细美颜效果配置请参考 美颜参数说明 和 Demo)

// @brief 配置美颜各种效果
// @param propertyType 效果类型 字符串:beauty, lut, motion
// @param propertyName 效果名称
// @param propertyValue 效果数值
// @param extraInfo 预留扩展, 附加额外配置dict
// @return 成功返回0,失败返回其他
- (int)configPropertyWithType:(NSString *_Nonnull)propertyType withName:(NSString *_Nonnull)propertyName withData:(NSString*_Nonnull)propertyValue withExtraInfo:(id _Nullable)extraInfo;

步骤五:进行渲染处理

TRTC SDK 设置第三方美颜的视频数据回调:设置该回调之后,TRTC SDK 会把采集到的视频帧通过您设置的 delegate 回调出来,用于第三方美颜组件进行二次处理。
objective-c
swift
[self.trtcCloud setLocalVideoProcessDelegete:self pixelFormat:TRTCVideoPixelFormat_Texture_2D bufferType:TRTCVideoBufferType_Texture];
trtcCloud.setLocalVideoProcessDelegete(self, pixelFormat: TRTCVideoPixelFormat._Texture_2D, bufferType:.texture)
在视频帧回调接口 onProcessVideoFrame:(TRTCVideoFrame *_Nonnull)srcFrame dstFrame:(TRTCVideoFrame *_Nonnull)dstFrame
中,构造 YTProcessInput 传入到 SDK 内做渲染处理,可参考 Demo 中的 ThirdBeautyViewController。
objective-c
swift
#pragma mark - TRTCVideoFrameDelegate
- (uint32_t)onProcessVideoFrame:(TRTCVideoFrame *_Nonnull)srcFrame dstFrame:(TRTCVideoFrame *_Nonnull)dstFrame {
if (srcFrame.width != _renderSize.width || srcFrame.height != _renderSize.height) {
_renderSize = CGSizeMake(srcFrame.width, srcFrame.height);
if (!_xMagicKit) {
[self buildBeautySDK:srcFrame.width and:srcFrame.height];
} else {
[_xMagicKit setRenderSize:_renderSize];
}
}
YTProcessInput *input = [[YTProcessInput alloc] init];
input.textureData = [[YTTextureData alloc] init];
input.textureData.texture = srcFrame.textureId;
input.textureData.textureWidth = srcFrame.width;
input.textureData.textureHeight = srcFrame.height;
input.dataType = kYTTextureData;
YTProcessOutput *output = [self.xMagicKit process:input withOrigin:YtLightImageOriginTopLeft withOrientation:YtLightCameraRotation0];
dstFrame.textureId = output.textureData.texture;
return 0;
}
#pragma mark - TRTCVideoFrameDelegate

func onProcessVideoFrame(_ srcFrame: TRTCVideoFrame, dstFrame: TRTCVideoFrame) -> UInt32 {
if xMagic == nil {
buildBeautySDK(width: srcFrame.width, height: srcFrame.height, texture: srcFrame.textureId)
}
if xMagic != nil && (heightF != srcFrame.height || widthF != srcFrame.width) {
widthF = srcFrame.width
heightF = srcFrame.height
let rendersize = CGSize(width: CGFloat(srcFrame.width), height: CGFloat(srcFrame.height))
xMagic?.setRenderSize(rendersize)
}
let input = YTProcessInput.init()
input.textureData = YTTextureData.init()
input.textureData?.texture = Int32(srcFrame.textureId)
input.textureData?.textureWidth = Int32(srcFrame.width)
input.textureData?.textureHeight = Int32(srcFrame.height)
input.dataType = kYTTextureData
let output = xMagic?.process(input, with: YtLightImageOrigin(rawValue: 0)!, with: YtLightDeviceCameraOrientation(rawValue: 0)!)
dstFrame.textureId = GLuint((output?.textureData?.texture)!)
return 0
}

步骤六:暂停/恢复/销毁 SDK

objective-c
swift
//暂停SDK
[self.xMagicKit onPause];
//恢复SDK
[self.xMagicKit onResume];
//销毁SDK
[self.xMagicKit clearListeners];
[self.xMagicKit deinit];
self.xMagicKit = nil;
//暂停SDK
xMagic?.onPause()
//恢复SDK
xMagic?.onResume()
//销毁SDK
xMagic?.clearListeners()
xMagic?.deinit()
xMagic = nil

步骤七:布局中添加 SDK 美颜面板

objective-c
swift
UIEdgeInsets gSafeInset;
#if __IPHONE_11_0 && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0
if(gSafeInset.bottom > 0){
}
if (@available(iOS 11.0, *)) {
gSafeInset = [UIApplication sharedApplication].keyWindow.safeAreaInsets;
} else
#endif
{
gSafeInset = UIEdgeInsetsZero;
}

dispatch_async(dispatch_get_main_queue(), ^{
//美颜选项界面
self.beautyContainer = [[BeautyView alloc] init];
[self.view addSubview:self.beautyContainer];
[self.beautyContainer mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo(self.view);
make.centerX.mas_equalTo(self.view);
make.height.mas_equalTo(254);
if(gSafeInset.bottom > 0.0){ // 适配全面屏
make.bottom.mas_equalTo(self.view.mas_bottom).mas_offset(0);
} else {
make.bottom.mas_equalTo(self.view.mas_bottom).mas_offset(-10);
}
}];
});
//初始化xmagic以后,把xmagic对象传给beautyView
beautyView.beautyKitRef = xMagic
view.addSubview(beautyView)
beautyView.snp.makeConstraints { make in
make.height.equalTo(200)
make.bottom.equalTo(switchCamButton.snp.top).offset(10)
make.left.right.equalTo(view)
}



帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈