如何使用多个 AVVideoCompositions 合成视频
How to composite videos using multiple AVVideoCompositions
我正在尝试弄清楚如何将多个视频 (AVAssets)
合成为一个视频,以便每个视频都经过自己的视频合成。但是,我看不到实现此目的的方法,并且想知道是否有人有任何想法。
考虑以下因素:
上图说明了我正在尝试做的事情。我想从四个不同的视频中提取视频轨道并将它们合并成一个视频,以便它们以类似网格的布局播放。
现在,我可以通过执行以下操作来实现此目的
创建单个AVMutableComposition
向可变合成中添加四个视频轨道
创建四个 AVMutableVideoCompositionLayerInstruction
实例,并应用适当的 transform
来缩放和平移轨道。
创建一个 AVMutableVideoComposition
,向其添加图层指令,然后在适当的 AVAssetExportSession
上设置该视频合成
虽然这可行,但它无法让我在将每个视频轨道合成到输出剪辑之前对其进行任何自定义效果。例如,在上图中,我想在每个轨道周围添加一个独特的边框颜色。使用单个视频(因此没有图层说明),然后我可以使用 AVVideoComposition applyingCIFiltersWithHandler
之类的东西添加边框,效果很好。但我不能使用它,因为我需要视频合成来设置变换和缩放指令。
(applyingCIFiltersWithHandler
似乎没有提供一种方法来访问构成正在渲染的帧的轨道。)
我想我想要的是能够在 AVMutableVideoCompositionLayerInstruction
中进行某种类型的自定义渲染,但目前唯一可用的选项是变换和不透明选项。
(请注意,任何解决方案都要求我在渲染期间能够访问每个视频轨道的当前合成时间,因为一些 "effects" 我想render 是一个帧计数器和一个时间码显示。)
如有任何帮助、想法或提示,我们将不胜感激。
您需要实现一个实现 AVVideoCompositing 协议的自定义合成器。 https://developer.apple.com/reference/avfoundation/avvideocompositing
该协议中的 startRequest 函数接收一个 https://developer.apple.com/reference/avfoundation/avasynchronousvideocompositionrequest and this allows you to access the information from each track https://developer.apple.com/reference/avfoundation/avasynchronousvideocompositionrequest/1390379-sourceframe,然后将它们与您自己的自定义指令组合并以您自己的方式组合(将它们放在一起),返回一个最终的单个缓冲区,该缓冲区的帧由以您喜欢的方式播放曲目。
我正在尝试弄清楚如何将多个视频 (AVAssets)
合成为一个视频,以便每个视频都经过自己的视频合成。但是,我看不到实现此目的的方法,并且想知道是否有人有任何想法。
考虑以下因素:
上图说明了我正在尝试做的事情。我想从四个不同的视频中提取视频轨道并将它们合并成一个视频,以便它们以类似网格的布局播放。
现在,我可以通过执行以下操作来实现此目的
创建单个
AVMutableComposition
向可变合成中添加四个视频轨道
创建四个
AVMutableVideoCompositionLayerInstruction
实例,并应用适当的transform
来缩放和平移轨道。创建一个
AVMutableVideoComposition
,向其添加图层指令,然后在适当的AVAssetExportSession
上设置该视频合成
虽然这可行,但它无法让我在将每个视频轨道合成到输出剪辑之前对其进行任何自定义效果。例如,在上图中,我想在每个轨道周围添加一个独特的边框颜色。使用单个视频(因此没有图层说明),然后我可以使用 AVVideoComposition applyingCIFiltersWithHandler
之类的东西添加边框,效果很好。但我不能使用它,因为我需要视频合成来设置变换和缩放指令。
(applyingCIFiltersWithHandler
似乎没有提供一种方法来访问构成正在渲染的帧的轨道。)
我想我想要的是能够在 AVMutableVideoCompositionLayerInstruction
中进行某种类型的自定义渲染,但目前唯一可用的选项是变换和不透明选项。
(请注意,任何解决方案都要求我在渲染期间能够访问每个视频轨道的当前合成时间,因为一些 "effects" 我想render 是一个帧计数器和一个时间码显示。)
如有任何帮助、想法或提示,我们将不胜感激。
您需要实现一个实现 AVVideoCompositing 协议的自定义合成器。 https://developer.apple.com/reference/avfoundation/avvideocompositing
该协议中的 startRequest 函数接收一个 https://developer.apple.com/reference/avfoundation/avasynchronousvideocompositionrequest and this allows you to access the information from each track https://developer.apple.com/reference/avfoundation/avasynchronousvideocompositionrequest/1390379-sourceframe,然后将它们与您自己的自定义指令组合并以您自己的方式组合(将它们放在一起),返回一个最终的单个缓冲区,该缓冲区的帧由以您喜欢的方式播放曲目。