前言:AVFoundation 在视频编辑上提供了一系列的API来创建非线性,无损的应用程序。我们可以利用AVComposition来实现有关资源组合的功能。
一个组合就是将其他几种媒体资源组合成一个自定义的临时排列,再将这个临时排列视为一个可以呈现或处理的独立媒体项目。如AVAsset对象,组合相当于包含了一个或多个给定类型的媒体轨道的容器。AVComposition 中的轨道都是AVAssetTrack的子类AVCompositionTrack。
在创建资源用于组合时,应该创建AVURLAsset。时间则是选用更为精准恰当的CMTime。
主要代码如下:
- (id <THComposition>)buildComposition {
self.composition = [AVMutableComposition composition]; // 1
[self addCompositionTrackOfType:AVMediaTypeVideo
withMediaItems:self.timeline.videos];
[self addCompositionTrackOfType:AVMediaTypeAudio
withMediaItems:self.timeline.voiceOvers];
[self addCompositionTrackOfType:AVMediaTypeAudio
withMediaItems:self.timeline.musicItems];
// Create and return the basic composition // 2
return [THBasicComposition compositionWithComposition:self.composition];
}
- (void)addCompositionTrackOfType:(NSString *)mediaType
withMediaItems:(NSArray *)mediaItems {
if (!THIsEmpty(mediaItems)) { // 1
CMPersistentTrackID trackID = kCMPersistentTrackID_Invalid;
AVMutableCompositionTrack *compositionTrack = // 2
[self.composition addMutableTrackWithMediaType:mediaType
preferredTrackID:trackID];
// Set insert cursor to 0
CMTime cursorTime = kCMTimeZero; // 3
for (THMediaItem *item in mediaItems) {
if (CMTIME_COMPARE_INLINE(item.startTimeInTimeline, // 4
!=,
kCMTimeInvalid)) {
cursorTime = item.startTimeInTimeline;
}
AVAssetTrack *assetTrack = // 5
[[item.asset tracksWithMediaType:mediaType] firstObject];
[compositionTrack insertTimeRange:item.timeRange // 6
ofTrack:assetTrack
atTime:cursorTime
error:nil];
// Move cursor to next item time
cursorTime = CMTimeAdd(cursorTime, item.timeRange.duration); // 7
}
}
}