2013-04-20 29 views
3

我正在合并视频使用AVMutableComposition和视频合并。但视频获取存储在横向(这是AVAsset默认模式)后合并。所以我希望视频只能在纵向模式下修复...是有任何方法可将视频方向设置为纵向模式。 Thanx提前如何使用CAAffineTranslation或其他方式将风景的视频方向设置为纵向?

这里是我用于合并视频

NSArray *arrVideoUrl=[objApp.dictSelectedVideos allKeys]; 
NSMutableArray *arrVideoAsset=[[NSMutableArray alloc]init]; 
for (int i=0; i<objApp.dictSelectedVideos.count; i++) { 
     AVURLAsset *video=[[AVURLAsset alloc]initWithURL:[arrVideoUrl objectAtIndex:i] options:nil]; 
    [arrVideoAsset addObject:video]; 
} 
AVURLAsset *music_track=[[AVURLAsset alloc]initWithURL:songUrl options:nil]; 
//to mix up the media items 
AVMutableComposition *mixComposition = [[AVMutableComposition alloc] init]; 
//Setting Audio track 
AVMutableCompositionTrack *AudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
//setting the track to add the videos 
AVMutableCompositionTrack *firstTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
AVURLAsset *tempVideo1=[arrVideoAsset objectAtIndex:0]; 
AVURLAsset *tempVideo2=[arrVideoAsset objectAtIndex:1]; 
[firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, tempVideo1.duration)ofTrack:[[tempVideo1 tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil]; 
if (arrVideoUrl.count==1) 
{ 
    [AudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, CMTimeAdd(kCMTimeZero, tempVideo2.duration))ofTrack:[[music_track tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil]; 
} 
else{ 
     for (int j=1; j<=arrVideoAsset.count-1; j++) 
    { 
     AVURLAsset *tempVideoNext=[arrVideoAsset objectAtIndex:j]; 
     AVURLAsset *tempVideoPrev=[arrVideoAsset objectAtIndex:j-1]; 
     [firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, tempVideoNext.duration)ofTrack:[[tempVideoNext tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:tempVideoPrev.duration error:nil]; 

    } 
    [AudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, CMTimeAdd(tempVideo1.duration, tempVideo2.duration))ofTrack:[[music_track tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil]; 

}

+0

你是否能够为此提出解决方案? – Anil 2013-05-14 12:41:06

+0

是的,将此行添加到代码中。 [compositionVideoTrack setPreferredTransform:videoTrack.preferredTransform]; 但是这一行将设置视频的默认方向,即如果视频是纵向的,那么它将仅在potrait中,并克服由于avexport会话的默认属性而导致方向改变的问题。 如果它在横向上,它将不会转换为肖像.... – 2013-05-15 10:06:36

回答

2

我发现了另一个解决方案还...如果u希望的方向从横向更改为纵向的代码。 ..使用此代码

 
AVMutableVideoComposition *videoComp = [AVMutableVideoComposition videoComposition]; 
videoComp.renderSize = videoSize; 
videoComp.frameDuration = CMTimeMake(1, 30); 
videoComp.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer]; 
AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 
instruction.timeRange = CMTimeRangeMake(kCMTimeZero, [mixComposition duration]); 
AVAssetTrack *videoTrack = [[mixComposition tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 

AVMutableVideoCompositionLayerInstruction* layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack]; 
instruction.layerInstructions = [NSArray arrayWithObject:layerInstruction]; 
videoComp.instructions = [NSArray arrayWithObject: instruction]; 

UIImageOrientation videoAssetOrientation_ = UIImageOrientationUp; 
BOOL isVideoAssetPortrait_ = NO; 
CGAffineTransform videoTransform = clipVideoTrack.preferredTransform; 

if(videoTransform.a == 0 && videoTransform.b == 1.0 && videoTransform.c == -1.0 && videoTransform.d == 0) {videoAssetOrientation_= UIImageOrientationRight; isVideoAssetPortrait_ = YES;} 
if(videoTransform.a == 0 && videoTransform.b == -1.0 && videoTransform.c == 1.0 && videoTransform.d == 0) {videoAssetOrientation_ = UIImageOrientationLeft; isVideoAssetPortrait_ = YES;} 
if(videoTransform.a == 1.0 && videoTransform.b == 0 && videoTransform.c == 0 && videoTransform.d == 1.0) {videoAssetOrientation_ = UIImageOrientationUp;} 
if(videoTransform.a == -1.0 && videoTransform.b == 0 && videoTransform.c == 0 && videoTransform.d == -1.0) {videoAssetOrientation_ = UIImageOrientationDown;} 

CGFloat FirstAssetScaleToFitRatio = 320.0/clipVideoTrack.naturalSize.width; 

if(isVideoAssetPortrait_) { 
    FirstAssetScaleToFitRatio = 320.0/clipVideoTrack.naturalSize.height; 
    CGAffineTransform FirstAssetScaleFactor = CGAffineTransformMakeScale(FirstAssetScaleToFitRatio,FirstAssetScaleToFitRatio); 
    [layerInstruction setTransform:CGAffineTransformConcat(clipVideoTrack.preferredTransform, FirstAssetScaleFactor) atTime:kCMTimeZero]; 
}else{ 
    CGAffineTransform FirstAssetScaleFactor = CGAffineTransformMakeScale(FirstAssetScaleToFitRatio,FirstAssetScaleToFitRatio); 
    [layerInstruction setTransform:CGAffineTransformConcat(CGAffineTransformConcat(clipVideoTrack.preferredTransform, FirstAssetScaleFactor),CGAffineTransformMakeTranslation(0, 160)) atTime:kCMTimeZero]; 
} 

// [layerInstruction本身tOpacity:0.0 atTime:kCMTimeZero];

AVAssetExportSession *assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality];//AVAssetExportPresetPassthrough 
assetExport.videoComposition = videoComp; 
相关问题