(1)如果用户更换新滤镜,用户需要在控制台重新打包下载资源文件,然后替换到对应位置。操作步骤参考集成向导「安装与更新」。
(2)替换资源文件后,查看资源文件(TuSDK.bundle/others/lsq_config.json)中滤镜的 filerCode,替换到项目中对应的位置。
(3)替换滤镜资源后,需要根据新的 filterCode 更改对应滤镜效果缩略图文件的名称。
(4) "name":"lsq_filter_VideoFair",VideoFair 就是该滤镜的filterCode ,在_videoFilters = @[@"VideoFair"]; 可以进行选择使用滤镜的设置。
如果用户工程已使用 GPUImage 的部分功能,建议用户使用 Github 提供的 完整版GPUImage 。如果在使用完整版 GPUImage 的过程中有什么问题,可以参考文档 GPUImage 的相关错误。
用户需要自行设计滤镜封面图。SDK demo 中滤镜栏展示的滤镜的封面图 Resources/Images 文件夹中,缩略图图片有固定的命名格式需要和代码中调用的滤镜的代号匹配(filterCode),命名规则为lsq_filter_thumb_「filterCode」,例如lsq_filter_thumb_jelly.jpg。
SDK demo 中的文案在Resources/Localized文件夹中,用户可以根据实际需求修改文案的显示或者可以直接在 UI 代码中进行直接修改,使用文案时请务必不要将 *InfoPlist.strings* 文件复制到工程中,以免造成应用名显示问题。
需要进行以下设置
    // 不启动相机预览画面区域显示算法,注释掉该行代码
    // _camera.regionHandler = [[CustomTuSDKCPRegionDefaultHandler alloc]init];
    // 比例设置为 1.0 ,预览画面为 1:1 方形画幅。
    // 比例设置为 0,预览画面为全屏画幅
    _camera.cameraViewRatio = 0;
    // 最终输出的视频尺寸由 outputSize 控制
    // 需要将输出尺寸修改为均为 16 的倍数
    // _camera.outputSize = CGSizeMake(640, 640);
(1)相机控制
    // 输出视频的画质,主要包含码率、分辨率等参数 (默认为空,采用系统设置)
    _camera.videoQuality = [TuSDKVideoQuality makeQualityWith:TuSDKRecordVideoQuality_Low1];
    // 可以进行输出视频文件的码率自定义,配置参数请参考 TuSDKVideo/TuSDKVideoQuality.h
    TuSDKVideoQuality *customVideoQuality = [[TuSDKVideoQuality alloc]init];
    customVideoQuality.lsqVideoBitRate = 1200 * 1000;
    _camera.videoQuality = customVideoQuality;
(2)编辑器控制
         TuSDKMovieEditorOptions *options = [TuSDKMovieEditorOptions defaultOptions];
         .......
        // 设置编码视频的画质
        options.encodeVideoQuality = [TuSDKVideoQuality makeQualityWith:TuSDKRecordVideoQuality_Low1];
录制相机的模式
    // 需要配置相机的录制模式,如果沿用 demo 提供的示例 UI,需要同时配置底部栏的 recordMode
    /**
        录制模式
     */
    typedef NS_ENUM(NSInteger,lsqRecordMode)
    {
        /** 正常模式 */
        lsqRecordModeNormal,
        /** 续拍模式 */
        lsqRecordModeKeep,
    };
    _camera.recordMode = _inputRecordMode;
    _bottomBar.recordMode = _inputRecordMode;
    // 拍照录制相机的录制模式为正常模式
录制相机初始化,默认选择一款滤镜
    // 需要配置相机的默认选择滤镜,如果沿用 demo 提供的示例 UI ,需要同时配置滤镜栏的默认滤镜
    // 设置默认滤镜  对应filterView创建时默认的 currentFilterTag 和相机保持一致
    [_camera switchFilterWithCode:_videoFilters[1]];
    // 注: currentFilterTag 基于200 即:200 + 滤镜列表中某滤镜的对应下标
    _filterView.currentFilterTag = 201;
