2

AVMutableComposition在使用AVAssetExportSession. 但是,当我尝试在第一个视频轨道之后立即添加另一个视频轨道时,我遇到了问题。1)播放第一个视频,并且在 mov 文件的持续时间内冻结其最后一帧(第二个视频永远不会播放)。2) 在第二个视频完全播放之前,会显示一个黑框。3)会话根本不会导出。

我通过调整视频资产各自的时间范围来获得这些不同的结果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

有谁知道应该在这里调整什么?

谢谢。

4

2 回答 2

0

我的猜测是:
[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 对象的不透明度。我推荐这个HowTo。

于 2012-11-30T13:00:18.910 回答
0

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

于 2012-09-08T21:37:36.007 回答