工作需要, 将腾讯云自带的美颜设置 替换为 拓幻美颜, 记录下遇到的一个问题。
拓幻美颜作为一个第三方美颜sdk, 功能比较多, 对接过程也很方便,直接开整:
-
申请拓幻的appkey
TISDK的初始化是需要一个key来进行鉴权, 自己去申请。
-
下载配置SDK
最新SDK下载地址:TiSDK_iOS
下载完成后,确认TiSDK_iOS 包含:TiSDK.framework
、TiLiveUI 文件夹
(可选)、 TiSDKResource.bundle
将整个TiSDK_iOS
文件夹导入自己的工程中, 如果工程中已经添加Masonry
, SSZipArchive
,将TiUITool
目录下的Masonry.framework
、ZipArchive. framework
删除,避免冲突;
添加依赖库AssetsLibrary.framework
、libc++.tbd
;
动态库TiSDK.framework
选择Embed 类型为:Embed & Sign
-
初始化SDK
TiSDK 初始化函数程序中调用一次即可生效,建议在 Application 创建的时候调用; 如果渲染功能使用不频繁,也可以在使用的时候调用:
导入头文件:#import <TiSDK/TiSDK.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSString* key = kTuoHuanKey;
[TiSDK init:key CallBack:^(InitStatus callBack) {
if (callBack.code == 100) {
// 初始化成功,可自由处理一些需要的逻辑
}
}];
}
-
对接TiLiveUI
导入头文件:#import "TiUIManager.h"
加载UI:
- (void)viewDidLoad {
[super viewDidLoad];
// 这里的`TiUIManagerDelegate`可自由设置, 如果需要另外处理点击事件, 就实现此delegate, 一般用于使用默认UI的时候
[[TiUIManager shareManager] loadToWindowDelegate:nil];
}
在需要美颜设置的方法内调起美颜UI:
[[TiUIManager shareManager] showMainMenuView];
到这里, 拓幻的美颜设置UI已经可以正常调起了, 那我设置了美颜之后要怎么把图像上传, 怎么把拓幻和腾讯云推流对接在一起呢?
腾讯云的直播推流TXLivePush
支持自定义音视频采集和渲染, 那么我们可以把经过拓幻美颜的图像进行采集后二次处理,然后进行推流。
这里用到TXLivePush
的videoProcessDelegate
代理:
// self.livePushLisher 是TXLivePush生成的对象
self.livePushLisher.videoProcessDelegate = self;
实现代理:
-(GLuint)onPreProcessTexture:(GLuint)texture width:(CGFloat)width height:(CGFloat)height {
// OpenGL线程回调中, 调用拓幻的纹理渲染,将渲染后的纹理传给TXLivePush进行推流
return [[TiSDKManager shareManager] renderTexture2D:texture Width:width Height:height Rotation:CLOCKWISE_0 Mirror:self.livePushLisher.config.frontCamera];
}
在OpenGL线程中回调,在这里可以进行采集图像的二次处理
@param texture 纹理ID
@param width 纹理的宽度
@param height 纹理的高度
@return 返回给SDK的纹理
说明:SDK回调出来的纹理类型是GL_TEXTURE_2D,接口返回给SDK的纹理类型也必须是GL_TEXTURE_2D; 该回调在SDK美颜之后. 纹理格式为GL_RGBA
- (GLuint)onPreProcessTexture:(GLuint)texture width:(CGFloat)width height:(CGFloat)height;
到这里, 腾讯云直播对接拓幻, 就结束了。
但是在测试过程中, 发现了一个bug, 当app启动后, 第一次调起美颜UI界面时,背景容器图层为空, 界面显示不正常:
通过对拓幻的UI部分源码的解读, 发现在TiUIManager
中有美颜模块的主要功能UI,也就是美颜UI的容器图层tiUIViewBoxView
, 这个视图中有分类功能图层classifyView
,里面有一个方法:-(void)Judge_pro:(NSString *)key
, 这个方法主要处理功能图层上的UI显示, 所以直接调用一下这个方法, 在showMainMenuView
之前提现把所有的子控件都加载设置一遍:
[[TiUIManager shareManager].tiUIViewBoxView.classifyView Judge_pro:@""];
[[TiUIManager shareManager] showMainMenuView];
之后再次运行, 就正常显示:
结束!
如果对你有用就给个👍吧~