iOS(3.3.0及以前)

集成准备

1. 下载并解压 Demo 包
2. 将 Demo工程中的 xmagic 模块(bundle,XmagicIconRes,Xmagic 文件夹)导入到实际项目工程中。
3. 如果使用的 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)
4. framework 签名 General > Masonry.frameworklibpag.frameworkEmbed & SignYTCommonXMagic.framework 在版本2.5.1之前选 Do Not Embed,在版本2.5.1及以后选 Embed & Sign。
5. 将 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
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 接口集成

步骤一步骤二 可参考 Demo 工程中,ThirdBeautyViewControllerviewDidLoadbuildBeautySDK 方法;AppDelegate类的application方法进行了Xmagic鉴权。
步骤四步骤七 可参考 Demo 工程的 ThirdBeautyViewControllerBeautyView 类相关示例代码。

步骤一:初始化授权

1. 首先在工程 AppDelegatedidFinishLaunchingWithOptions 中添加如下鉴权代码,其中 LicenseURLLicenseKey 为腾讯云官网申请到授权信息,请参见 License 指引
[TXLiveBase setLicenceURL:LicenseURL key:LicenseKey];
2. Xmagic 鉴权:在相关业务模块的初始化代码中设置 URL 和 KEY,触发 License 下载,避免在使用前才临时去下载。也可以在 AppDelegatedidFinishLaunchingWithOptions 方法里触发下载。其中 LicenseURLLicenseKey 是控制台绑定 License 时生成的授权信息。SDK版本在2.5.1以前,TELicenseCheck.hXMagic.framework里面;SDK版本在2.5.1及以后,TELicenseCheck.h
YTCommonXMagic.framework里面。
[TELicenseCheck setTELicense:LicenseURL key:LicenseKey completion:^(NSInteger authresult, NSString * _Nonnull errorMsg) {
if (authresult == TELicenseCheckOk) {
NSLog(@"鉴权成功");
} else {
NSLog(@"鉴权失败");
}
}];
鉴权 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 素材资源路径

- (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];
}

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

// Register log
[self.beautyKit registerSDKEventListener:self];
[self.beautyKit registerLoggerListener:self withDefaultLevel:YT_SDK_ERROR_LEVEL];

步骤四:配置美颜各种效果

- (int)configPropertyWithType:(NSString *_Nonnull)propertyType withName:(NSString *_Nonnull)propertyName withData:(NSString*_Nonnull)propertyValue withExtraInfo:(id _Nullable)extraInfo;

步骤五:进行渲染处理

在视频帧回调接口,构造 YTProcessInput 传入到 SDK 内做渲染处理,可参考 Demo 中的 ThirdBeautyViewController。
[self.xMagicKit process:inputCPU withOrigin:YtLightImageOriginTopLeft withOrientation:YtLightCameraRotation0]

步骤六:暂停/恢复 SDK

[self.beautyKit onPause];
[self.beautyKit onResume];

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

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(), ^{
//美颜选项界面
_vBeauty = [[BeautyView alloc] init];
[self.view addSubview:_vBeauty];
[_vBeauty 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);
}
}];
_vBeauty.hidden = YES;
});