Post

Replies

Boosts

Views

Activity

Reply to Crash When Exporting Video with Text Overlay
Meet same issues, but on Simulator (Xcode 12.4 (12D4e)) only. After some research, I found this crash is lead by AVVideoCompositionCoreAnimationTool's +videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:inLayer: And I fixed it by replacing it w/ one below (but need to handle instruction.layerInstructions in this way): +videoCompositionCoreAnimationToolWithAdditionalLayer:asTrackID: Below is a sample Objective-C code works on both real device & simulator: ... // Prepare watermark layer CALayer *watermarkLayer = ...; CMPersistentTrackID watermarkLayerTrackID = [asset unusedTrackID]; // !!! NOTE#01: Use as additional layer here instead of animation layer. videoComposition.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithAdditionalLayer:watermarkLayer asTrackID:watermarkLayerTrackID]; // Create video composition instruction AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; instruction.timeRange = CMTimeRangeMake(kCMTimeZero, asset.duration); // - Watermark layer instruction // !!! NOTE#02: Make this instruction track watermark layer by the `trackID`. AVMutableVideoCompositionLayerInstruction *watermarkLayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstruction]; watermarkLayerInstruction.trackID = watermarkLayerTrackID; // - Video track layer instruction AVAssetTrack *videoTrack = [asset tracksWithMediaType:AVMediaTypeVideo].firstObject; AVMutableVideoCompositionLayerInstruction *videoLayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack]; // Watermark layer above video layer here. instruction.layerInstructions = @[ watermarkLayerInstruction, videoLayerInstruction, ]; videoComposition.instructions = @[instruction]; // Export the video w/ watermark. AVAssetExportSession *exportSession = ...; ... exportSession.videoComposition = videoComposition; ... And btw, if you just need to add an image as watermark, another solution by using AVVideoComposition's -videoCompositionWithAsset:applyingCIFiltersWithHandler: also works well on both real device & simulator, but I tested it and found it's slower. Seems this way is more suitable for video blender/filter.
Jun ’21