2013-02-12 49 views
2

我正在使用AVAssetExportSession将几个视频录制连接成一个条目。为什么不应用AVMutableVideoCompositionInstruction?

由于用户可以在录制过程中在前置摄像头和后置摄像头之间切换,录制的方向切换,以便如果使用前置摄像头拍摄包含一个剪辑并使用后置摄像头拍摄一个剪辑,则连接视频将会使用预期的方向显示第一个剪辑,第二个颠倒(反之亦然)。

我知道我需要在导出器上设置videoComposition指令,但是我没有得到任何旋转以适用于导出的视频。

在下面的示例中,我设置了90度的虚拟旋转变换,仅尝试强制进行全面更改,但导出的视频不受影响。 。 。我猜我错过了一些明显的东西,但我看不出是什么,有谁能看到我的错误?

AVMutableComposition *composition = [AVMutableComposition composition]; 
    AVAssetExportSession *assetExport = [AVAssetExportSession exportSessionWithAsset:composition presetName:AVAssetExportPresetPassthrough]; 
    NSMutableArray *instructions = [NSMutableArray new]; 

    AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
    AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
    CGAffineTransform transformToApply=CGAffineTransformMakeRotation(90.0); 

    for (NSURL *path in filePaths) { 
     NSLog(@"%@", path); 
     AVURLAsset *asset =[AVURLAsset assetWithURL:path]; 

     CMTime atTime = composition.duration; 
     [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) 
             ofTrack:[[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] 
             atTime:atTime error:&error]; 

     AVMutableVideoCompositionLayerInstruction *layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:[[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]]; 
     [layerInstruction setTransform:transformToApply atTime:kCMTimeZero];    
     AVMutableVideoCompositionInstruction * videoTrackInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 
     videoTrackInstruction.timeRange = CMTimeRangeMake(atTime, asset.duration); 
     videoTrackInstruction.layerInstructions = [NSArray arrayWithObject:layerInstruction]; 
     [instructions addObject:videoTrackInstruction]; 

     [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) 
             ofTrack:[[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] 
             atTime:atTime error:&error]; 
    } 
    AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition]; 
    videoComposition.instructions = instructions; 
    videoComposition.frameDuration = CMTimeMake(1, compositionVideoTrack.naturalTimeScale); 
    videoComposition.renderSize = compositionVideoTrack.naturalSize; 
    assetExport.videoComposition = videoComposition; 

回答