美文网首页
用UIImagePickerController需要知道

用UIImagePickerController需要知道

作者: 今年27 | 来源:发表于2018-01-10 16:41 被阅读27次

    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;

    }

    相关文章

      网友评论

          本文标题:用UIImagePickerController需要知道

          本文链接:https://www.haomeiwen.com/subject/ytwonxtx.html