2015-04-28 14 views
7

Sto tentando di creare una galleria video.Problema di prestazioni AVAssetImageGenerator

Per visualizzare video Sto usando uno UICollectionView. Ogni UICollectionViewCell ha uno sfondo con miniatura del video. Per generare una miniatura del video Sto usando un metodo con la logica:

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil]; 

AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 

generator.appliesPreferredTrackTransform = YES; 

CMTime time = CMTimeMakeWithSeconds(0,15); 

AVAssetImageGeneratorCompletionHandler handler = ^(CMTime timeRequested, CGImageRef image, CMTime timeActual, AVAssetImageGeneratorResult result, NSError *error) 
{ 
    NSLog(@"handler^()"); 

    if (result == AVAssetImageGeneratorSucceeded) 
    { 
     thumbnail = [UIImage imageWithCGImage: image]; 

     success(thumbnail); 
    } 

    else 
    { 
     failure(error); 
    } 
}; 

CGSize maximumSize = CGSizeMake(CLIPBOARD_COLLECTION_VIEW_CELL_WIDTH, CLIPBOARD_COLLECTION_VIEW_CELL_HEIGHT); 

generator.maximumSize = maximumSize; 

NSLog(@"generateCGImagesAsynchronouslyForTimes:"); 
[generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:time]] completionHandler:handler]; 

ho notato che generateCGImagesAsynchronouslyForTimes non funziona completamente in modo asincrono. C'è uno spazio di tempo tra questo metodo chiama. Ciò causa un grande ritardo mentre sto caricando le celle di visualizzazione tabella. Se commento linea [generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:time]] completionHandler:handler] allora non ci sono lag visibili (né immagini).

Come posso risolvere questo problema di prestazioni?

+0

Puoi specificare cosa esattamente ritarda? La prestazione di scorrimento subisce o ci vuole solo molto tempo tra la richiesta e quando viene chiamato il gestore? Puoi aggiungere i risultati dello strumento Time Profiler? – jszumski

+0

Ci sono intervalli di tempo tra le chiamate 'generateCGImagesAsynchronouslyForTimes' ... –

+0

@TomKortney Hai trovato una soluzione? di fronte allo stesso numero – Sam

risposta

3

Il blocco AVAssetImageGeneratorCompletionHandler non è garantito essere chiamato sul thread principale:

programmazione concorrente con AV Foundation

Callouts da AV Foundation-invocazioni di blocchi, osservatori valori-chiave, e i gestori delle notifiche non sono garantiti per essere eseguiti su un particolare thread o coda. Invece, AV Foundation richiama questi gestori su thread o code su cui svolge le proprie attività interne. Sei responsabile di verificare se il thread o la coda su cui è invocato un gestore è appropriato per le attività che desideri eseguire. Se non lo è (ad esempio, se si desidera aggiornare l'interfaccia utente e il callout non si trova sul thread principale), è necessario reindirizzare l'esecuzione delle attività su una coda o filo sicuro che si riconosce o che si crea per il scopo.

Vuol chiamare success e failure con dispatch_async risolto il problema?

dispatch_async(dispatch_get_main_queue(), ^{ 
    if (success) { 
     success(); 
    } 
)}; 
+1

non risolve questo problema di prestazioni. Ho ancora dei ritardi, anche con 'dispatch_asinc'. –

0

Ci sono due modi per reindirizzare la richiesta asincrona generazione di immagini ad un altro thread, uno dei quali è l'incapsulamento della funzione all'interno di un NSBlockOperation aggiunto un NSOperationQueue con la sua coda sottostante impostato a ciò che è più appropriato per la tua app.

La coda più appropriata dovrebbe essere relativamente facile da indovinare, se non si conosce, in quanto ci sono solo alcune scelte lì.

Problemi correlati