描述如何在特定时间点组成视频帧的对象。
如果您使用内置视频合成器,视频合成中包含的指令可以为每个视频源指定空间变换、不透明度值和裁剪矩形。这些值可以通过应用线性渐变函数随时间变化。
您可以通过实现 AVVideoCompositing 协议来创建自定义视频合成器。系统会在播放期间为每个视频源提供像素缓冲区,并可对它们执行任意图形操作以生成视觉输出。
- 提供一个新的 AVVideoComposition 实例,其中包含适合根据指定资产的时间和几何属性及其轨道的属性呈现该资产的视频轨道的值和指令。
completionHandler:
系统使用创建的视频合成调用的回调,或者在发生故障时调用错误。
新的 AVVideoComposition 将包含遵循指定资源视频轨道的空间属性和时间范围的指令。
- 如果资源只有一个视频轨道,则将使用源视频轨道的原始时序。如果资源有多个视频轨道,并且已知任意一个视频轨道的标称帧率,则将使用已知最大标称帧率 (nominalFrameRate) 的倒数作为 frameDuration 的值。否则,将使用默认帧率 30fps。
- 如果指定的资源是 AVComposition 的实例,则将 renderSize 设置为 AVComposition 的 naturalSize;否则,将 renderSize 设置为包含资源所有视频轨道的值。
- renderScale 为 1.0。
- animationTool 为 nil。
如果指定的资产没有视频轨道,则此方法将返回一个带有空指令集合的 AVVideoComposition 实例。
+ (void)videoCompositionWithPropertiesOfAsset:(AVAsset *)asset completionHandler:(void (^ NS_SWIFT_SENDABLE)(AVVideoComposition * _Nullable videoComposition, NSError * _Nullable error))completionHandler
- 表示要使用的自定义合成器类。该类必须实现 AVVideoCompositing 协议。
如果为nil,则使用默认的内部视频合成器
@property (nonatomic, readonly, nullable) Class<AVVideoCompositing> customVideoCompositorClass
- 表示启用视频合成后渲染合成视频帧的间隔
@property (nonatomic, readonly) CMTime frameDuration;
- 如果 sourceTrackIDForFrameTiming 不为 kCMPersistentTrackID_Invalid,则视频合成的帧定时将从源资源的相应 ID 轨道获取。这可用于保存源资源的可变帧定时。如果在源资源的轨道中遇到空编辑,合成器将根据需要合成帧,直至达到 frameDuration 属性中指定的频率。
@property (nonatomic, readonly) CMPersistentTrackID sourceTrackIDForFrameTiming
- 指示启用时视频合成应呈现的尺寸
@property (nonatomic, readonly) CGSize renderSize;
- 指示视频合成的渲染比例。对于在 AVPlayerItem 上设置的视频合成,该比例不能为 1.0。
@property (nonatomic, readonly) float renderScale
- 通过实现 AVVideoCompositionInstruction 协议的类实例的 NSArray 来指示视频合成的指令。
对于数组中的第一条指令,timeRange.start 必须小于或等于尝试播放或其他处理的最早时间(请注意,这通常是 kCMTimeZero)。对于后续指令,timeRange.start 必须等于前一条指令的结束时间。最后一条指令的结束时间必须大于或等于尝试播放或其他处理的最晚时间(请注意,这通常是与 AVVideoComposition 实例关联的素材的时长)。
@property (nonatomic, readonly, copy) NSArray<id <AVVideoCompositionInstruction>> *instructions;
- 表示用于核心动画的特殊视频合成工具;可能为nil
@property (nonatomic, readonly, retain, nullable) AVVideoCompositionCoreAnimationTool *animationTool;
- 列出所有轨道的 ID,这些轨道的样本数据应在整个合成过程中的任意时间点呈现给合成器。样本数据将通过 AVAsynchronousVideoCompositionRequest 传递给自定义合成器。
@property (nonatomic, readonly) NSArray<NSNumber *> *sourceSampleDataTrackIDs
@interface AVVideoComposition (AVVideoCompositionColorimetery)
10 . 渲染将使用这些原色,并且帧也将被标记为原色。如果此属性的值为 nil,则将传播并使用源原色。
默认值为 nil。有效值适用于 AVVideoColorPrimariesKey。通常设置为与 colorYCbCrMatrix 和 colorTransferFunction 一起的三元组。
@property (nonatomic, readonly, nullable) NSString *colorPrimaries
- 渲染将使用此矩阵,并且帧将被标记为此矩阵。如果此属性的值为 nil,则将传播并使用源矩阵。
默认值为 nil。有效值适用于 AVVideoYCbCrMatrixKey。通常与 colorPrimaries 和 colorTransferFunction 一起设置为三元组。
@property (nonatomic, readonly, nullable) NSString *colorYCbCrMatrix
- 渲染将使用此传递函数,并且帧将被标记为此函数。如果此属性的值为 nil,则将传播并使用源的传递函数。
默认值为 nil。有效值适用于 AVVideoTransferFunctionKey。通常设置为与 colorYCbCrMatrix 和 colorYCbCrMatrix 一起的三元组。
@property (nonatomic, readonly, nullable) NSString *colorTransferFunction
- 配置渲染帧上每帧 HDR 显示元数据的策略
允许系统识别可以生成 HDR 元数据并将其附加到渲染视频帧的情况。
默认值为 AVVideoCompositionPerFrameHDRDisplayMetadataPolicyPropagate。附加到合成帧的任何 HDR 元数据都将传播到渲染视频帧。
@property (nonatomic, readonly) AVVideoCompositionPerFrameHDRDisplayMetadataPolicy perFrameHDRDisplayMetadataPolicy
@interface AVVideoComposition (AVVideoCompositionFiltering)
- 提供 AVVideoComposition 的新实例,其中包含将指定的处理程序块应用于表示为 CIImage 实例的视频帧的值和指令。
completionHandler:
新视频合成创建完成后调用的块。如果 videoComposition
参数为 nil,则 error
参数会描述发生的失败。
新的 AVVideoComposition 将导致调用指定的处理程序块来过滤资源中第一个启用的视频轨道的每一帧。处理程序块应使用提供的 AVAsynchronousCIImageFilteringRequest 的属性,并使用 finishWithImage:context: 响应一个“已过滤”的新 CIImage(或提供的源图像,否则不受影响)。如果发生错误,请使用 finishWithError: 响应请求。可以通过 AVPlayerItemFailedToPlayToEndTimeNotification 来观察错误,请参阅通知负载中的 AVPlayerItemFailedToPlayToEndTimeErrorKey。
注意:
返回的 AVVideoComposition 属性是私有的,仅支持基于 CIFilter 的操作。不支持修改 AVVideoComposition 本身的属性值或其私有指令。如果需要旋转或其他变换,则必须在指定处理程序执行期间通过应用 CIFilter 来完成。
视频合成的属性还具有以下值:
- 将使用资源第一个启用的视频轨道的原始时间。
- 渲染大小 (renderSize) 包含资源第一个启用的视频轨道,并遵循该轨道的 preferredTransform。
- 渲染比例 (renderScale) 为 1.0。
默认的 CIContext 具有以下属性:
- iOS:设备 RGB 色彩空间
- macOS:sRGB 色彩空间
Example usage:
[AVVideoComposition videoCompositionWithAsset:srcAsset applyingCIFiltersWithHandler:
^(AVAsynchronousCIImageFilteringRequest *request)
{
NSError *err = nil;
CIImage *filtered = myRenderer(request, &err);
if (filtered)
[request finishWithImage:filtered context:nil];
else
[request finishWithError:err];
} completionHandler:
^(AVVideoComposition * _Nullable videoComposition, NSError * _Nullable error)
{
if (videoComposition != nil) {
playerItem.videoComposition = videoComposition
else {
// handle error
}];
+ (void)videoCompositionWithAsset:(AVAsset *)asset applyingCIFiltersWithHandler:(void (^ NS_SWIFT_SENDABLE)(AVAsynchronousCIImageFilteringRequest *request))applier completionHandler:(void (^ NS_SWIFT_SENDABLE)(AVVideoComposition * _Nullable videoComposition, NSError * _Nullable error))completionHandler
@interface AVMutableVideoComposition : AVVideoComposition
可变的视频合成子类。
- 返回 AVMutableVideoComposition 的新实例。
返回的 AVMutableVideoComposition 将具有 kCMTimeZero 的 frameDuration、{0.0, 0.0} 的 renderSize、nil 的指令数组和 nil 的 animationTool。
+ (AVMutableVideoComposition *)videoComposition;
- 提供一个新的 AVMutableVideoComposition 实例,其中包含适合根据指定资产的时间和几何属性及其轨道的属性呈现该资产的视频轨道的值和指令。
新的 AVMutableVideoComposition 将包含遵循指定资源视频轨道的空间属性和时间范围的指令。客户端可以将 sourceTrackIDForFrameTiming 设置为 kCMPersistentTrackID_Invalid,并将 frameDuration 设置为适当的值,以便指定独立于源轨道时序的最大输出帧率。
它的属性值如下:
- 如果资源只有一个视频轨道,则使用源视频轨道的原始时序。如果资源有多个视频轨道,并且已知任何视频轨道的标称帧率,则将使用已知最大标称帧率的倒数作为 frameDuration 的值。否则,将使用默认帧率 30fps。
- 如果指定的资源是 AVComposition 的实例,则 renderSize 将设置为 AVComposition 的 naturalSize;否则,renderSize 将设置为包含资源所有视频轨道的值。
- 渲染比例 (renderScale) 为 1.0。
- 动画工具 (animationTool) 为 nil。
如果指定的资源没有视频轨道,此方法将返回一个包含空指令集合的 AVMutableVideoComposition 实例。
+ (void)videoCompositionWithPropertiesOfAsset:(AVAsset *)asset completionHandler:(void (^ NS_SWIFT_SENDABLE)(AVMutableVideoComposition * _Nullable videoComposition, NSError * _Nullable error))completionHandler
- 通过实现 AVVideoCompositionInstruction 协议的类实例的 NSArray 来指示视频合成的指令。
对于数组中的第一条指令,timeRange.start 必须小于或等于尝试播放或其他处理的最早时间(请注意,这通常是 kCMTimeZero)。对于后续指令,timeRange.start 必须等于前一条指令的结束时间。最后一条指令的结束时间必须大于或等于尝试播放或其他处理的最晚时间(请注意,这通常是
与 AVVideoComposition 实例关联的素材资源的时长)。
@property (nonatomic, copy) NSArray<id <AVVideoCompositionInstruction>> *instructions;