调用系统UIImagePickerController录像并保存到指定的文件夹,解决保存后播放视频角度偏移90度问题
2014-04-27 11:53
591 查看
#pragma mark - 录像 - (void)recodVideo{ if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { UIImagePickerController* pickerView = [[UIImagePickerController alloc] init]; pickerView.sourceType = UIImagePickerControllerSourceTypeCamera; NSArray* availableMedia = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera]; pickerView.mediaTypes = [NSArray arrayWithObject:availableMedia[1]]; pickerView.videoQuality = UIImagePickerControllerQualityTypeMedium; [self pushVieCtr:pickerView]; // pickerView.videoMaximumDuration = 60; pickerView.delegate = self; [pickerView release]; } }
#pragma mark - UIImagePickerControllerDelegate - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { _videoURL = [info[UIImagePickerControllerMediaURL] retain]; NSLog(@"_videoURL = %@",_videoURL); [picker.flipboardNavigationController popViewController]; [self encodeVideoOrientation:_videoURL]; NSLog(@"_videoURL.absoluteString %@",_videoURL.path); // NSString *videoPath = _videoURL.path; // if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(videoPath)) { // UISaveVideoAtPathToSavedPhotosAlbum(videoPath, self, NULL, NULL); // } }
- (void)encodeVideoOrientation:(NSURL *)anOutputFileURL { _alert = [[UIAlertView alloc] init]; [_alert setTitle:@"Waiting.."]; UIActivityIndicatorView* activity = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; activity.frame = CGRectMake(140, 80, CGRectGetWidth(_alert.frame), CGRectGetHeight(_alert.frame)); [_alert addSubview:activity]; [activity startAnimating]; [activity release]; [_alert show]; [_alert release]; _startDate = [[NSDate date] retain]; AVURLAsset * videoAsset = [[AVURLAsset alloc]initWithURL:anOutputFileURL options:nil]; AVAssetExportSession * assetExport = [[AVAssetExportSession alloc] initWithAsset:videoAsset presetName:AVAssetExportPresetMediumQuality]; NSDateFormatter* formater = [[NSDateFormatter alloc] init]; [formater setDateFormat:@"yyyy-MM-dd-HH:mm:ss"]; _mp4Path = [[NSHomeDirectory() stringByAppendingFormat:@"/Documents/videos/%@.mp4", [formater stringFromDate:[NSDate date]]] retain]; [formater release]; 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!"); [_alert dismissWithClickedButtonIndex:0 animated:NO]; [self performSelectorOnMainThread:@selector(converFailed:) withObject:assetExport waitUntilDone:NO]; break; } case AVAssetExportSessionStatusCancelled: NSLog(@"Export canceled"); [_alert dismissWithClickedButtonIndex:0 animated:YES]; break; case AVAssetExportSessionStatusCompleted: NSLog(@"Successful!"); [self performSelectorOnMainThread:@selector(convertFinish) withObject:nil waitUntilDone:NO]; break; default: break; } [assetExport release]; }]; } #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; }
相关文章推荐
- 20140423学习_request与session的应用
- Values下的文件种类简介
- Android之使用Android-query框架进行开发(一)
- UML建模之时序图(Sequence Diagram)
- html 页面内容滚动显示 marquee
- java serialVersionUID 的作用
- java serialVersionUID 的作用
- Configure Time Synchronization Between Guest and Host Operating Systems
- UIButton设置为disabled且不变灰的解决方法
- QA Manager Required Skills
- STL中的deque容器
- hdu 1423 Greatest Common Increasing Subsequence(LCIS)
- 使用Truetype字体制作ArcGIS符号
- UIViewController
- Request.Params用法
- 基于easyui fom分组插件
- 看病要排队 (HDU 1873)—— STL priority_queue(重载)
- error: Missing required libcurl dev >= 7.18.2故障解决
- FruityWifi动手玩
- HDU 3436 Queue-jumpers(SplayTree+离散化)