ios 视频添加和压缩

使用AVFoundation框架

1、使用UIAlertController添加视频

UIAlertController * alertController = [UIAlertController alertControllerWithTitle: nil message: nil preferredStyle:UIAlertControllerStyleActionSheet];
//添加Button
[alertController addAction: [UIAlertAction actionWithTitle: @"拍摄视频" style: UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
        [self madeVideo];
}]];
[alertController addAction: [UIAlertAction actionWithTitle: @"本地视频" style: UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
        [self addAlbumVideo];
}]];
[alertController addAction: [UIAlertAction actionWithTitle: @"取消" style: UIAlertActionStyleCancel handler:nil]];

[self presentViewController: alertController animated: YES completion: nil];

2、拍摄视频

- (void)madeVideo:(id)sender
{
    UIImagePickerController *ipc = [[UIImagePickerController alloc] init];
    ipc.sourceType = UIImagePickerControllerSourceTypeCamera;//sourcetype有三种分别是camera,photoLibrary和photoAlbum
    NSArray *availableMedia = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];//Camera所支持的Media格式都有哪些,共有两个分别是@"public.image",@"public.movie"
    ipc.mediaTypes = [NSArray arrayWithObject:availableMedia[1]];//设置媒体类型为public.movie
    //设置摄像头类型
    /*
     UIImagePickerControllerCameraDeviceRear,//后置摄像头
     UIImagePickerControllerCameraDeviceFront //前置摄像头
     */
    ipc.cameraDevice = UIImagePickerControllerCameraDeviceRear;
    [self presentViewController:ipc animated:YES completion:nil];
    ipc.videoMaximumDuration = 30.0f;//30秒 最大拍摄时间
    ipc.delegate = self;//设置委托
    [ipc release];
}

关于上面提到的ipc.sourceType的三种取值,camera指的是调用相机进行拍摄,而photoLibrary指的是手机中的所有图片,photoAlbum指的是单纯指的是相册中的图片。ipc还有一些其他设置mediaTypes、videoQuality、cameraCaptureMode等。

3、本地视频

//添加相册视频
- (void)addAlbumVideo
{
    UIImagePickerController *ipc = [[UIImagePickerController alloc] init];
    ipc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;//sourcetype有三种分别是camera,photoLibrary和photoAlbum
    NSArray *availableMedia = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];//Camera所支持的Media格式都有哪些,共有两个分别是@"public.image",@"public.movie"
    ipc.mediaTypes = [NSArray arrayWithObject:availableMedia[1]];//设置媒体类型为public.movie
    [self presentViewController:ipc animated:YES completion:nil];
    ipc.delegate = self;//设置委托
}

4、委托方法中进行拍摄完毕的一些处理

#pragma mark UIImagePickerControllerDelegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    [picker dismissViewControllerAnimated:YES completion:^{}];
    //如果是视频资源
    NSURL *sourceURL = info[UIImagePickerControllerMediaURL];//视频资源
   //压缩视频
    [self compressVideo:sourceURL];
}

5、压缩视频

-(void)compressVideo:(NSURL*)url{
    //使用媒体工具(AVFoundation框架下的)
    //Asset 资源 可以是图片音频视频
    AVAsset *asset=[AVAsset assetWithURL:url];
    //设置压缩的格式
    AVAssetExportSession *session=[AVAssetExportSession exportSessionWithAsset:asset presetName:AVAssetExportPresetMediumQuality];//mediumquality:中等质量
    //设置导出路径
    NSString *path=[NSTemporaryDirectory() stringByAppendingPathComponent:@"needAV.mov"];
    //创建文件管理类 导出失败,删除已经导出的
    NSFileManager *manager=[[NSFileManager alloc]init];
    //删除已经存在的
    [manager removeItemAtPath:path error:NULL];
    //设置到处路径
    session.outputURL=[NSURL fileURLWithPath:path];
    //设置输出文件的类型
    session.outputFileType=AVFileTypeMPEG4;
    //开辟子线程处理耗时操作
    [session exportAsynchronouslyWithCompletionHandler:^{
        NSLog(@"导出完成!路径:%@",path);
    }];
}

在视频拍摄的时候有个参数是来设置拍摄质量的,三种取值UIImagePickerControllerQualityTypeHigh,Medium,Low,但是经过测试发现这三个参数对拍摄效果并无多大影响,压缩的时候也有一个参数三个取值(针对iPhone的只有三个,还有针对其它设备的不同分辨率如640*480等,但是他们并不适用于iPhone,还有一些针对PC的)这三个取值分别是AVAssetExportPresetMediumQuality,Highest,Low,其中Highest与Medium自我感觉并多大差异,清晰度相当,压缩后的文件大小也几乎一样,但是Low要小的多,一分中的视频如果用Medium(或Highest)大小是5M多点,如果是Low则为600KB左右,但是Low要相对模糊许多。一般选取Medium即可。

6、获取视频大小和时长

- (CGFloat) getFileSize:(NSString *)path
{
    NSFileManager *fileManager = [[[NSFileManager alloc] init] autorelease];
    float filesize = -1.0;
    if ([fileManager fileExistsAtPath:path]) {
        NSDictionary *fileDic = [fileManager attributesOfItemAtPath:path error:nil];//获取文件的属性
        unsigned long long size = [[fileDic objectForKey:NSFileSize] longLongValue];
        filesize = 1.0*size/1024;//KB
    }
    return filesize;
}此方法可以获取文件的大小,返回的是单位是KB。

- (CGFloat) getVideoLength:(NSURL *)URL
{
    NSDictionary *opts = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO]
                                                     forKey:AVURLAssetPreferPreciseDurationAndTimingKey];
    AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:URL options:opts];
    float second = 0;
    second = urlAsset.duration.value/urlAsset.duration.timescale;
    return second;
}此方法可以获取视频文件的时长。

你可能感兴趣的:(ios 视频添加和压缩)