全屏/视频比例自适应展示设置
    // 可以设置全屏/视频比例自适应展示,如果沿用 demo 提供的示例 UI ,需要进行以下更改
    // 需要将控制器内 - (void)initPlayerView 方法中的部分代码注释
    // _videoScroll 和 _videoView 默认是 frame 为屏幕宽度的 1:1 区域
    // 设置全屏展示时,需要将两者的 frame 设置为屏幕宽高,如不设置将视频按照比例自适应展示。
    // 调整其他控件的背景色的 alpha 值,以防止遮挡视觉效果
    // 需要注释代码如下
       /*
        AVAssetTrack *videoTrack = [_item.asset tracksWithMediaType:AVMediaTypeVideo][0];
        CGSize videoSize = videoTrack.naturalSize;
        // 根据朝向判断是否需要交换宽高
        CGAffineTransform transform = videoTrack.preferredTransform;
        BOOL isNeedSwopWH = NO;
        if (transform.a == 0 && transform.b == 1.0 && transform.c == -1.0 && transform.d == 0) {
            // Right
            isNeedSwopWH = YES;
        }else if (transform.a == 0 && transform.b == -1.0 && transform.c == 1.0 && transform.d == 0){
            // Left
            isNeedSwopWH = YES;
        }else if (transform.a == -1.0 && transform.b == 0 && transform.c == 0 && transform.d == -1.0){
            // Down
            isNeedSwopWH = NO;
        }else{
            // Up
            isNeedSwopWH = NO;
        }
        if (isNeedSwopWH) {
            // 交换宽高
            videoSize = CGSizeMake(videoSize.height, videoSize.width);
        }
        // 如需比例自适应,需要注释下方代码块
        // 此处的宽高计算仅适用于 1:1 情况下,若有其他的适配,请重新修改计算方案
        if (videoSize.width > videoSize.height) {
            // 定高适配宽
            CGSize newSize = CGSizeMake(_videoView.lsqGetSizeHeight*videoSize.width/videoSize.height, _videoView.lsqGetSizeHeight);
            CGFloat offset = (newSize.width - _videoView.lsqGetSizeWidth)/2;
            [_videoView lsqSetSize:newSize];
            _videoScroll.contentSize = newSize;
            _videoScroll.contentOffset = CGPointMake(offset, 0);
        }else{
            // 定宽适配高
            CGSize newSize = CGSizeMake(_videoView.lsqGetSizeWidth, _videoView.lsqGetSizeWidth*videoSize.height/videoSize.width);
            CGFloat offset = (newSize.height - _videoView.lsqGetSizeHeight)/2;
            [_videoView lsqSetSize:newSize];
            _videoScroll.contentSize = newSize;
            _videoScroll.contentOffset = CGPointMake(0, offset);
        }
        */
