用UIImagePickerController需要知道

UIImagePickerController通过leak工具测试的时候会有内存泄漏,通过Google了一番说把它写成一个单例的就可以解决内存泄漏.

抱歉,我自己经过测试时候告诉你,写成单例也不行.谢谢,如果有请告诉我

接下来上使用的代码,我是用来录像

-(void)useTheSystemRecordViewController{

    UIImagePickerController * imagePicker = [[UIImagePickerController alloc] init];

    imagePicker.delegate = self;

    //判断是否可以拍摄

    if ( [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

        //判断是否拥有拍摄权限

        AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];

        if(authStatus == AVAuthorizationStatusRestricted || authStatus == AVAuthorizationStatusDenied){

            return;

        }


        //拍摄

        imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;

        //录制的类型 下面为视频


        imagePicker.mediaTypes=@[(NSString*)kUTTypeMovie];

        imagePicker.videoQuality  = UIImagePickerControllerQualityTypeIFrame960x540;


        //录制的时长

        imagePicker.videoMaximumDuration=20.0;


        //模态视图的弹出效果

        imagePicker.modalPresentationStyle=UIModalPresentationOverFullScreen;

        [self presentViewController:imagePicker animated:YES completion:^{

            _segement.selectedSegmentIndex = 0;

            _isVideo = NO;

        }];

    }

#pragma mark -录制完成

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{


    NSString *mediaType=[info objectForKey:UIImagePickerControllerMediaType];


    //返回的媒体类型是照片或者视频

    if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {

        //照片的处理

        //        [picker dismissViewControllerAnimated:YES completion:^{

        //            UIImage *img = [info objectForKey:@"UIImagePickerControllerOriginalImage"];

        //        }];


    }else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]){


        //视频的处理

        [picker dismissViewControllerAnimated:YES completion:^() {

            MBProgressHUD* progressHUD = [MBProgressHUD showHUDAddedTo:self.view animated:YES];

            progressHUD.removeFromSuperViewOnHide = YES;

            [progressHUD showAnimated:YES];

            _progressHUD = progressHUD;

            //文件管理器

            NSFileManager* fm = [NSFileManager defaultManager];


            NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/myMovie.mp4"];

            NSURL *mergeFileURL = [NSURL fileURLWithPath:pathToMovie];


            NSFileManager* manager = [NSFileManager defaultManager];

            if ([manager fileExistsAtPath:pathToMovie]) {

                [manager removeItemAtPath:pathToMovie error:nil];

            }


            NSString* mp4Path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.mp4"];


            if ([manager fileExistsAtPath:mp4Path]) {

                [manager removeItemAtPath:mp4Path error:nil];

            }

            //通过文件管理器将视频存放的创建的路径中

            [fm copyItemAtURL:[info objectForKey:UIImagePickerControllerMediaURL] toURL:mergeFileURL error:nil];

            [self encodeVideoOrientation:mergeFileURL];


            /*

            AVURLAsset * asset = [AVURLAsset assetWithURL:[NSURL fileURLWithPath:pathToMovie]];


            //根据AVURLAsset得出视频的时长

            CMTime  time = [asset duration];

            int seconds = ceil(time.value/time.timescale);

            NSString *videoTime = [NSString stringWithFormat:@"%d",seconds];

            */

            //可以根据需求判断是否需要将录制的视频保存到系统相册中

            //            ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];

            //            NSURL *recordedVideoURL= [info objectForKey:UIImagePickerControllerMediaURL];

            //

            //            if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:recordedVideoURL]) {

            //                [library writeVideoAtPathToSavedPhotosAlbum:recordedVideoURL

            //                                            completionBlock:^(NSURL *assetURL, NSError *error){

            //

            //                                            }];

            //            }


        }];

    }

}

-(void)encodeVideoOrientation:(NSURL*)anOutputFileURL{


    AVURLAsset * videoAsset = [[AVURLAsset alloc]initWithURL:anOutputFileURL options:nil];


    AVAssetExportSession * assetExport = [[AVAssetExportSession alloc] initWithAsset:videoAsset

                                                                          presetName:AVAssetExportPresetMediumQuality];

    NSString* mp4Path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.mp4"];

    assetExport.outputURL = [NSURL fileURLWithPath: mp4Path];

    assetExport.shouldOptimizeForNetworkUse = YES;

    assetExport.outputFileType = AVFileTypeMPEG4;

    assetExport.videoComposition = [self getVideoComposition:videoAsset];

    [assetExport exportAsynchronouslyWithCompletionHandler:^{

        switch ([assetExport status]) {

            case AVAssetExportSessionStatusFailed:

            {

                NSLog(@"AVAssetExportSessionStatusFailed!");

                break;

            }


            case AVAssetExportSessionStatusCancelled:

                NSLog(@"Export canceled");

                break;

            case AVAssetExportSessionStatusCompleted:

                NSLog(@"Successful!");

            {

                dispatch_async(dispatch_get_main_queue(), ^{

                  [self recordFinished];

                });

            }


                break;

            default:

                break;

        }

    }];

}

重点在接下来的代码,横屏录制的时候需要调整方向

#pragma mark - 解决录像保存角度问题

-(AVMutableVideoComposition *) getVideoComposition:(AVAsset *)asset

{

    AVAssetTrack *videoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];

    AVMutableComposition *composition = [AVMutableComposition composition];

    AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition];

    CGSize videoSize = videoTrack.naturalSize;

    BOOL isPortrait_ = [self isVideoPortrait:asset];

    if(isPortrait_) {

        NSLog(@"video is portrait ");

        videoSize = CGSizeMake(videoSize.height, videoSize.width);

    }

    composition.naturalSize    = videoSize;

    videoComposition.renderSize = videoSize;

    // videoComposition.renderSize = videoTrack.naturalSize; //

    videoComposition.frameDuration = CMTimeMakeWithSeconds( 1 / videoTrack.nominalFrameRate, 600);


    AVMutableCompositionTrack *compositionVideoTrack;

    compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];

    [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) ofTrack:videoTrack atTime:kCMTimeZero error:nil];

    AVMutableVideoCompositionLayerInstruction *layerInst;

    layerInst = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack];

    [layerInst setTransform:videoTrack.preferredTransform atTime:kCMTimeZero];

    AVMutableVideoCompositionInstruction *inst = [AVMutableVideoCompositionInstruction videoCompositionInstruction];

    inst.timeRange = CMTimeRangeMake(kCMTimeZero, asset.duration);

    inst.layerInstructions = [NSArray arrayWithObject:layerInst];

    videoComposition.instructions = [NSArray arrayWithObject:inst];

    return videoComposition;

}

-(BOOL) isVideoPortrait:(AVAsset *)asset

{

    BOOL isPortrait = FALSE;

    NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo];

    if([tracks    count] > 0) {

        AVAssetTrack *videoTrack = [tracks objectAtIndex:0];


        CGAffineTransform t = videoTrack.preferredTransform;

        // Portrait

        if(t.a == 0 && t.b == 1.0 && t.c == -1.0 && t.d == 0)

        {

            isPortrait = YES;

        }

        // PortraitUpsideDown

        if(t.a == 0 && t.b == -1.0 && t.c == 1.0 && t.d == 0)  {


            isPortrait = YES;

        }

        // LandscapeRight

        if(t.a == 1.0 && t.b == 0 && t.c == 0 && t.d == 1.0)

        {

            isPortrait = FALSE;

        }

        // LandscapeLeft

        if(t.a == -1.0 && t.b == 0 && t.c == 0 && t.d == -1.0)

        {

            isPortrait = FALSE;

        }

    }

    return isPortrait;

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容