关于UIImagePickerViewController拍摄video的分辨率和方向的一些代码整理

近期项目由于要使用拍摄视频,用的是UIImagePickerViewController,要求是分辨率640x480,但是试了各种

imagePickerController.videoQuality

拍出来的视频导出来依然达不到640x480.

并且旋转设备拍摄后拍摄出来的视频导出来也是反的。

最后查阅了各种网站找了各种资料之后,看到国外大牛在视频拍摄完成之后使用AVFoundation做的压缩和视频调整。整理了一下代码做了部分调整,感觉到AVfoundation的强大之处,哈哈

这些代码用在拍摄之后的回掉中,

AVAsset *firstAsset = [AVAsset assetWithURL:[info objectForKey:UIImagePickerControllerMediaURL]];

if(firstAsset !=nil && [[firstAsset tracksWithMediaType:AVMediaTypeVideo] count]>0){

//Create AVMutableComposition Object.This object will hold our multiple AVMutableCompositionTrack.

AVMutableComposition* mixComposition = [[AVMutableComposition alloc] init];

//VIDEO TRACK

AVMutableCompositionTrack *firstTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];

[firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration) ofTrack:[[firstAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil];

AVMutableVideoCompositionInstruction * MainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];

MainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, firstAsset.duration);

if ([[firstAsset tracksWithMediaType:AVMediaTypeAudio] count]>0) {

//AUDIO TRACK

AVMutableCompositionTrack *firstAudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

[firstAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration) ofTrack:[[firstAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil];

}else{

NSLog(@"warning: video has no audio");

}

//FIXING ORIENTATION//

AVMutableVideoCompositionLayerInstruction *FirstlayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:firstTrack];

AVAssetTrack *FirstAssetTrack = [[firstAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];

UIImageOrientation FirstAssetOrientation_  = UIImageOrientationUp;

BOOL  isFirstAssetPortrait_  = NO;

CGAffineTransform firstTransform = FirstAssetTrack.preferredTransform;

if(firstTransform.a == 0 && firstTransform.b == 1.0 && firstTransform.c == -1.0 && firstTransform.d == 0)

{

FirstAssetOrientation_= UIImageOrientationRight; isFirstAssetPortrait_ = YES;

}

if(firstTransform.a == 0 && firstTransform.b == -1.0 && firstTransform.c == 1.0 && firstTransform.d == 0)

{

FirstAssetOrientation_ =  UIImageOrientationLeft; isFirstAssetPortrait_ = YES;

}

if(firstTransform.a == 1.0 && firstTransform.b == 0 && firstTransform.c == 0 && firstTransform.d == 1.0)

{

FirstAssetOrientation_ =  UIImageOrientationUp;

}

if(firstTransform.a == -1.0 && firstTransform.b == 0 && firstTransform.c == 0 && firstTransform.d == -1.0)

{

FirstAssetOrientation_ = UIImageOrientationDown;

}

CGFloat FirstAssetScaleToFitRatio = 768.0/FirstAssetTrack.naturalSize.width;

if(isFirstAssetPortrait_)

{

FirstAssetScaleToFitRatio = 768.0/FirstAssetTrack.naturalSize.height;

CGAffineTransform FirstAssetScaleFactor = CGAffineTransformMakeScale(FirstAssetScaleToFitRatio,FirstAssetScaleToFitRatio);

[FirstlayerInstruction setTransform:CGAffineTransformConcat(FirstAssetTrack.preferredTransform, FirstAssetScaleFactor) atTime:kCMTimeZero];

}

else

{

CGAffineTransform FirstAssetScaleFactor = CGAffineTransformMakeScale(FirstAssetScaleToFitRatio,FirstAssetScaleToFitRatio);

[FirstlayerInstruction setTransform:CGAffineTransformConcat(CGAffineTransformConcat(FirstAssetTrack.preferredTransform, FirstAssetScaleFactor),CGAffineTransformMakeTranslation(0, 0)) atTime:kCMTimeZero];

}

[FirstlayerInstruction setOpacity:0.0 atTime:firstAsset.duration];

MainInstruction.layerInstructions = [NSArray arrayWithObjects:FirstlayerInstruction,nil];;

AVMutableVideoComposition *MainCompositionInst = [AVMutableVideoComposition videoComposition];

MainCompositionInst.instructions = [NSArray arrayWithObject:MainInstruction];

MainCompositionInst.frameDuration = CMTimeMake(1, 30);

if(isFirstAssetPortrait_)

{

MainCompositionInst.renderSize = CGSizeMake(480.0, 640.0);

}else{

MainCompositionInst.renderSize = CGSizeMake(640.0, 480.0);

}

//            MainCompositionInst.renderSize = CGSizeMake(640.0, 480.0);

NSURL *url = [NSURL fileURLWithPath:videoPath];

exporter = nil;

exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPreset640x480];

exporter.outputURL=url;

exporter.outputFileType = AVFileTypeMPEG4;

