一、不可变对象AVCompositionTrack
AVCompositionTrack 继承自AVAssetTrack
,该对象中的轨道,由媒体类型,轨道标识符和轨道片段组成。
合成轨道中第一个轨道段的target.timeRange.start
是kCMTimeZero
,每个后续轨道段的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
:新的持续时间范围。
受缩放操作影响的每个轨道段将以等于其结果timeMapping
的source.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;
网友评论