AVFoundation之视频编辑组合

前言: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
        }
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值