OC 视频录制2(UIImagePickerController)


#import <AVFoundation/AVFoundation.h>

@interface CustomVC ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate>{
    NSString *_Time;
    NSString *_fileName;
    NSURL *_outputURL;
    NSString *_videoUrl;
}
@property(nonatomic,strong)UIImageView *playImage;
@end

@implementation CustomVC

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.playImage = [[UIImageView alloc]initWithFrame:CGRectMake(0, 64, 320, 320)];
    [self.view addSubview:self.playImage];
    
}

    
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    [self startvideo];
//    [self speakHintMessage];
}
- (void)startvideo {
    UIImagePickerController *ipc = [[UIImagePickerController alloc] init];
    ipc.sourceType = UIImagePickerControllerSourceTypeCamera;//sourcetype有三种分别是camera,photoLibrary和photoAlbum
    // ipc.cameraDevice = UIImagePickerControllerCameraDeviceFront;
    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.videoMaximumDuration = 30.0f;// 30秒
    ipc.delegate = self;//设置委托
    [self presentViewController:ipc animated:YES completion:nil];
}
//此⽅方法可以获取视频⽂文件的时⻓长。
- (CGFloat) getVideoLength:(NSURL *)URL {
    AVURLAsset *avUrl = [AVURLAsset assetWithURL:URL];
    CMTime time = [avUrl duration];
    int second = ceil(time.value/time.timescale);
    return second;
}
//此⽅方法可以获取⽂文件的⼤大⼩小,返回的是单位是KB。
- (CGFloat) getFileSize:(NSString *)path {
    NSLog(@"%@",path);
    NSFileManager *fileManager = [NSFileManager defaultManager];
    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;
    }else{ NSLog(@"找不不到⽂文件");
    }
    return filesize;
}

//完成视频录制,并压缩后显示⼤大⼩小、时⻓长
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    NSURL *sourceURL = [info objectForKey:UIImagePickerControllerMediaURL];
    NSLog(@"视频文件时长:%f",[self getVideoLength:sourceURL]);
    NSString * urlStr = [sourceURL path];
    NSLog(@"压缩前视频文件大小:%.2f kb", [self getFileSize:urlStr]);
    // self.dateTimeLab.text = [LYWRegex getCurrentTimes];
    //获取视频第⼀一帧
    self.playImage.image=[self thumbnailImageForVideo:sourceURL atTime:1];
    if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(urlStr)) { //保存视频到相簿,注意也可以使⽤用ALAssetsLibrary来保存
        UISaveVideoAtPathToSavedPhotosAlbum(urlStr, self, @selector(video:didFinishSavingWithError:contextInfo:), nil);
        if ([[NSString stringWithFormat:@"%1.f", [self getVideoLength:sourceURL]]integerValue]>300) { [picker dismissViewControllerAnimated:YES completion:nil];
//            [MMShowMessage showMessage:@"Video is too long, only 300 seconds"];
        }else{
            NSURL *newVideoUrl ; //⼀一般.mp4
            NSDateFormatter *formater = [[NSDateFormatter alloc] init];//⽤用时间给⽂文件全名,以免重复,在测试的时候其实可以判断⽂文件是否存在若存在,则删除,重新⽣生成⽂文件即可
            [formater setDateFormat:@"yyyy-MM-dd-HH:mm:ss"];
            newVideoUrl = [NSURL fileURLWithPath:[NSHomeDirectory() stringByAppendingFormat:@"/Documents/output-%@.MOV", [formater stringFromDate:[NSDate date]]]] ;//这个是保存在app⾃自⼰己的沙盒路路径⾥里里,后⾯面可以选择是否在上传后删除掉。我建议删除掉,免得占空间。
            _Time=[formater stringFromDate:[NSDate date]];
            _fileName = [NSString stringWithFormat:@"output-%@.MOV", [formater stringFromDate:[NSDate date]]];
            NSURL * url = [info objectForKey:UIImagePickerControllerMediaURL];
            _outputURL =url;
            self.playImage.image =[self getVideoPreViewImage:url];
            self.playImage.hidden =NO;
            [picker dismissViewControllerAnimated:YES completion:nil];
            [self convertVideoQuailtyWithInputURL:sourceURL outputURL:newVideoUrl completeHandler:nil];
        } }
}

