Я создаю AVMutableComposition
. Мне нужно, чтобы актив был перевернут по горизонтали, поэтому я устанавливаю преобразование дорожки композиции следующим образом:
compositionTrack.preferredTransform = assetTrack.preferredTransform.scaledBy(x: -1, y: 1)
Если я экспортирую это (я использую AVAssetPreset960x640
в качестве предустановки), это работает, как ожидалось.
Однако мне также нужно добавить AVMutableVideoComposition
оверлей для рендеринга с этим копированием. Этот оверлей не следует переворачивать по горизонтали. Уточняю это так:
// Create video composition
let videoComposition = AVMutableVideoComposition()
videoComposition.renderSize = videoSize
videoComposition.frameDuration = CMTime(value: 1, timescale: 30)
videoComposition.animationTool = AVVideoCompositionCoreAnimationTool(
postProcessingAsVideoLayer: videoLayer,
in: outputLayer
)
let instruction = AVMutableVideoCompositionInstruction()
instruction.timeRange = CMTimeRange(
start: .zero,
duration: composition.duration
)
let layerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: compositionTrack)
layerInstruction.setTransform(assetTrack.preferredTransform, at: .zero)
instruction.layerInstructions = [layerInstruction]
videoComposition.instructions = [instruction]
Когда я экспортирую видео с этим, оно не переворачивается по горизонтали. Он останавливает выполнение primaryTransform, примененного к композиции. Предположительно, причина в этой строке:
layerInstruction.setTransform(assetTrack.preferredTransform, at: .zero)
Если вместо этого я установил преобразование слоя на assetTrack.preferredTransform.scaledBy(x: -1, y: 1)
или compositionTrack.preferredTransform
, при экспорте я получаю черный экран.
У Apple есть эти документы, объясняющие преобразования в AVVideoComposition. Если я правильно понял, они говорят, что я должен просто установить преобразование инструкции слоя. Если я сделаю это - применив преобразование к инструкции слоя, а не к композиции, - у меня все равно будет черный экран.
Почему это так и как это исправить?