2010-07-21 9 views
5

Il nuovo elenco di funzionalità di IOS 4.0 indica che il framework AV Foundation ha la gestione dei supporti, la gestione delle tracce, la modifica dei supporti e la gestione dei metadati per gli elementi multimediali. Che cosa intendono con ciò?AVAsset e AVAssetTrack - Gestione traccia in IOS 4.0

  1. Utilizzo della gestione tracce e gestione risorse multimediali è possibile accedere ai file multimediali dall'app foto?
  2. Posso creare composizioni personalizzate utilizzando AVComposition ed esportarlo e inviarlo a un server?
  3. Posso rinominare, spostare, modificare le informazioni sui metadati di una risorsa?

Ho cercato di avere un aiuto/documentazione su questo e non poteva trovare qualsiasi cosa ..

Grazie,

Tony

risposta

14

Sì, si può fare la maggior parte delle cose che menzionato. Penso che non sia così semplice accedere ai file multimediali del telefono. Ma puoi leggere i dati dalla rete ed esportarli sul tuo rullino fotografico, se lo desideri.

Per prima cosa devi importare i tuoi video o file audio.

Quello che serve per iniziare è il proprio videoplayer che si crea nella propria vista. Se non ti piace riprodurre i tuoi video ma semplicemente comporre i tuoi contenuti, puoi semplicemente andare senza vista.

Questo è molto facile: 1. Creare una composizione mutevole:

AVMutableComposition *composition = [AVMutableComposition composition]; 

Questo terrà i tuoi video. Ora hai un Asset di composizione vuoto. Aggiungere alcuni file dalla directory o dal Web:

NSURL* sourceMovieURL = [NSURL fileURLWithPath:moviePath]; 
AVURLAsset* sourceAsset = [AVURLAsset URLAssetWithURL:sourceMovieURL options:nil]; 

Quindi aggiungere il video alla composizione

// calculate time 
CMTimeRange editRange = CMTimeRangeMake(CMTimeMake(0, 600), CMTimeMake(sourceAsset.duration.value, sourceAsset.duration.timescale)); 

// and add into your composition 
BOOL result = [composition insertTimeRange:editRange ofAsset:sourceAsset atTime:composition.duration error:&editError]; 

Se si desidera aggiungere altri video nella vostra composizione, è possibile aggiungere un altro Assets e impostalo nuovamente nella composizione utilizzando il tuo intervallo di tempo. Ora è possibile esportare la nuova composizione utilizzando il codice in questo modo:

NSError *exportError = nil; 

AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetHighestQuality]; 

NSURL *exportURL = [NSURL fileURLWithPath:exportVideoPath]; 
exportSession.outputURL = exportURL; 
exportSession.outputFileType = @"com.apple.quicktime-movie"; 
[exportSession exportAsynchronouslyWithCompletionHandler:^{ 
    switch (exportSession.status) { 
     case AVAssetExportSessionStatusFailed:{ 
      NSLog (@"FAIL"); 
      [self performSelectorOnMainThread:@selector (doPostExportFailed:) 
             withObject:nil 
                waitUntilDone:NO]; 
      break; 
     } 
     case AVAssetExportSessionStatusCompleted: { 
      NSLog (@"SUCCESS"); 
      [self performSelectorOnMainThread:@selector (doPostExportSuccess:) 
         withObject:nil 
         waitUntilDone:NO]; 
      break; 
     } 
    }; 
}]; 

Se si desidera riprodurre i tuoi video, utilizzare il codice come questo (presumo, si ha accesso alla visualizzazione):

// create an AVPlayer with your composition 
AVPlayer* mp = [AVPlayer playerWithPlayerItem:[AVPlayerItem playerItemWithAsset:composition]]; 

// Add the player to your UserInterface 
// Create a PlayerLayer: 
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:mp]; 

// integrate it to your view. Here you can customize your player (Fullscreen, or a small preview) 
[[self view].layer insertSublayer:playerLayer atIndex:0]; 
playerLayer.frame = [self view].layer.bounds; 
playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 

E infine riprodurre il video:

[mp play]; 

Esporta in rullino fotografico:

NSString* exportVideoPath = >>your local path to your exported file<< 
UISaveVideoAtPathToSavedPhotosAlbum (exportVideoPath, self, @selector(video:didFinishSavingWithError: contextInfo:), nil); 

E ottenere la notifica, se è finito (il vostro metodo di callback)

- (void) video: (NSString *) videoPath didFinishSavingWithError: (NSError *) error contextInfo: (void *) contextInfo { 
    // Error is nil, if succeeded 
    NSLog(@"Finished saving video with error: %@", error); 
    // do postprocessing here, i.e. notifications or UI stuff 

}

Purtroppo non ho trovato alcuna soluzione "legale" per leggere dal CameraRoll.

una fonte molto buona su come iniziare è:

http://www.subfurther.com/blog/?cat=51

scaricare VTM_Player.zip, VTM_AVRecPlay.zip o VTM_AVEditor.zip per un tempo molto bella introduzione in questo

+0

Grazie! Buona risposta! – SAKrisT

+0

Ciao, il tuo codice non mostra il video ... quale può essere il problema? –

+0

@iError: Hmm, non è facile rispondere perché ci sono molti ostacoli sulla strada. Ho scoperto che a volte la rotazione del lettore di film viene ruotata, il che significa che può essere lì, ma al di fuori della cornice visibile. Se stai sviluppando usando arco assicurati di avere un riferimento forte o un riferimento di proprietà al tuo lettore di film. ARC potrebbe rilasciare l'oggetto giocatore immediatamente dopo aver lasciato il metodo in cui è stato creato. Controlla se hai attivato la funzione di autorotazione. Forse hai bisogno di usare la proprietà "layer.transform" per impostare la rotazione. – JackPearse

Problemi correlati