全屏/视频比例自适应展示设置
    // 可以设置全屏/视频比例自适应展示,如果沿用 demo 提供的示例 UI ,需要进行以下更改
    // 启动时候需要设置参数如下
    MovieEditorFullScreenController *vc = [MovieEditorFullScreenController new];
    vc.inputURL = _inputURL;
    vc.startTime = _startTime;
    vc.endTime = _endTime;
    vc.cropRect = CGRectMake(0, 0, 0, 0);
    // 同时将控制器内 - (void)lsqInitView 中视频展示 _previewView 的 frame 设置为屏幕宽高,画面即为全屏展示
    // 如不设置 _previewView 的 frame 将进行视频比例的自适应的展示
    // 调整其他控件的背景色的 alpha 值,以防止遮挡视觉效果
    // 拍照录制相机连接视频编辑功能,需要进行一些调整
    -(void)viewWillDisappear:(BOOL)animated
    {
        [super viewWillDisappear:animated];
        // 进行页面跳转需要注释销毁相机的代码
        // 相机页面销毁的时候,不要忘记销毁相机
        // [self destroyCamera];
        [self destroyVideoPlayer];
    }
    // 在保存照片或录制的视频的方法中,进行相关控制器的开启
    - (void)savePictureOrVideo
    {
        if (!_takePictureIV.hidden) {
            // 保存照片
            [TuSDKTSAssetsManager saveWithImage:_takePictureIV.image compress:0 metadata:nil toAblum:nil completionBlock:^(id<TuSDKTSAssetInterface> asset, NSError *error) {
                if (!error) {
                    _takePictureIV.image = nil;
                    _takePictureIV.hidden = YES;
                    [[TuSDK shared].messageHub showSuccess:NSLocalizedString(@"lsq_save_saveToAlbum_succeed", @"保存成功")];
                }
            } ablumCompletionBlock:nil];
        }
        if (_videoPlayer && _videoPath) {
            // 保存视频,同时删除临时文件
            [TuSDKTSAssetsManager saveWithVideo:[NSURL fileURLWithPath:_videoPath] toAblum:nil completionBlock:^(id<TuSDKTSAssetInterface> asset, NSError *error) {
                if (!error) {
                    // 需要注释销毁临时文件的方法
                    // 相机最终销毁的时候,不要忘记将临时文件删除
                    // [TuSDKTSFileManager deletePath:_videoPath];
                    // _videoPath = nil;
                    [self destroyVideoPlayer];
                    // [[TuSDK shared].messageHub showSuccess:NSLocalizedString(@"lsq_save_saveToAlbum_succeed", @"保存成功")];
                }
            } ablumCompletionBlock:nil];
            // 开启时间裁剪
            MoviePreviewAndCutRatioAdaptedController *vc = [MoviePreviewAndCutRatioAdaptedController new];
            vc.inputURL = [NSURL fileURLWithPath:_videoPath];
            [self.navigationController pushViewController:vc animated:YES];
        }
        _preView.hidden = YES;
    }
    // 断点续拍相机连接视频编辑功能,需要进行一些调整
    -(void)viewWillDisappear:(BOOL)animated
    {
        [super viewWillDisappear:animated];
        // 进行页面跳转的时候,需要注释下方销毁相机的方法。
        // 相机页面销毁,不要忘记销毁相机
        // [self destroyCamera];
    }
    // 在视频录制完成的代理方法中,进行相关控制器的开启
    - (void)onVideoCamera:(TuSDKRecordVideoCamera *)camerea result:(TuSDKVideoResult *)result;
    {
        // 通过相机初始化设置  _camera.saveToAlbum = NO;  result.videoPath 拿到视频的临时文件路径
        if (result.videoPath) {
            // 进行自定义操作,例如保存到相册
            // UISaveVideoAtPathToSavedPhotosAlbum(result.videoPath, nil, nil, nil);
            // [[TuSDK shared].messageHub showSuccess:NSLocalizedString(@"lsq_save_saveToAlbum_succeed", @"保存成功")];
            // 开启视频编辑添加滤镜
            MovieEditorFullScreenController *vc = [MovieEditorFullScreenController new];
            vc.inputURL = [NSURL fileURLWithPath:result.videoPath];
            // 视频编辑如需全屏展示,参数需要设置 vc.cropRect = CGRectMake(0, 0, 0, 0); 画面展示会进行比例自适应
            vc.cropRect = CGRectMake(0, 0, 0, 0);
            vc.startTime = 0;
            vc.endTime = result.duration;
            [self.navigationController pushViewController:vc animated:true];
        }else{
            // _camera.saveToAlbum = YES; (默认为 :YES)将自动保存到相册
            [[TuSDK shared].messageHub showSuccess:NSLocalizedString(@"lsq_save_saveToAlbum_succeed", @"保存成功")];
        }
        if (_camera && _camera.recordMode == lsqRecordModeNormal) {
            [_bottomBar recordBtnIsRecordingStatu:NO];
        }
        // 自动保存后设置为 恢复进度条状态
        [self changeNodeViewWithLocation:0];
    }
获取到视频的临时文件后,需要保存到指定的相册
    // 录制完成后,拿到临时文件地址可通过以下方法,保存到指定位置
        if (_videoPlayer && _videoPath) {
            // 保存视频,同时删除临时文件
            [TuSDKTSAssetsManager saveWithVideo:[NSURL fileURLWithPath:_videoPath] toAblum:@"自定义相册" completionBlock:^(id<TuSDKTSAssetInterface> asset, NSError *error) {
                if (!error) {
                    // 删除临时文件地址
                    [TuSDKTSFileManager deletePath:_videoPath];
                    _videoPath = nil;
                }
            } ablumCompletionBlock:nil];
        } 
fullScreenSticker.json和squareSticker.json。查看获取贴纸的详情。// 初始化贴纸栏
- (void)createStikerView
{
    if (!_stickerView) {
        CGFloat stickerViewHeight = _bottomBackView.lsqGetSizeHeight - 10;
        _stickerView = [[StickerScrollView alloc]initWithFrame:CGRectMake(0, (_bottomBackView.lsqGetSizeHeight - stickerViewHeight), self.view.lsqGetSizeWidth, stickerViewHeight)];
        _stickerView.stickerDelegate = self;
        // 初始化相机贴纸栏的贴纸类型(默认:加载全部贴纸)
        // 显示方形或圆形贴纸
        // _stickerView.cameraStickerType = lsqCameraStickersTypeSquare;
        // 显示全屏贴纸
        // _stickerView.cameraStickerType = lsqCameraStickersTypeFullScreen;
        _stickerView.backgroundColor = [UIColor whiteColor];
        [_bottomBackView addSubview:_stickerView];
    }
}
TuSDKOnlineStickerDownloader 相关逻辑示例