#pragma mark - 压缩视频
- (void) convertVideoQuailtyWithInputURL:(NSURL*)inputURL
                               outputURL:(NSURL*)outputURL
                         completeHandler:(void (^)(AVAssetExportSession*))handler
{
    AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:inputURL options:nil];
    AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:avAsset presetName:AVAssetExportPresetLowQuality]; // NSLog(resultPath);
    exportSession.outputURL = outputURL;
    exportSession.outputFileType = AVFileTypeMPEG4;
    exportSession.shouldOptimizeForNetworkUse= YES;
    [exportSession exportAsynchronouslyWithCompletionHandler:^(void)
    {
        switch (exportSession.status) {
            case AVAssetExportSessionStatusCancelled: NSLog(@"AVAssetExportSessionStatusCancelled"); break;
            case AVAssetExportSessionStatusUnknown: NSLog(@"AVAssetExportSessionStatusUnknown"); break;
            case AVAssetExportSessionStatusWaiting: NSLog(@"AVAssetExportSessionStatusWaiting"); break;
            case AVAssetExportSessionStatusExporting: NSLog(@"AVAssetExportSessionStatusExporting"); break;
            case AVAssetExportSessionStatusCompleted: NSLog(@"AVAssetExportSessionStatusCompleted");
                NSLog(@"压缩后的视频:%@",[NSString stringWithFormat:@"时间:%f s", [self getVideoLength:outputURL]]);
                NSLog(@"压缩后的视频大小:%@", [NSString stringWithFormat:@"%.2f kb", [self getFileSize:[outputURL path]]]);
                UISaveVideoAtPathToSavedPhotosAlbum([outputURL path], self, nil, NULL);//这个是保存到⼿手机相册 self->_outputURL = outputURL;
//                [self alertUploadVideo:outputURL];
                break;
            case AVAssetExportSessionStatusFailed: NSLog(@"AVAssetExportSessionStatusFailed"); break;
        } }];
}
/**!删除⽂文件隐藏控件 */
-(void)deleteFile {
    NSFileManager* fileManager=[NSFileManager defaultManager];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); //⽂文件名
    NSString *uniquePath=[[paths objectAtIndex:0] stringByAppendingPathComponent:_fileName];
    BOOL blHave=[[NSFileManager defaultManager] fileExistsAtPath:uniquePath];
    if (!blHave) {
        NSLog(@"no have"); return ;
    }else {
        NSLog(@" have");
        BOOL blDele= [fileManager removeItemAtPath:uniquePath error:nil];
        if (blDele) {
            self.playImage.image =nil;
            self.playImage.hidden =YES;
//            self.playBtn.hidden=YES;
//            self.deleBtn.hidden =YES;
            NSLog(@"dele success");
        }else {
            NSLog(@"dele fail");
        } }
}
#pragma mark - ⾃自定义视频方法
- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
    // //
    if (error) { NSLog(@"保存视频过程中发⽣生错误,错误信息:%@",error.localizedDescription);
    } else {
        NSLog(@"视频保存成功");
        _videoUrl = videoPath;
        NSURL * url = [NSURL fileURLWithPath:videoPath];
        // self.dateTimeLab.text = [LYWRegex getCurrentTimes]; //获取视频第⼀一帧
//        [self.playImage setBackgroundImage: forState:UIControlStateNormal];
        self.playImage.image=[self thumbnailImageForVideo:url atTime:1];
        _outputURL =url;
        self.playImage.image =[self getVideoPreViewImage:url];
    }
}
//根据url获取视频的第一帧图片
- (UIImage*) getVideoPreViewImage:(NSURL *)path {
    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:path options:nil];
    AVAssetImageGenerator *assetGen = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    assetGen.appliesPreferredTrackTransform = YES;
    CMTime time = CMTimeMakeWithSeconds(0.0, 600);
    NSError *error = nil;
    CMTime actualTime;
    CGImageRef image = [assetGen copyCGImageAtTime:time actualTime:&actualTime error:&error];
    UIImage *videoImage = [[UIImage alloc] initWithCGImage:image];
    CGImageRelease(image);
    return videoImage;
}
//根据url获取视频的第一帧图片
- (UIImage*) thumbnailImageForVideo:(NSURL *)videoURL atTime:(NSTimeInterval)time {
    
    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];
    NSParameterAssert(asset);
    AVAssetImageGenerator *assetImageGenerator =[[AVAssetImageGenerator alloc] initWithAsset:asset];
    assetImageGenerator.appliesPreferredTrackTransform = YES;
    assetImageGenerator.apertureMode = AVAssetImageGeneratorApertureModeEncodedPixels;
    
    CGImageRef thumbnailImageRef = NULL;
    CFTimeInterval thumbnailImageTime = time;
    NSError *thumbnailImageGenerationError = nil;
    thumbnailImageRef = [assetImageGenerator copyCGImageAtTime:CMTimeMake(thumbnailImageTime, 60)actualTime:NULL error:&thumbnailImageGenerationError];
    
    if(!thumbnailImageRef)
        NSLog(@"thumbnailImageGenerationError %@",thumbnailImageGenerationError);
    
    UIImage*thumbnailImage = thumbnailImageRef ? [[UIImage alloc]initWithCGImage: thumbnailImageRef] : nil;
    
    return thumbnailImage;
    
}

@end

优质内容筛选与推荐>>
1、概率神经网络 (PNN) 应用的简单DEMO
2、git问题 next fetch will store in remotes/origin
3、onclick 事件
4、Nehalem
5、CSS样式表


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号