TakeVideo概述

iOS系统本身有一套UIImagePickerController用来拍照片和拍摄视频,但是现在各大应用都喜欢自定义拍摄视频的界面,你肯定也心动了。拿微信来讲,小视频是最长是9秒钟,占用1.5MB,那我们也想做这样的效果,肿么办??
本篇文章,将为你揭秘拍摄视频那点事。
我写了一个Demo叫做TakeVideo,涵盖了这些功能,大家可以去 Github下载 - TakeVideo
下载后,可以直接在iPhone手机上运行

先看效果

iOS拍摄视频,自定义拍摄界面,高清压缩,添加水印_压缩


iOS拍摄视频,自定义拍摄界面,高清压缩,添加水印_界面_02


iOS拍摄视频,自定义拍摄界面,高清压缩,添加水印_界面_03


还有一张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,本博主会尽快为你解答。��