您的位置:首页 > 产品设计 > UI/UE

调用系统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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: