CIFilters и AVVideoCompositionInstructions

#ios #objective-c #swift #avfoundation

#iOS #objective-c #swift #avfoundation

Вопрос:

В моем приложении я должен применять фильтры при воспроизведении. Я делаю это с помощью AVVideoComposition и применяю фильтр к каждому кадру.

Однако по некоторым причинам, когда я меняю видеокомпозицию моего элемента AVPlayer, видео вращается. Я попытался исправить эту проблему с помощью преобразования и добавить к нему инструкции по видеокомпозиции. Проблема с вращением исправлена, но фильтр больше не применяется.

Как я могу исправить вращение, пока все еще применен мой фильтр?

Код ниже:

 - (void)setVideoComposition:(AVMutableVideoComposition *)videoComposition {
_videoComposition = videoComposition;

AVMutableComposition *composition = [AVMutableComposition composition];
AVMutableCompositionTrack *videoCompositionTrack =
    [composition addMutableTrackWithMediaType:AVMediaTypeVideo
        preferredTrackID:kCMPersistentTrackID_Invalid];

AVAssetTrack *videoAssetTrack = [_avAsset tracksWithMediaType:AVMediaTypeVideo].lastObject;

CMTimeRange range = CMTimeRangeMake(kCMTimeZero, videoAssetTrack.timeRange.duration);

[videoCompositionTrack insertTimeRange:range
    ofTrack:videoAssetTrack
    atTime:kCMTimeZero
    error:nil];

AVMutableVideoCompositionInstruction *instruction =
    [AVMutableVideoCompositionInstruction videoCompositionInstruction];
instruction.timeRange = range;

AVMutableVideoCompositionLayerInstruction *layerInstruction =
    [AVMutableVideoCompositionLayerInstruction
        videoCompositionLayerInstructionWithAssetTrack:videoCompositionTrack];

[layerInstruction setTransform:videoAssetTrack.preferredTransform
    atTime:kCMTimeZero];



NSMutableArray *instructions = [[NSMutableArray alloc] init];
for (id instr in _videoComposition.instructions) {
    [instructions addObject:instr];
}

[instructions insertObject:instruction atIndex:0];

_videoComposition.instructions = instructions;

// Hook it to the item player.
if (self.playerItem) {
    self.playerItem.videoComposition = _videoComposition;
}
  

Комментарии:

1. Если вы поделитесь некоторым кодом, мы можем помочь

2. Я добавил код.

3. Одно замечание. Если я применяю фильтр как обычно, он вращается, как я сказал, но когда я закрываю и открываю приложение, я получаю правильный результат.

4. Куда вы добавляете другие фильтры _videoComposition.instructions ? Кажется, он уже пуст в вашем коде. И он содержит только instruction то, что вставлено в индекс 0.