tencent cloud

文档反馈

iOS(3.3.0及以前)

最后更新时间: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)
    }
    
    
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持