AVVideoКомпозиция с падением CIFilters - PullRequest
0 голосов
/ 12 октября 2018

Я создаю AVVideoComposition с CIF-фильтрами следующим образом:

 videoComposition = AVMutableVideoComposition(asset: asset, applyingCIFiltersWithHandler: {[weak self] request in  

            // Clamp to avoid blurring transparent pixels at the image edges  
            let source = request.sourceImage.clampedToExtent()  
            let output:CIImage  

            if let filteredOutput = self?.runFilters(source, filters: filters)?.cropped(to: request.sourceImage.extent) {  
                output = filteredOutput  
            } else {  
                output = source  
            }  

            // Provide the filter output to the composition  
            request.finish(with: output, context: nil)  
        })  

И затем, чтобы правильно обработать вращение, я создаю команду прохода, которая устанавливает преобразование идентичности на промежуточном слое.

     let passThroughInstruction = AVMutableVideoCompositionInstruction()  
     passThroughInstruction.timeRange = CMTimeRangeMake(start: CMTime.zero, duration: asset.duration)  
     let passThroughLayer = AVMutableVideoCompositionLayerInstruction(assetTrack: videoTrack)  
            passThroughLayer.setTransform(CGAffineTransform.identity, at: CMTime.zero)   
     passThroughInstruction.layerInstructions = [passThroughLayer]  
            videoComposition.instructions = [passThroughInstruction]  

Проблема в том, что он вылетает с ошибкой:

'*** -[AVCoreImageFilterCustomVideoCompositor startVideoCompositionRequest:] Expecting video composition to contain only AVCoreImageFilterVideoCompositionInstruction'  

Моя проблема заключается в том, что, если я не укажу эту команду passThroughInstruction, вывод будет неправильным, если видеотрек входного актива содержит предпочитаемый преобразователь, который задает поворот на 90 градусов.Как использовать композицию видео с фильтрами Core Image, которые правильно обрабатывают предпочитаемый преобразователь видеодорожки?

РЕДАКТИРОВАТЬ: вопрос выглядит аналогично, но отличается от других вопросов, связанных с воспроизведением.В моем случае воспроизведение в порядке, но именно рендеринг создает искаженное видео.

1 Ответ

0 голосов
/ 13 октября 2018

Хорошо, я нашел реальную проблему.Проблема заключается в применении videoComposition, возвращаемого функцией AVMutableVideoComposition (asset :, applyCIFiltersWithHandler :), неявно создает инструкцию композиции, которая физически поворачивает CIImages в случае, если преобразование вращения применено с помощью предпочитаемым преобразованием на видеодорожке.Должно ли это делать это или нет, является дискуссионным, так как предпочитаемый преобразование применяется на уровне игрока.В качестве обходного пути, в дополнение к тому, что предлагается в , этот ответ.Мне пришлось настроить ширину и высоту, передаваемые через AVVideoWidthKey, AVVideoHeightKey в videoSettings, который передается в AVAssetReader / Writer.

...