Проблемы с экспортом видео с настраиваемым анимированным свойством слоя - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь наложить анимированный GIF на видео.По разным причинам я решил сделать это, создав свойство анимации на слое, содержащем gif, называемый frameIndex.Когда frameIndex изменяется от одного значения к другому, изменяется кадр gif.Когда я добавляю свой анимированный слой GIF в AVSynchronizedLayer и синхронизирую его с AVPlayerItem, мой GIF отлично анимируется с воспроизведением видео.Все вроде хорошо.Однако проблема возникает, когда я пытаюсь экспортировать видео и анимированный GIF-файл вместе.Когда я экспортирую, кажется очень случайным, с какого кадра начинается анимация и сколько кадров будет отображаться в анимации, а также как долго.

Итак, вот соответствующий код.

Анимация создается следующим образом (за вычетом подробностей значений и значений клавиш):

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"frameIndex"];  
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
animation.calculationMode = kCAAnimationDiscrete;  
animation.removedOnCompletion = NO;  
animation.fillMode = kCAFillModeBoth;  
animation.beginTime = AVCoreAnimationBeginTimeAtZero;  
animation.repeatCount = INFINITY;  

Это слой, содержащий изображение.frameIndex - это свойство, которое я анимирую.

@interface AnimatedGifLayer : CALayer  
@property (nonatomic) NSUInteger frameIndex;  
@end  

@implementation AnimatedGifLayer  

+ (BOOL)needsDisplayForKey:(NSString *)key {  
    if( [key isEqualToString:@"frameIndex"] ) {  
        return YES;  
    }  
    return [super needsDisplayForKey:key];  
}  

- (void)display {  
    NSUInteger frameIndex = self.presentationLayer.frameIndex;  
    UIImage *img = [self.animatedImage imageCachedAtIndex:frameIndex];  
    if( img ) {  
        self.contents = (id)img.CGImage;  
    }  
}  

Во время воспроизведения я вижу, что «display» вызывается правильно с правильным «frameIndex» и все работает, как и ожидалось.

Для экспорта есть целая куча вещей для настройки композиции, а затем я добавляю анимацию следующим образом:

videoComposition.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer 
                                                  inLayer:parentLayer]; 

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

Во время процесса экспорта кажется довольно случайным, когда вызывается «display».Я предполагаю, что AVVideoCompositionCoreAnimationTool на самом деле не использует display для визуализации анимации кадров, но я не уверен, что он использует.Или что время совершенно другое, но я не уверен, как это может быть.

В качестве примечания, это работает, если я непосредственно анимирую свойство «содержимого», однако по разным причинам я бы предпочел получитьэта реализация работает.

Заранее спасибо всем, кто нашел время, чтобы прочитать все это и обдумать решение.

...