TakeVideo概述
iOS系统本身有一套UIImagePickerController用来拍照片和拍摄视频,但是现在各大应用都喜欢自定义拍摄视频的界面,你肯定也心动了。拿微信来讲,小视频是最长是9秒钟,占用1.5MB,那我们也想做这样的效果,肿么办??
本篇文章,将为你揭秘拍摄视频那点事。
我写了一个Demo叫做TakeVideo,涵盖了这些功能,大家可以去 Github下载 - TakeVideo
下载后,可以直接在iPhone手机上运行
先看效果
还有一张gif动画图,csdn上传不了,读者就去这里 Github看看 - TakeVideo
我们开始啦
基本分为四种方式来调用,下面将一一展示,如何使用?
第一种方式
导入头文件
#import "ZRMediaCaptureController.h"
下面的代码是使用的是系统定义的UI,拍摄完的视频,需不需要压缩取决于你,压缩方法在本文后面讲到
ZRMediaCaptureController *manager = [[ZRMediaCaptureController alloc] init];
[manager setVideoCaptureType:ZRMediaCaptureTypeDefault completion:^(int statusCode, NSString *errorMessage, NSURL *videoURL, NSTimeInterval videoInterval) {
NSLog(@"视频地址:%@", videoURL.absoluteString);
if (errorMessage.length) {
NSLog(@"拍摄视频失败 %@", errorMessage);
} else {
//to do so
//[self previewVideo:videoURL interval:videoInterval useFirstCompression:YES];
}
}];
[self presentViewController:manager animated:YES completion:nil];
第二种方式
导入头文件
#import "ZRMediaCaptureController.h"
下面的代码是使用的是自定义的UI,调用的唯一区别就是 CaptureType
像这种自定义的UI方式,是很多应用都喜爱的,拍摄完的视频,需不需要压缩取决于你,压缩方法在本文后面讲到
ZRMediaCaptureController *manager = [[ZRMediaCaptureController alloc] init];
[manager setVideoCaptureType:ZRMediaCaptureTypeCustomizedUI completion:^(int statusCode, NSString *errorMessage, NSURL *videoURL, NSTimeInterval videoInterval) {
NSLog(@"视频地址:%@", videoURL.absoluteString);
if (errorMessage.length) {
NSLog(@"拍摄视频失败 %@", errorMessage);
} else {
//to do so
//[self previewVideo:videoURL interval:videoInterval useFirstCompression:YES];
}
}];
[self presentViewController:manager animated:YES completion:nil];
第三种方式
导入头文件
#import "ZRVideoCaptureViewController.h"
下面的代码是使用的是自定义的UI, 我看过微信的,Facebook,Snapchat都是类似的方式,通过AVCaptureSession来实现的,拍摄完的视频,需不需要压缩取决于你,压缩方法在本文后面讲到
ZRVideoCaptureViewController * videoCapture = [[ZRVideoCaptureViewController alloc] init];
[videoCapture setCaptureCompletion:^(int statusCode, NSString *errorMessage, NSURL *videoURL, NSTimeInterval videoInterval) {
NSLog(@"视频地址:%@", videoURL.absoluteString);
if (errorMessage.length) {
NSLog(@"拍摄视频失败 %@", errorMessage);
} else {
//to do so
//[self previewVideo:videoURL interval:videoInterval useFirstCompression:YES];
}
}];
[self presentViewController:videoCapture animated:YES completion:nil];
第四种方式
导入头文件
#import "ZRTakeVideoViewController.h"
下面的代码是使用的是自定义的UI, 跟第三个差不多,只是是通过AVCaptureSession来实现的AVCaptureSession 和 AVAssetWriter,该方法拍摄的视频,不需要压缩,因为拍摄视频时是一边拍摄一边压缩,视频的清晰度可以根据参数 averageBitRate
来定,一般都是2.5,如果需要超高清的,你可以往上调参数的值,6一般最高,当然了,如果你的视频的size比较大,你还可以往上调大值
ZRTakeVideoViewController *takeVideo = [[ZRTakeVideoViewController alloc] init];
takeVideo.averageBitRate = 4.0;
[takeVideo setCaptureCompletion:^(int statusCode, NSString *errorMessage, NSURL *videoURL, NSTimeInterval videoInterval) {
NSLog(@"视频地址:%@", videoURL.absoluteString);
if (errorMessage.length) {
NSLog(@"拍摄视频失败 %@", errorMessage);
} else {
//[self previewVideo:videoURL interval:videoInterval useFirstCompression:NO];
//to do so
}
}];
[self presentViewController:takeVideo animated:YES completion:nil];
压缩视频
下面有两种方式压缩视频,第一种比较常见,第二种是自己设置参数,这里我已经设置好了默认的参数,当然,你也可以设置你想要的参数
[ZRMediaCaptureController videoCompressWithSourceURL:videoURL completion:^(int statusCode, NSString *outputVideoURL) {
}];
或者
NSURL *outputFileURL = [NSURL fileURLWithPath:[ZRAssetExportSession generateAVAssetTmpPath]];
ZRAssetExportSession *encoder = [ZRAssetExportSession.alloc initWithAsset:[AVAsset assetWithURL:self.originalURL]];
encoder.outputFileType = AVFileTypeMPEG4;
encoder.outputURL = outputFileURL;
[encoder exportAsynchronouslyWithCompletionHandler:^
{
if (encoder.status == AVAssetExportSessionStatusCompleted)
{
}
else if (encoder.status == AVAssetExportSessionStatusCancelled)
{
}
else
{
}
}];
往视频添加水印
导入头文件
#import "ZRWaterPrintComposition.h"
调用以下代码
[[ZRWaterPrintComposition new] addVideoWaterprintAtURL:self.playURL WithWaterprintImage:[UIImage imageNamed:@"Icon"] withTitleText:@"Victor" iconSize:CGSizeMake(120, 120) completionHandler:^(int status, NSString *errorMsg, NSURL *finishedVideoURL) {
if (status == 0) {
self.playURL = finishedVideoURL;
} else {
NSLog(@"%@", errorMsg);
}
}];
如果你遇到问题,欢迎在下面提问,或者去 Github issue - TakeVideo 提交一个issue,本博主会尽快为你解答。��