Je souhaite afficher une superposition sur une video et exporter cette video, y compris cet affichage. J'ai jeté un coup d'œil sur AVFoundation Framework, AVCompositions, AVAssets etc. mais je n'ai toujours pas d'idée pour y arriver. Il ya une class appelée AVSynchronizedLayer qui vous permet d'animer des choses synchrones à la video, mais je ne veux pas animer, je veux juste superposer l'affichage de l'heure dans chaque image de la video. Aucun conseil?
Cordialement
Quelque chose comme ça…
(NB: tiré d'un projet beaucoup plus important, j'ai peut-être inclus des morceaux inutiles par accident).
Vous devrez récupérer le CALayer de votre horloge / animation, et le définir sur var myClockLayer (utilisé 1/3 de la valeur par l'outil andimation).
Cela suppose également que votre video entrante ne comporte que deux pistes – audio et video. Si vous en avez plus, vous devrez définir l'identifiant de la piste dans "asTrackID: 2" plus attentivement.
AVURLAsset* url = [AVURLAsset URLAssetWithURL:incomingVideo options:nil]; AVMutableComposition *videoComposition = [AVMutableComposition composition]; AVMutableCompositionTrack *compositionVideoTrack = [videoComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; AVAssetTrack *clipVideoTrack = [[url tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [url duration]) ofTrack:clipVideoTrack atTime:kCMTimeZero error:&error]; AVMutableVideoComposition* videoComposition = [[AVMutableVideoComposition videoComposition]retain]; videoComposition.renderSize = CGSizeMake(320, 240); videoComposition.frameDuration = CMTimeMake(1, 30); videoComposition.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithAdditionalLayer:myClockLayer asTrackID:2]; AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(60, 30) ); AVMutableVideoCompositionLayerInstruction* layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:clipVideoTrack]; instruction.layerInstructions = [NSArray arrayWithObject:layerInstruction]; videoComposition.instructions = [NSArray arrayWithObject: instruction]; exporter = [[AVAssetExportSession alloc] initWithAsset:saveComposition presetName:AVAssetExportPresetHighestQuality] ; exporter.videoComposition = videoComposition; exporter.outputURL=url3; exporter.outputFileType=AVFileTypeQuickTimeMovie; [exporter exportAsynchronouslyWithCompletionHandler:^(void){}];
Je pense que vous pouvez utiliser AVCaptureVideoDataOutput pour traiter chaque image et utiliser AVAssetWriter pour save le cadre traité. Vous pouvez vous référer à cette réponse
utiliser appendPixelBuffer de AVAssetWriterPixelBufferAdaptor: withPresentationTime: méthode à exporter
Et je suggère fortement d'utiliser OpenCV pour traiter le cadre. c'est un joli tutoriel
La bibliothèque OpenCV est très bien.