美文网首页
UIImagePickController录制视频的旋转90度

UIImagePickController录制视频的旋转90度

作者: 今年27 | 来源:发表于2017-08-14 16:25 被阅读32次

调用系统的这个玩意竟然会有这个问题,真是不爽.

于是乎开始查资料:

-(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.videoMaximumDuration=10.0;

//模态视图的弹出效果

imagePicker.modalPresentationStyle=UIModalPresentationOverFullScreen;

[self presentViewController:imagePicker animated:YES completion:nil];

}

}

-(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!");

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;

}

反正整个过程的逻辑大概就是判断视频方向,重新做一个压缩处理,转换成正确的方向.亲测可用!

相关文章

  • UIImagePickController录制视频的旋转90度

    调用系统的这个玩意竟然会有这个问题,真是不爽. 于是乎开始查资料: -(void)useTheSystemReco...

  • iOS开发 AVFoundation 录制视频 拼接

    使用AVFoundation 录制视频 并拼接起来 录制的视频 保存到本地 是旋转90度的,如果需要正的话需要旋转...

  • YUV图像旋转

    手机竖屏录制的视频,PC 播放时需要对解码后的数据做下旋转。 视频旋转角度获取 命令行获取 使用 ffprobe....

  • iOS录制视频的问题求助

    iOS上内置相机应用录制的mov/mp4视频竖屏拍照的时候产生一个Rotation元数据,表示录制视频时摄像头旋转...

  • 在竖屏锁定下,判断屏幕方向的问题

    自定义相机拍照和录制的时候,需求是横屏录制或拍照的时候,预览视频或图片要求竖屏显示。首先想到添加屏幕旋转通知,控制...

  • 专业正版一键解锁,不要太爽,低调使用...

    录制视频是一个很常见的需求,比如给别人录制操作步骤,做B站等视频平台需要录制视频,录制网课等教学课程,录制游戏视频...

  • 视频的录制

    #import "ViewController.h"#import@interface ViewControlle...

  • 《录制视频》

    讲师四期翟冲【原创】分享第604天2018.08.29今天我们几个伙伴一块录制视频,完成幸福家第三阶的作业。因为昨...

  • 视频录制

    https://www.jianshu.com/p/fe00883ad3d2https://www.jianshu...

  • 视频录制

    视频录制需要导入AVFoundation框架,视频录制的基本步骤: <1>创建视频、音频设备<2>指定视频、音频设...

网友评论

      本文标题:UIImagePickController录制视频的旋转90度

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