如果要查询采集设备状态,采集录制状态,视频播放状态,文件生成状态,资源包安 装状态等,则必须在创建NvsStreamingContext对象后设置回调并实现对应的回调方 法。
这里举例设置播放回调:
//给Streaming context设置播放回调接口 m_streamingContext.setPlaybackCallback(this);
6 iOS SDK
6.1 开发前准备 6.2 采集录制 6.3 视频编辑 6.4 视频生成 6.5 音乐 6.6 字幕 6.7 动画贴纸 6.8 主题 6.9 转场 6.10 特效 6.11 素材包 6.12 查询
6.1 开发前准备
环境配置要求
短视频SDK需要集成到APP工程中,单独的SDK对软硬件环境没有特别的要求。
● 准备XCODE集成开发环境,Xcode 7.0版本或以上版本。
● 准备Mac® OS X® 10.10 (Yosemite) 或更高版本的开发环境。
● iOS系统版本:iOS 8.0及以上版本。
● iOS终端设备:iPhone 5s及以上
● 支持的终端CPU架构:armv7、armv7s和arm64。
注意事项
● IOS SDK不支持模拟器,请使用真机集成。
● SDK的所有接口必须在UI线程调用,否则可能出现无法预料的错误。只有 NvsVideoFrameRetriever类的getFrameAtTime()方法除外。
SDK 集成
本节以XCODE为例,介绍如何将SDK集成到工程中。
步骤1 新建工程。
1. 选择 “File > New > Project”来新建工程。
2. 在工程类型界面选择适合的工程类型,单击“Next”。
3. 输入工程名,单击“Next”。
4. 输入工程路径,单击“Create”。
步骤2 禁用Bitcode。
1. 在工程设置界面,选择“Build Settings”。
2. 在搜索框输入“bit code”。
3. 在“Enable Bitcode”选项卡中选择“No”。
步骤3 添加SDK头文件的引用。
1. 在工程设置界面,选择“Build Settings”。
2. 在搜索框输入“search Paths”。
3. 在“search paths”中输入SDK的头文件和库文件地址。
图6-1 添加头文件
步骤4 添加库文件引用。
1. 在工程设置界面,选择“ General ”。
2. 找到“Linked Frameworks and Libraries”。
3. 添加SDK库文件。2.0.0以上版本需要添加framework库文件。
步骤5 将申请的License文件拷贝到项目资源文件下,并在初始化时配置License文件路径。
----结束
6.2 采集录制
SDK中录制的相关接口是在NvsStreamingContext类里,提供“系统录制”和“带特效 录制”两种方式,用户可根据需要选择使用任意一种。
SDK提供断点录制功能,可以在独立文件之间加入各种转场特技。
表6-1 采集录制说明 方
式
特征 优点 缺点
系 统 录 制
录制的视频 不带特效,
且其横纵比 也不是预设 的横纵比值
不会出现丢帧 录制完毕,无法得到期望横纵比的视频(比 如想录制1:1视频,结果会得到9:16的视 频)。
要生成带美颜,特效以及期望横纵比的视 频,则需要设置包括图像宽高, 像素比等相 关参数(如生成1:1视频,则图像宽高设为同 一值)来创建时间线,然后添加轨道,片 段,及相应的特效,最后生成预期的视频。
方 式
特征 优点 缺点
带 特 效 录 制
录制完成,
会得到预设 的横纵比的 视频,同时 特效也会写 进录制的视 频中
在录制过程中就 会加上美颜,视 频特效等素材,
录制完成后,就 可以得到预期横 纵比的视频
录制效果与当前用户手机配置强相关。手机 性能配置不同,带特效录制时可能会出现不 一样的效果。对于一个低性能的手机,如果 添加的特效过多,处理起来过于复杂,可能 会导致录制的视频卡顿,丢帧。 对于 android手机来说,android本身可能存在某 些问题,导致在录制时可能还会出现花屏,
重影等不可预知的问题。
断 点 录 制
循环调用开 始录制(startRecor ding())和 结束录制(stopRecor ding())
独立文件之间可 以加入各种转场 特技,避免了因 转换场景而造成 的视频画面生硬 的切换
录制产生了多个文件,需要用户自己维护和 删除视频数据, 并需要通过后续的编辑操作 将断点录制的文件生成一个完整的新文件。
录制流程
录制功能需要获取摄像头和麦克风权限,否则无法录制。视频录制的流程如下图。
初始化 NvsStreamingContext
步骤1 初始化NvsStreamingContext类,然后在其它地方使用时获取NvsStreamingContext的 对象,NvsStreamingContext是单例类。
NvsStreamingContext初始化代码如下:
_context = [NvsStreamingContext sharedInstance];
步骤2 不再使用SDK或者程序退出前销毁NvsStreamingContext类的对象。代码如下:
_context = nil;
[NvsStreamingContext destroyInstance];
说明
● 请务必保证不要中途销毁NvsStreamingContext类的对象。
● NvsStreamingContext类的第二个参数为授权文件的路径,没有授权文件时给空字符串。
----结束
开启预览
} NvsLiveWindowFillMode;2. 设置预览参数。
if (![_context connectCapturePreviewWithLiveWindow:self.liveWindow]) { NSLog(@"连接预览窗口失败");
return;
}
// 给NvsStreamingContext设置代理(必须要设置)
_context.delegate = self;
3. 启动预览。
//启动采集预览,使用高质量、横纵比为1:1的设置启动采集预览,最好与LiveWindow适配 _aspectRatio.den = 1;
_aspectRatio.num = 1;
if (![_context startCapturePreview:0 videoResGrade:NvsVideoCaptureResolutionGradeHigh flags:0 aspectRatio:&m_aspectRatio]) - (void)cancelAutoFocus;
//启动自动曝光
- (void)startAutoExposure:(CGPoint)pointOfInterest;
//设置缩放
- (void)setZoomFactor:(float)zoomFactor;
//获取缩放 - (float)getZoomFactor;
//开关闪光灯
- (void)toggleFlash:(BOOL)on;
//获取闪光灯状态 - (BOOL)isFlashOn;
//设置曝光补偿
- (void)setExposureBias:(float)exposureBias;
//获取曝光补偿
//获取美颜特技描述信息
NvsFxDescription *fxDescription = [_context getVideoFxDescription:@"Beauty"];
//获取描述的所有参数信息
NSArray* paramInfoArray = [fxDescription getAllParamsInfo];
for (NSDictionary *dic in paramInfoArray) {
NvsCaptureVideoFx* fx = [_context appendBeautyCaptureVideoFx];
//设置美颜磨皮值
[fx setFloatVal:@"Strength" val:_strengthValue];
//设置美白强度值
[fx setFloatVal:@"Whitening" val:_whiteningValue];
● 采集特效(滤镜)
采集特效分为内建采集特效和扩展采集特效。扩展采集特效即通过资源包安装而 得到的采集特效。
a. 添加内建采集特效。
//获取所有内建采集特效的名称。
[_context getAllBuiltinCaptureVideoFxNames];
/添加内建采集特效
[_context appendBuiltinCaptureVideoFx:fxName];
//移除所有采集视频特效
_fxPackageId = [[NSMutableString alloc] initWithString:@""];
NSString *appPath =[[NSBundle mainBundle] bundlePath];
NSString *package1Path = [appPath
NvsAssetPackageManagerError error = [_context.assetPackageManager
installAssetPackage:package1Path license:nil type:NvsAssetPackageType_VideoFx sync:YES assetPackageId:_fxPackageId];
if (error != NvsAssetPackageManagerError_NoError && error !=
NvsAssetPackageManagerError_AlreadyInstalled) {
Audio Echo、Male Voice、Female Voice、Cartoon Voice、
Fast Cartoon Voice、Monster Voice、Audio Reverb、Audio Wahwah
特效类型 特效名称 内建视频特效
(Builtin Video Fx)
Sage、Maid、Mace、Lace、Mall、Sap、Sara、Pinky、
Sweet、Fresh、Beauty、Color Property、Transform 2D、CC Basic、Lut
Fade、Turning、Swap、Stretch In、Page Curl、Lens Flare、
Star、Dip To Black、Dip To White、Push To Right、Push To Top、Upper Left Into
各特效的参数说明如下所示。
● Color Property
表6-3 Color Property 参数说明 参数
ness 亮度 Floatin
g Point 1 10 0 Satur
ation 饱和度 Floatin
g Point 1 10 0 Contr
ast 对比度 Floatin
g Point 1 10 0
● Transform 2D
表6-4 Transform 2D 参数说明
g Point 1 1000 -1000 Scale
Y 纵向缩
放
Floatin
g Point 1 1000 -1000 Rotati
on 旋转 Floatin
g Point 0 3.6e
参数名
三种取值:Clamp To Edge,Mirrored Repeat,Repeat
g Point 1 1000 -1000
TexScale
g Point 1 1000 -1000
TexRotati
表6-5 CC Basic 参数说明
Other Tones 是否处理其他
色调 Boolean FA LSE
Saturation 饱和度 Floating
Point 1 10 0
Master
Contrast 对比度 Floating
Point 1 10 0
Master
Balance Hue 平衡色调 Floating
Point 0 360 0
Red Red增益 Floating
Point 1 10 0
Master Gain
Green Green增益 Floating
Point 1 10 0
Master Gain
Blue Blue增益 Floating
Point 1 10 0
Offset Red Red偏移量 Floating
Point 0 10 -10 Master
Offset Green Green偏移量 Floating
Point 0 10 -10 Master
Offset Blue Blue偏移量 Floating
Point 0 10 -10
参数名称 参数说明 参数类
Saturation 阴影饱和度 Floating
Point 1 10 0
Shadows
Contrast 阴影对比度 Floating
Point 1 10 0
Shadows
Balance Hue 阴影平衡色调 Floating
Point 0 360 0
Gain Master 阴影全通道增 益(分别与
Gain Red 阴影Red增益 Floating
Point 1 10 0
Gain Blue 阴影Blue增益 Floating
Point 1 10 0
Offset Green 阴影Green偏
移量 Floating
Point 0 10 -10 Shadows
Offset Blue 阴影Blue偏移
量 Floating
Point 0 10 -10 Midtones
Saturation 中间调饱和度 Floating
Point 1 10 0
Midtones
Contrast 中间调对比度 Floating
Point 1 10 0
Midtones
Balance Hue 中间调平衡色 调
参数名称 参数说明 参数类
Gain Master 中间调全通道 增益(分别与 RGB值相乘)
Floating
Point 1 10 0
Midtones
Gain Red 中间调Red增
益 Floating
Point 1 10 0
Midtones
Gain Green 中间调Green
增益 Floating
Point 1 10 0
Midtones
Gain Blue 中间调Blue增
益 Floating
Offset Red 中间调Red偏 移量
Floating
Point 0 10 -10 Midtones
Offset Green 中间调Green
偏移量 Floating
Point 0 10 -10 Midtones
Offset Blue 中间调Blue偏
移量 Floating
Point 0 10 -10 Highlights
Saturation 高光饱和度 Floating
Point 1 10 0
Highlights
Contrast 高光对比度 Floating
Point 1 10 0
Highlights
Balance Hue 高光平衡色调 Floating
Point 0 360 0
Gain Master 高光全通道增 益(分别与 RGB值相乘)
Floating
Point 1 10 0
Highlights
Gain Red 高光Red增益 Floating
Point 1 10 0
Highlights
Gain Green 高光Green增 益
Floating
Point 1 10 0
Highlights
Gain Blue 高光Blue增益 Floating
Point 1 10 0
参数名称 参数说明 参数类
Offset Red 高光Red偏移
量 Floating
Point 0 10 -10 Highlights
Offset Green 高光Green偏
移量 Floating
Point 0 10 -10 Highlights
Offset Blue 高光Blue偏移 量
Intensity 强度 Floating
Point 1 1 0
[_context stopRecording];
6.3 视频编辑
编辑流程
初始化 NvsStreamingContext
实现视频编辑需首先初始化NvsStreamingContext。
//NvsStreamingContext初始化,若已经初始化过,则直接获取对象。
NvsStreamingContext *_context = [NvsStreamingContext sharedInstance];
创建时间线
创建timeline对于编辑是非常关键的,timeline的分辨率决定了生成视频文件的最大分 辨率(尺寸)。请将timeline的分辨率和NvsLiveWindow的宽高比适配一致。
通过NvsStreamingContext类对象创建时间线,时间线占用资源较小,如有需要,一 个程序中可以创建多个时间线。一般创建一条时间线即可。
NvsVideoResolution videoEditRes;
/* 注意:请在使用LiveWindow预览的时候,将NvsLiveWindow的宽高比与此处保持一致。 */
//视频分辨率的宽
videoEditRes.imageWidth = 1280;
//视频分辨率的高
videoEditRes.imageHeight = 720;
//像素比,设为1:1
videoEditRes.imagePAR = (NvsRational){1, 1};
//帧速率,25~30都可以,一般25。
NvsRational videoFps = {25, 1};
NvsAudioResolution audioEditRes;
//音频采样率,48000或44100均可 audioEditRes.sampleRate = 48000;
//音频通道数
audioEditRes.channelCount = 2;
//音频采样格式
audioEditRes.sampleFormat = NvsAudSmpFmt_S16;
//创建时间线
NvsTimeline *_timeline = [_context createTimeline:&videoEditRes videoFps:&videoFps audioEditRes:&audioEditRes];
// 将时间线连接到NvsLiveWindow控件,用于预览时间线上的图像
if (![_context connectTimeline:_timeline withLiveWindow:self.liveWindow]) { NSLog(@"Failed to connect timeline to liveWindow!");
NvsVideoTrack *_videoTrack = [_timeline appendVideoTrack];
//添加音频轨道,有配音或者添加音乐的功能可添加音频轨道 NvsAudioTrack *_audioTrack = [_timeline appendAudioTrack];
/* 添加片段到轨道上 */
NSString* videoUrl = @"file:///var/mobile/Media/DCIM/102APPLE/IMG_2625.MOV";
[_videoTrack appendClip:videoUrl];//建议判断返回值查看片段是否添加成功
开始编辑
可以对视频进行剪裁、片段增删与排序等,进行视频编辑。
/* 视频剪裁:改变片段的入出点,裁剪片段。
//获取视频片段对象
NvsVideoClip *clip = [_videoTrack getClipWithIndex:(unsigned int)[self.tableViewVideos indexPathForSelectedRow].row];
//裁剪片段入点
[clip changeTrimInPoint:data.startTime affectSibling:YES];
//裁剪片段出点
[clip changeTrimOutPoint:data.endTime affectSibling:YES];
*/
/*移除片段
[_videoTrack removeClip:(unsigned int)indexPath.row keepSpace:NO];
*/
/* 片段排序:clipIndex和destClipIndex分别代表互换的两个素材的位置索引
[_videoTrack moveClip:(unsigned int)sourceIndexPath.row destClipIndex:(unsigned
int)destinationIndexPath.row];
*/
/* 增加片段,filePath是图片素材的路径,trimIn设置0,trimOut设置为8000000,则图片显示为8秒*/
[_videoTrack appendClip:asset.localIdentifier trimIn:0 trimOut:8000000];
预览播放
对于播放与定位预览接口,其参数videoSizeMode建议设置为 NvsVideoPreviewSizeModeLiveWindowSize。
若无特殊需求,设为NvsVideoPreviewSizeModeFullSize的模式会影响性能。
preload是预加载,设为true。时间单位是微秒(1/1000000秒。)
//视频定位预览
[_context seekTimeline:_timeline timestamp:0 videoSizeMode:NvsVideoPreviewSizeModeLiveWindowSize flags:NvsStreamingEngineSeekFlag_ShowCaptionPoster |
NvsStreamingEngineSeekFlag_ShowAnimatedStickerPoster]
//视频播放:playbackTimeline()的参数endTime,值可以是_timeline.duration或者-1 [_context playbackTimeline:_timeline startTime:startTime endTime:_timeline.duration videoSizeMode:NvsVideoPreviewSizeModeLiveWindowSize preload:YES flags:0];
移除时间线与轨道
在程序退出时,要对创建的时间线,添加的视频轨道和音频轨道进行移除。
//移除时间线 if (_timeline)
[_context removeTimeline:_timeline];
// 移除指定索引值的视频轨道 [_timeline removeVideoTrack:0];
// 移除指定索引值的音频轨道 [_timeline removeAudioTrack:0];
6.4 视频生成
SDK使用compileTimeline()用于将时间线上的片段生成输出一个新的视频。参数说明 请参见视频生成参数。
//生成视频 [_context
compileTimeline:_timeline startTime:0
endTime:_timeline.duration outputFilePath:_outputFilePath
videoResolutionGrade:NvsCompileVideoResolutionGrade720 videoBitrateGrade:NvsCompileBitrateGradeHigh flags:0]
表6-7 视频生成参数 序
号
名称 参数说明
1 时间线 时间线对象。
2 开始时间 从时间线上哪个时间开始生成。一般从0开始生成。
序 号
名称 参数说明
3 结束时间 时间线上哪个时间作为结束时间,一般是整个时间线的时长。
4 生成素材 的文件路 径
路径名称。
5 分辨率级
别 生成视频的分辨率高度级别。可以是360,480,720,1080。和 Timeline的分辨率共同决定了生成素材的分辨率。假如此处高度 是480,低于Timeline的高, 那么生成的素材的分辨率的高就是 480,宽是480乘以Timeline的分辨率的横纵比。如果此处的高大 于Timeline的分辨率的高,则生成视频的分辨率就是Timeline的分 辨率。
6 码率级别 分为高,中,低三类。决定了生成素材的清晰度,级别越高,码 率越大,越清晰,视频文件也越大。所以一般是生成到本地的素 材,采用高或中。准备发布到服务器上的素材,生成为中或低,
6 码率级别 分为高,中,低三类。决定了生成素材的清晰度,级别越高,码 率越大,越清晰,视频文件也越大。所以一般是生成到本地的素 材,采用高或中。准备发布到服务器上的素材,生成为中或低,