添加多个视频资产AVMutableComposition

问题描述:

我没有问题,添加一个视频资产和一个音频资产的AVMutableComposition和使用AVAssetExportSession后得到一个可玩的MOV文件。但是,当我尝试在第一个问题结束后立即添加另一个视频轨道时。无论是 1),第一视频为发挥其最后一帧被冻结的MOV文件的持续时间(第二视频没玩过)。 2)是显示直到第二视频中充分发挥了黑帧。 3)会议将不出口的。添加多个视频资产AVMutableComposition

我通过调整对视频资产的时间范围在各自insertTimeRange:ofTrack: ..方法获得这些不同的结果。

AVURLAsset *firstAsset = [AVURLAsset URLAssetWithURL:vidPathURL options:nil]; 
AVURLAsset *secondAsset = [AVURLAsset URLAssetWithURL:audPathURL options:nil]; 
AVURLAsset *thirdAsset = [AVURLAsset URLAssetWithURL:vidPathURL2 options:nil]; 

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

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

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

CMTime nextClipStartTime = CMTimeAdd(kCMTimeZero, firstAsset.duration); 
CMTimeRange timeRange = CMTimeRangeMake(kCMTimeZero, thirdAsset.duration); 
AVAssetTrack *secondVideoTrack = [[thirdAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 
[firstTrack insertTimeRange:timeRange ofTrack:secondVideoTrack atTime:nextClipStartTime error:nil]; 

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

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

CGAffineTransform rotationTransform = CGAffineTransformMakeRotation(M_PI_2); 
firstTrack.preferredTransform = rotationTransform; 
    // export session 

有没有人有什么想法,应该调整什么?

谢谢。

添加音频轨道与您要添加的第二个视频轨道一起。或者添加一个音轨,其持续时间等于您要添加的两个视频剪辑的长度。这个想法是两个音频/视频轨道的长度相同。

我的猜测是:
[secondTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, secondAsset.duration) ofTrack:[[secondAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil];


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

更换其次,你应该设定一个AVMutableVideoCompositionLayerInstruction对象的不透明度。我建议this HowTo。