新聞中心
近期項(xiàng)目由于要使用拍攝視頻,用的是UIImagePickerViewController,要求是分辨率640x480,但是試了各種
站在用戶的角度思考問題,與客戶深入溝通,找到色尼網(wǎng)站設(shè)計(jì)與色尼網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名與空間、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋色尼地區(qū)。
p_w_picpathPickerController.videoQuality
拍出來的視頻導(dǎo)出來依然達(dá)不到640x480.
并且旋轉(zhuǎn)設(shè)備拍攝后拍攝出來的視頻導(dǎo)出來也是反的。
最后查閱了各種網(wǎng)站找了各種資料之后,看到國外大牛在視頻拍攝完成之后使用AVFoundation做的壓縮和視頻調(diào)整。整理了一下代碼做了部分調(diào)整,感覺到AVfoundation的強(qiáng)大之處,哈哈
這些代碼用在拍攝之后的回掉中,
AVAsset *firstAsset = [AVAssetassetWithURL:[infoobjectForKey:UIImagePickerControllerMediaURL]];
if(firstAsset !=nil && [[firstAsset tracksWithMediaType:AVMediaTypeVideo] count]>0){
//Create AVMutableComposition Object.This object will hold our multiple AVMutableCompositionTrack.
AVMutableComposition* mixComposition = [[AVMutableCompositionalloc]init];
//VIDEO TRACK
AVMutableCompositionTrack *firstTrack = [mixCompositionaddMutableTrackWithMediaType:AVMediaTypeVideopreferredTrackID:kCMPersistentTrackID_Invalid];
[firstTrackinsertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration)ofTrack:[[firstAssettracksWithMediaType:AVMediaTypeVideo]objectAtIndex:0]atTime:kCMTimeZeroerror:nil];
AVMutableVideoCompositionInstruction * MainInstruction = [AVMutableVideoCompositionInstructionvideoCompositionInstruction];
MainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, firstAsset.duration);
if ([[firstAsset tracksWithMediaType:AVMediaTypeAudio] count]>0) {
//AUDIO TRACK
AVMutableCompositionTrack *firstAudioTrack = [mixCompositionaddMutableTrackWithMediaType:AVMediaTypeAudiopreferredTrackID:kCMPersistentTrackID_Invalid];
[firstAudioTrackinsertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration)ofTrack:[[firstAssettracksWithMediaType:AVMediaTypeAudio]objectAtIndex:0]atTime:kCMTimeZeroerror:nil];
}else{
NSLog(@"warning: video has no audio");
}
//FIXING ORIENTATION//
AVMutableVideoCompositionLayerInstruction *FirstlayerInstruction = [AVMutableVideoCompositionLayerInstructionvideoCompositionLayerInstructionWithAssetTrack: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);
[FirstlayerInstructionsetTransform: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 = [AVMutableVideoCompositionvideoComposition];
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 = [[AVAssetExportSessionalloc]initWithAsset:mixCompositionpresetName:AVAssetExportPreset640x480];
exporter.outputURL=url;
exporter.outputFileType =AVFileTypeMPEG4;
exporter.videoComposition = MainCompositionInst;
exporter.shouldOptimizeForNetworkUse =YES;
[exporterexportAsynchronouslyWithCompletionHandler:^
{
dispatch_async(dispatch_get_main_queue(), ^{
// [self exportDidFinish:exporter];
if(exporter.status ==AVAssetExportSessionStatusCompleted){
//視頻保存成功之后的處理
}else{
NSLog(@"error fixing orientation");
}
});
}];
分享名稱:關(guān)于UIImagePickerViewController拍攝video的分辨率和方向的一些代碼整理
本文網(wǎng)址:http://m.biofuelwatch.net/article/psddoi.html