Как правильно экспортировать CALayer поверх AVMutableComposition с помощью AVAssetExportSession - PullRequest
9 голосов
/ 19 июля 2011

Я знаю, что этот вопрос задавался ранее (например, здесь и здесь ), но я просто не могу понять, что я делаю неправильно.

У меня есть AVMutableComposition, который я использую для объединения некоторых видеоклипов с некоторыми CALayer с анимацией поверх них.

Все работает нормально, когда я беру свой AVMutableComposition и объединяю его с AVSynchronizedLayer для воспроизведения внутри AVPlayerLayer. Видео выходит правильно и все расположено там, где и должно.

Моя проблема в том, что когда я пытался экспортировать эту вещь, я пытался использовать AVVideoCompositionCoreAnimationTool вместо AVSynchronizedLayer (это то, что в документации сказано, что мы должны использовать для экспорта) и AVAssetExportSession, но что-то идет не так, потому что в моем экспортированном фильме каждый CALayer имеет свою систему координат в обратном порядке.

Таким образом, если во время воспроизведения точка 0,0 находится в верхнем левом углу экрана, когда я экспортирую фильм, точка 0,0 находится в нижнем левом угол отсюда моя анимация сходит с ума.

Я прочитал любую возможную статью об этом, и я также скачал образец AVVideoEdit от Apple, но я просто не вижу, что происходит ...

Ответы [ 2 ]

17 голосов
/ 19 октября 2011

Для тех, у кого такая же проблема, как у меня, я наконец-то нашел ответ. У каждого CALayer есть свойство, называемое geometryFlipped, которое необходимо установить на YES непосредственно перед экспортом, и все будет в порядке. Больше информации здесь .

0 голосов
/ 05 июля 2012
Methods that fixing frames and points
- (CGRect) fixRect:(CGRect)rect inRect:(CGRect)container
{
    CGRect frame = rect;
    frame.origin.y = container.size.height - frame.origin.y - frame.size.height;
    return frame;
}
- (CGPoint) fixPoint:(CGPoint)point fromPoint:(CGSize)containerSize
{
    CGPoint frame = point;
    frame.y = containerSize.height - frame.y;
    return frame;
}
...