短视频类开发 SDK 备选&开发

短视频类开发 SDK 备选

趣拍云

官网

又拍云

官网
云端处理方案, 可以鉴黄

简单对视频的处理是一套 , 对人脸进行识别定位的是另一套

SCRecorder

可以仿照获得类似 vine(原先国外的短视频应用) 的效果, 但是现在找到的 Demo 来说, 视频和音频的剪辑, 断点续录还没有完全一样的, 现在有两个分开的 Demo

  1. 官方SCRecorder: 有断点续录功能, 特效切换等
  2. prankPro: 一次录完, 有音效的合成
  3. NextLevel: 有 OC 版本, 这个是 Swift 版本, 但是好像没有妹夫效果, 但是在速度控制有选项
  4. 也有用了 SC 之后弃用的: 参考
    5.

SCReacorder 的问题
录制出来拼接音频后, 发现时间轴不对, 音频比较快
目前打开那个 fast 什么的好像差不多了…
但是碰到了 crash

关于合并视频和音轨时发生错位的情况, 可以发现在播放视频时前面出现一段黑屏, 但是音乐是直接出来了, 这样视频就较音乐落后了点
在合并时将音频的插入时间延后一点, 尅解决问题, 具体延后多少….目前就只能自测, 因为不能确切的肯定视频延后了多久.
原因的话目前猜想是: SCRecorder 对视频的处理问题.

在使用SC 时, 设置 Fast 什么的属性时, 可以看到延后变小了, 但是还是存在一些不确定因素, 所以目前就根据结果对音频的插入时间进行处理…
其中的坑: CMTime, 这个是用以标识音视频这些处理的时间, 不是自然时间
结构其中的说明, 官方比较简陋, 查资料有:
CMTimeMake顧名思義就是用來建立CMTime用的,
但是千萬別誤會他是拿來用在一般時間用的,
CMTime可是專門用來表示影片時間用的類別,
他的用法為: CMTimeMake(time, timeScale)

time指的就是時間(不是秒),
而時間要換算成秒就要看第二個參數timeScale了.
timeScale指的是1秒需要由幾個frame構成(可以視為fps),
因此真正要表達的時間就會是 time / timeScale 才會是秒.

簡單的舉個例子:

CMTimeMake(60, 30);
CMTimeMake(30, 15);
在這兩個例子中所表達在影片中的時間都皆為2秒鐘,
但是影隔播放速率則不同, 相差了有兩倍.

CMTime 参考
CMTime 参考2

人脸识别

科大讯飞: 免费, 识别率高

sensetime: 抖音在用的 金山里的链接, 并没有找到单独的SDK

face++ : 有试用, 正式的appkey是按流量收费的

CIDetector : CoreImage 中的一个类, 里面有识别脸的方法, 但是好像返回的脸不能转的, 是返回一个CGRect矩形 比较完善的链接

大概使用到的方法(查的, 未验证)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//识别图片:
CIImage* ciimage = [CIImage imageWithCGImage:image.CGImage];
NSDictionary* opts = [NSDictionary dictionaryWithObject:
CIDetectorAccuracyHigh forKey:CIDetectorAccuracy];
CIDetector* detector = [CIDetector detectorOfType:CIDetectorTypeFace
context:nil options:opts];
NSArray* features = [detector featuresInImage:ciimage];



//标出脸部,眼睛和嘴:
for (CIFaceFeature *faceFeature in features){
}



// 标出脸部
CGFloat faceWidth = faceFeature.bounds.size.width;
UIView* faceView = [[UIView alloc] initWithFrame:faceFeature.bounds];
faceView.layer.borderWidth = 1;
faceView.layer.borderColor = [[UIColor redColor] CGColor];
[self.view addSubview:faceView];

// 标出左眼
if(faceFeature.hasLeftEyePosition) {
UIView* leftEyeView = [[UIView alloc] initWithFrame:
CGRectMake(faceFeature.leftEyePosition.x-faceWidth*0.15,
faceFeature.leftEyePosition.y-faceWidth*0.15, faceWidth*0.3, faceWidth*0.3)];
[leftEyeView setBackgroundColor:[[UIColor blueColor] colorWithAlphaComponent:0.3]];
[leftEyeView setCenter:faceFeature.leftEyePosition];
leftEyeView.layer.cornerRadius = faceWidth*0.15;
[self.view addSubview:leftEyeView];
}
// 标出右眼
if(faceFeature.hasRightEyePosition) {
UIView* leftEye = [[UIView alloc] initWithFrame:
CGRectMake(faceFeature.rightEyePosition.x-faceWidth*0.15,
faceFeature.rightEyePosition.y-faceWidth*0.15, faceWidth*0.3, faceWidth*0.3)];
[leftEye setBackgroundColor:[[UIColor blueColor] colorWithAlphaComponent:0.3]];
[leftEye setCenter:faceFeature.rightEyePosition];
leftEye.layer.cornerRadius = faceWidth*0.15;
[self.view addSubview:leftEye];
}
// 标出嘴部
if(faceFeature.hasMouthPosition) {
UIView* mouth = [[UIView alloc] initWithFrame:
CGRectMake(faceFeature.mouthPosition.x-faceWidth*0.2,
faceFeature.mouthPosition.y-faceWidth*0.2, faceWidth*0.4, faceWidth*0.4)];
[mouth setBackgroundColor:[[UIColor greenColor] colorWithAlphaComponent:0.3]];
[mouth setCenter:faceFeature.mouthPosition];
mouth.layer.cornerRadius = faceWidth*0.2;
[self.view addSubview:mouth];
}

使用openCV 培训出一个识别人脸的算法

OpenCV 的 API 是 C++ 的。它由不同的模块组成,这些模块中包含范围极为广泛的各种方法,从底层的图像颜色空间转换到高层的机器学习工具。
这篇 OpenCV 的 iOS 教程告诉你只要把所有用到 OpenCV 的类的文件后缀名改为 .mm 就行了,包括视图控制器类也是如此。这么干或许能行得通,却不是什么好主意。正确的方式是给所有你要在 app 中使用到的 OpenCV 功能写一层 Objective-C++ 封装。这些 Objective-C++ 封装把 OpenCV 的 C++ API 转化为安全的 Objective-C API,以方便地在所有 Objective-C 类中使用。走封装的路子,你的工程中就可以只在这些封装中调用 C++ 代码,从而避免掉很多让人头痛的问题,比如直接改文件后缀名会因为在错误的文件中引用了一个 C++ 头文件而产生难以追踪的编译错误。

参考说明