Равномерное затухание в AVMutableVideoCompositionLayerInstruction - PullRequest
0 голосов
/ 20 марта 2020

Как получить кроссфейд равной мощности, работающий в AVVideoComposition? Я использую что-то вроде следующего для затухания между видео дорожками, но при повторении одного и того же видео снова и снова наблюдается очень заметное падение яркости во время перехода из-за того, какая кривая используется внутри setOpacityRamp.

let videoInstruction = AVMutableVideoCompositionInstruction()

let fromLayerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: fromCompositionTrack)
fromLayerInstruction.setOpacityRamp(fromStartOpacity: 1, toEndOpacity: 0, timeRange: timeRange)

let toLayerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: toCompositionTrack)
toLayerInstruction.setOpacityRamp(fromStartOpacity: 0, toEndOpacity: 1, timeRange: timeRange)

videoInstruction.timeRange = timeRange
videoInstruction.layerInstructions = [fromLayerInstruction, toLayerInstruction]

1 Ответ

0 голосов
/ 23 марта 2020

Это невозможно. Методы setOpacityRamp для AVMutableVideoCompositionLayerInstruction содержат следующее описание:

Во время линейного изменения непрозрачности непрозрачность вычисляется с использованием линейной интерполяции.

Однако есть более простое решение, которое я нашел в книге Learning AV Foundation: практическое руководство по освоению AV Foundation - затухание текущей видеодорожки, но не затухание в новый. Книга упоминает это как простое растворение , а не крестовое растворение .

let videoInstruction = AVMutableVideoCompositionInstruction()

let fromLayerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: fromCompositionTrack)
fromLayerInstruction.setOpacityRamp(fromStartOpacity: 1, toEndOpacity: 0, timeRange: timeRange)

let toLayerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: toCompositionTrack)
// toLayerInstruction.setOpacityRamp(fromStartOpacity: 0, toEndOpacity: 1, timeRange: timeRange)

videoInstruction.timeRange = timeRange
videoInstruction.layerInstructions = [fromLayerInstruction, toLayerInstruction]
...