exporter.videoComposition = MainCompositionInst;

exporter.shouldOptimizeForNetworkUse = YES;

[exporter exportAsynchronouslyWithCompletionHandler:^

{

dispatch_async(dispatch_get_main_queue(), ^{

//                     [self exportDidFinish:exporter];

if(exporter.status == AVAssetExportSessionStatusCompleted){

//视频保存成功之后的处理

}else{

NSLog(@"error fixing orientation");

}

});

}];

关于UIImagePickerViewController拍摄video的分辨率和方向的一些代码整理

时间: 2024-10-09 06:47:04

关于UIImagePickerViewController拍摄video的分辨率和方向的一些代码整理的相关文章

SAR成像学习(四)距离方向成像matlab代码解析 2

如果发射信号是线性调频信号,上一次讲的距离成像算法流程(匹配滤波方法)依然可以用,但那个流程要求T x =4X 0 c >T p  .如果T x <T p  ,即幅宽相对较小的情况,上一讲中的流程会带来一个问题,解决这个问题的办法是pulse compression.本文将会讨论这个puse compression的原理和实现. 1 what is pulse compression 对于线性调频信号:p(t)=a(t)exp(jβt+jαt 2 ) ,信号持续时间为T p  ,瞬时频率为β+

SAR成像学习(三)距离方向成像matlab代码解析 1

本文将结合matlab代码讲解SAR距离向成像问题. 本文只研究距离向,且是正侧视情况. 文中以同一方位向坐标上四个目标点的成像为例,这四个目标的关系如下: 目标的相关信息: % 关于目标 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Xc=2.e3; % Range distance to center of target area X0=50; % target area in range is within [Xc-X0,Xc+X0] ntarg

android 横方向的Listview附带系统照相图库裁剪

※效果 ※介绍 效果模仿新浪微博发微博的界面,如果需要类似的功能拿来就可以直接:用图片最多选择6张,图片可以点击右上角按钮删除,点击图片可以查看放大图片: 照相和图库都是得到的原图,所以不会出现失真现象,分辨率为 480*480,代码中可以自己调整: ※Demo下载 http://download.csdn.net/detail/u010785585/7672677 android 横方向的Listview附带系统照相图库裁剪

06模块-camera【拍摄照片或视频】

Camera模块管理设备的摄像头,可用于拍照.摄像操作 <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/> <title>Acceleromet

video常用功能

本文的目录: 1.获取影片总时长2.播放.暂停3.获取影片已播放时间和设置播放点4.音量的获取和设置 第一.获取影片总时长 对播放器(video)操作,首先要得到的是影片的一些信息,其中一个就是总时长,除了内容以为,总时长也是第一时间要显示的.在对video进行操作的的前先给video标签添加一个ID,这样方便我们获取video元素 代码如下: <video id="myVideo" controls preload="auto" width=300 heig

jQuery Easy UI (适应屏幕分辨率大小)布局(Layout)

一.jQuery Easy UI (适应屏幕分辨率大小)布局(Layout) 1.首先应用的是jquery-easyui-1.4 版本(版本不同,兼容性不同) 2.实现整个页面的布局( layout: north,south,west,east, center) 3.首先整个页面布局适应屏幕的分辨率大小 4.然后内容区域进行布局,也要适应屏幕分辨率大小 5.部分代码: 1 <body> 2 <div class="easyui-layout" fit="tr

【转载】HTML5 Audio/Video 标签,属性,方法,事件汇总

<audio> 标签属性: src:音乐的URL preload:预加载 autoplay:自动播放 loop:循环播放 controls:浏览器自带的控制条 Html代码 <audio id=”media” src=”http://www.abc.com/test.mp3″ controls></audio> <video> 标签属性: src:视频的URL poster:视频封面,没有播放时显示的图片 preload:预加载 autoplay:自动播放

Android初级教程:屏幕分辨率

在app编码中经常需要获取手机的屏幕分辨率(宽*高),原来我直接上网拷贝代码,但在使用过程中却发现诸多不便. 不便一:下面代码中的getWidth和getHeight在adt上提示deprecated已经废弃了,实在扎眼 WindowManager wm = getWindowManager(); Display display = wm.getDefaultDisplay(); int screenWidth = display.getWidth(); int screenHeight = d

屏幕方向该知道的那些事儿

前言 这两天在学关于屏幕旋转的相关的知识,也延伸出了加速器和陀螺仪这些以前没有深入去学习过的知识点,在没有仔细看之前也有一些问题在想,比如:用户关闭了手机的屏幕旋转,但根据我们的使用经验,APP的界面还是可以旋转的,比如那些视屏播放类型的APP,还是可以全屏观看视频的,那这些是怎么做的?还有比如 你整个项目不允许横屏展示的,而某一个控制器却单独要求横屏展示,这个又该怎么做?用户关闭了手机屏幕旋转,我们还能不能判断手机屏幕的方向?带着这些问题我们一个一个的说一下屏幕方向的那些事儿. 从简单的开始