iOS AVFoundation – Afficher un affichage de l'heure sur une video et exporter

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

https://stackoverflow.com/a/4944594/379941 .

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

http://aptogo.co.uk/2011/09/opencv-framework-for-ios/ .

La bibliothèque OpenCV est très bien.