UIImagePickerController通過leak工具測試的時(shí)候會有內(nèi)存泄漏,通過Google了一番說把它寫成一個(gè)單例的就可以解決內(nèi)存泄漏.
抱歉,我自己經(jīng)過測試時(shí)候告訴你,寫成單例也不行.謝謝,如果有請告訴我
接下來上使用的代碼,我是用來錄像
-(void)useTheSystemRecordViewController{
? ? UIImagePickerController * imagePicker = [[UIImagePickerController alloc] init];
? ? imagePicker.delegate = self;
? ? //判斷是否可以拍攝
? ? if ( [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
? ? ? ? //判斷是否擁有拍攝權(quán)限
? ? ? ? AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
? ? ? ? if(authStatus == AVAuthorizationStatusRestricted || authStatus == AVAuthorizationStatusDenied){
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? //拍攝
? ? ? ? imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
? ? ? ? //錄制的類型 下面為視頻
? ? ? ? imagePicker.mediaTypes=@[(NSString*)kUTTypeMovie];
? ? ? ? imagePicker.videoQuality? = UIImagePickerControllerQualityTypeIFrame960x540;
? ? ? ? //錄制的時(shí)長
? ? ? ? imagePicker.videoMaximumDuration=20.0;
? ? ? ? //模態(tài)視圖的彈出效果
? ? ? ? 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];
? ? ? ? ? ? }
? ? ? ? ? ? //通過文件管理器將視頻存放的創(chuàng)建的路徑中
? ? ? ? ? ? [fm copyItemAtURL:[info objectForKey:UIImagePickerControllerMediaURL] toURL:mergeFileURL error:nil];
? ? ? ? ? ? [self encodeVideoOrientation:mergeFileURL];
? ? ? ? ? ? /*
? ? ? ? ? ? AVURLAsset * asset = [AVURLAsset assetWithURL:[NSURL fileURLWithPath:pathToMovie]];
? ? ? ? ? ? //根據(jù)AVURLAsset得出視頻的時(shí)長
? ? ? ? ? ? CMTime? time = [asset duration];
? ? ? ? ? ? int seconds = ceil(time.value/time.timescale);
? ? ? ? ? ? NSString *videoTime = [NSString stringWithFormat:@"%d",seconds];
? ? ? ? ? ? */
? ? ? ? ? ? //可以根據(jù)需求判斷是否需要將錄制的視頻保存到系統(tǒng)相冊中
? ? ? ? ? ? //? ? ? ? ? ? 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;
? ? ? ? }
? ? }];
}
重點(diǎn)在接下來的代碼,橫屏錄制的時(shí)候需要調(diào)整方向
#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;
}