2017-10-27 2 views
0

Anwendung möchte ich Filter AVVideoComposition durch Funktion anwenden:Absturz beim Filter AVVideoComposition

init(asset: AVAsset, applyingCIFiltersWithHandler: (AVAsynchronousCIImageFilteringRequest) -> Void)

, in dem die assetAVComposition ist. Wenn ein AVPlayerItem diese Zusammensetzung mit dem videoComposition spielt, app stürzt mit Fehler:

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

Ich frage mich, wie der Absturz zu beheben.

PS: ich zwei videoTracks in der Zusammensetzung haben, hat jeder seine Anweisung Timerange

Antwort

0

Ich glaube, Sie versuchen AVVideoCompositionLayerInstruction zum AVVideoComposition hinzuzufügen.

den einfachen Ansatz Versuchen Sie zuerst und sehen, ob Sie Änderungen benötigen:

AVURLAsset *asset = [AVURLAsset assetWithURL:videoURL]; 
CIFilter *filter = [CIFilter filterWithName:@"CIHueAdjust"]; // the filter you want to add: https://developer.apple.com/library/content/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/ 
AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoCompositionWithAsset:asset applyingCIFiltersWithHandler:^(AVAsynchronousCIImageFilteringRequest * _Nonnull request) { 
    // set filter input image 
[filter setDefaults]; 
    [filter setValue:sourceImage forKey:kCIInputImageKey]; 

    // hue 
    NSNumber *angle = [NSNumber numberWithFloat:0.8]; 
    [filter setValue:angle forKey:kCIInputAngleKey]; 

    CIImage *outputImage = filter.outputImage; 
    [request finishWithImage:outputImage context:nil]; 
}]; 

AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPreset1920x1080]; 
exportSession.outputFileType = AVFileTypeQuickTimeMovie; 
exportSession.outputURL = outputURL; 
exportSession.videoComposition = videoComposition; 

// export the session async 
[exportSession exportAsynchronouslyWithCompletionHandler:^{ 
    switch (exportSession.status) { 
     case AVAssetExportSessionStatusCompleted: 
      NSLog(@"Yeah!"); 
      break; 

     default: 
      NSLog(@"Nooo!"); 
      break; 
    } 
}];