(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
相关逻辑示例