Utiliser AVMutableComposition iPhone

J'utilise le code ci-dessous, pour diffuser les deux videos séquentiellement. Mais il ne montre aucune video dans le simulateur, c'est totalement vide.

Aussi, comment puis-je chercher à travers ces deux videos. Comme, si une video est de 2 minutes et la seconde est de 3 minutes. Maintenant, je dois get le time total de ces videos et chercher à travers eux. Lorsque je fais glisser la barre de défilement à 4 minutes, la seconde video doit être lue de la minute 2 à la suivante.

C'est possible?

- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSURL *url1 = [NSURL URLWithSsortingng:@"http://www.tools4movies.com/dvd_catalyst_profile_samples/Harold%20Kumar%203%20Christmas%20bionic.mp4"]; NSURL *url2 = [NSURL URLWithSsortingng:@"http://www.tools4movies.com/dvd_catalyst_profile_samples/Harold%20Kumar%203%20Christmas%20tablet.mp4"]; NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]; AVMutableComposition *composition = [[AVMutableComposition alloc] init]; asset1 = [[AVURLAsset alloc] initWithURL:url1 options:options]; AVURLAsset * asset2 = [[AVURLAsset alloc]initWithURL:url2 options:options]; CMTime insertionPoint = kCMTimeZero; NSError * error = nil; composition = [AVMutableComposition composition]; if (![composition insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset1.duration) ofAsset:asset1 atTime:insertionPoint error:&error]) { NSLog(@"error: %@",error); } insertionPoint = CMTimeAdd(insertionPoint, asset1.duration); if (![composition insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset2.duration) ofAsset:asset2 atTime:insertionPoint error:&error]) { NSLog(@"error: %@",error); } AVPlayerItem * item = [[AVPlayerItem alloc] initWithAsset:composition]; player = [AVPlayer playerWithPlayerItem:item]; AVPlayerLayer * layer = [AVPlayerLayer playerLayerWithPlayer:player]; [layer setFrame:CGRectMake(0, 0, 320, 480)]; [[[self view] layer] addSublayer:layer]; [player play]; } 

Quelqu'un peut-il me dire quelle est l'erreur dans mon code?

Le simulateur n'est pas capable d'afficher de la video. Nether le UIImagePickerController embedded, ni aucun controller video ne fonctionnera. Il n'est pas implémenté et apparaît principalement en noir ou en rouge sur le simulateur iOS. Vous devez déboguer sur la cible iOS. Parfois, le debugging ne fonctionnera pas correctement. Utilisez NSLog () istead. Cela fonctionnera toujours (si vous comstackz sans informations de debugging en utilisant le code 'release')

vous pouvez chercher en utilisant le lecteur:

si mp est votre lecteur multimédia:

 [mp pause]; CMTime position = mp.currentTime; // maybe replace something [mp replaceCurrentItemWithPlayerItem:[AVPlayerItem playerItemWithAsset:self.composition]]; [mp seekToTime:length]; [mp play]; 

résumé:
Modifier: utiliser la composition et l'élément de lecture
Chercher: utiliser le joueur

Voici un court exemple formel de comment faire cela (et déjà thread sécurisé):

 AVMutableComposition *_composition = [AVMutableComposition composition]; // iterate though all files // And build mutable composition for (int i = 0; i < filesCount; i++) { AVURLAsset* sourceAsset = nil; NSURL* movieURL = [NSURL fileURLWithPath:[paths objectAtIndex:i]]; sourceAsset = [AVURLAsset URLAssetWithURL:movieURL options:nil]; // calculate time CMTimeRange editRange = CMTimeRangeMake(CMTimeMake(0, 600), sourceAsset.duration); NSError *editError; BOOL result = [_composition insertTimeRange:editRange ofAsset:sourceAsset atTime:_composition.duration error:&editError]; dispatch_sync(dispatch_get_main_queue(), ^{ // maybe you need a progress bar self.loaderBar.progress = (float) i / filesCount; [self.loaderBar setNeedsDisplay]; }); } // make the composition threadsafe if you need it later self.composition = [[_composition copy] autorelease]; // Player wants mainthread? dispatch_sync(dispatch_get_main_queue(), ^{ mp = [AVPlayer playerWithPlayerItem:[[[AVPlayerItem alloc] initWithAsset:self.composition] autorelease]]; self.observer = [mp addPeriodicTimeObserverForInterval:CMTimeMake(60, 600) queue:nil usingBlock:^(CMTime time){ // this is our callback block to set the progressbar if (mp.status == AVPlayerStatusReadyToPlay) { float actualTime = time.value / time.timescale; // avoid division by zero if (time.value > 0.) { CMTime length = mp.currentItem.asset.duration; float lengthTime = length.value / length.timescale; if (lengthTime) { self.progressBar.value = actualTime / lengthTime; } else { self.progressBar.value = 0.0f; } }]; }); // the last task must be on mainthread again dispatch_sync(dispatch_get_main_queue(), ^{ // create our playerLayer self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:mp]; self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; self.playerLayer.frame = [self view].layer.bounds; // insert into our view (make it visible) [[self view].layer insertSublayer:self.playerLayer atIndex:0]; }); // and now do the playback, maybe mp is global (self.mp) // this depends on your needs [mp play]; }); 

J'espère que ça aide.