美文网首页
OC之插入,移除和缩放轨道片段AVCompositionTrac

OC之插入,移除和缩放轨道片段AVCompositionTrac

作者: 苏沫离 | 来源:发表于2018-10-18 21:45 被阅读0次

    一、不可变对象AVCompositionTrack

    AVCompositionTrack 继承自AVAssetTrack,该对象中的轨道,由媒体类型,轨道标识符和轨道片段组成。

    合成轨道中第一个轨道段的target.timeRange.startkCMTimeZero,每个后续轨道段的target.timeRange.start等于CMTimeRangeGetEnd(target.timeRange)

    //合成轨道的轨道段。
    @property(nonatomic, readonly, copy) NSArray<AVCompositionTrackSegment *> *segments;
    
    - (AVCompositionTrackSegment *)segmentForTrackTime:(CMTime)trackTime;
    

    AVFoundation框架还提供了一个可变子类AVMutableCompositionTrack


    二、可变对象AVMutableCompositionTrack

    AVMutableCompositionTrack 继承自AVCompositionTrack,合成对象中的可变轨道,用于插入,移除和缩放轨道片段,而不会影响其低级别表示。

    AVCompositionTrack定义了轨道段时间对齐的约束。如果在可变组合中设置轨道段数组,则可以使用-validateTrackSegments:error:测试这些段是否满足约束条件。

    1、管理时间范围

    1.1、扩展空时间范围
    - (void)insertEmptyTimeRange:(CMTimeRange)timeRange;
    

    在接收器中添加或扩展空时间范围:

    • 参数timeRange:要插入的空时间范围。

    如果在轨道中插入空的时间范围,则在插入之前的该间隔期间显示的任何媒体将立即显示。
    插入数据的性质取决于轨道的媒体类型;例如,声道中的空时间范围呈现静音。

    1.2、插入源轨道的时间范围
    - (BOOL)insertTimeRange:(CMTimeRange)timeRange
    ofTrack:(AVAssetTrack *)track
    atTime:(CMTime)startTime
    error:(NSError * _Nullable *)outError;
    
    • 参数timeRange:要插入的轨道的时间范围。
    • 参数track:要插入的源轨道。
    • 参数startTime:由合成轨道表示的轨道出现的时间。
    • 参数outError:如果未成功插入track,则返回NSError
    • 返回值:如果已成功插入轨道,则为YES,否则为NO。

    默认情况下,插入轨道的时间范围以其自然持续时间和速率显示。可以使用-scaleTimeRange:toDuration:将其缩放到不同的持续时间(以便以不同的速率显示)。
    例如,如果尝试插入的AVAsset受到复制保护的限制,则插入可能会失败。

    1.3、将多个源轨道的timeRanges插入到合成轨道中
    - (BOOL)insertTimeRanges:(NSArray<NSValue *> *)timeRanges
    ofTracks:(NSArray<AVAssetTrack *> *)tracks
    atTime:(CMTime)startTime
    error:(NSError * _Nullable *)outError;
    
    • 参数timeRanges:包含CMTimeRange结构的NSValue对象数组,指示要插入的时间范围。
    • 参数tracks:要插入的源轨道。仅支持AVURLAsset实例。
    • 参数startTime:插入轨道由合成轨道呈现的时间。
    • 参数outError:发生错误时,返回NSError;例如,选择插入合成中的资源受到复制保护的限制。
    • 返回值:如果插入成功则为YES,否则为NO。

    对于每个timeRange/track对,此方法等效于调用-insertTimeRange:ofTrack:atTime:error:
    如果此方法返回错误,则不会将任何时间范围插入合成轨道。
    要指定空时间范围,请为轨道传递NSNull对象,并以kCMTimeInvalid开始时间范围,并使用所需空编辑的持续时间。

    1.4、移除指定的时间范围
    - (void)removeTimeRange:(CMTimeRange)timeRange;
    
    • 参数timeRange:要删除的时间范围。

    删除时间范围不会导致从合成中删除轨道。相反,它会删除或截断与时间范围相交的轨道段。

    1.5、更改持续时间
    - (void)scaleTimeRange:(CMTimeRange)timeRange
    toDuration:(CMTime)duration;
    

    更改接收器中时间范围的持续时间:

    • 参数timeRange:要缩放的轨道的时间范围。
    • 参数duration:新的持续时间范围。

    受缩放操作影响的每个轨道段将以等于其结果timeMappingsource.duration/target.duration的速率呈现。

    1.6、合成轨道的轨道段

    合成轨道的轨道段数组。

    @property(nonatomic, copy) NSArray<AVCompositionTrackSegment *> *segments;
    

    合成轨道中第一个轨道段的target.timeRange.start必须是kCMTimeZero,并且每个后续轨道段的target.timeRange.start必须等于CMTimeRangeGetEnd(target.timeRange)。可以使用-validateTrackSegments:error:确保轨道段数组符合此规则。

    2、验证片断

    返回一个布尔值,指示给定的轨道段数组是否符合合成轨道的时间规则。

    - (BOOL)validateTrackSegments:(NSArray<AVCompositionTrackSegment *> *)trackSegments
    error:(NSError * _Nullable *)outError;
    

    可以使用此方法确保轨道段数组适合设置为segments属性的值。合成轨道中第一个轨道段的target.timeRange.start必须是kCMTimeZero,并且每个后续轨道段的target.timeRange.start必须等于CMTimeRangeGetEnd(target.timeRange)
    如果要修改现有的段数组,可以创建它的可变副本,修改可变数组,然后使用此方法验证可变数组。

    3、配置轨道属性

    属性 数据类型 描述
    languageCode NSString 与轨道相关的语言为ISO 639-2/T;默认为nil
    extendedLanguageTag NSString 与轨道关联的语言标记为RFC 4646;默认为nil
    naturalTimeScale CMTimeScale 不需要额外的数值转换就可以对轨道的时间值进行操作的时间尺度。如果没有设置,则该值为第一个非空编辑的自然时间尺度,如果没有非空编辑,则为600。将值设置为0以恢复为默认行为。
    preferredTransform CGAffineTransform 视频数据的首选转换用于显示目的;默认为CGAffineTransformIdentity
    preferredVolume float 可听媒体数据的首选音量;默认为1.0。

    4、实例方法

    - (void)addTrackAssociationToTrack:(AVCompositionTrack *)compositionTrack
    type:(AVTrackAssociationType)trackAssociationType;
    
    
    - (void)removeTrackAssociationToTrack:(AVCompositionTrack *)compositionTrack
    type:(AVTrackAssociationType)trackAssociationType;
    

    相关文章

      网友评论

          本文标题:OC之插入,移除和缩放轨道片段AVCompositionTrac

          本文链接:https://www.haomeiwen.com/subject/imkjzftx.html