2010-11-04 11 views
39

Sto provando a caricare un file video nell'app per iPad come AVURLAsset, utilizzando il caricamento in asincrono per attendere che sia pronto. Il problema è, quando lo eseguo, ottengo un messaggio di errore "errore" completamente generico che non ho idea di cosa fare. Il video funziona se lo consegno su un MPMoviePlayerController, ma AVURLAsset sembra rifiutarsi di avere qualcosa a che fare con esso.AVURLAsset si rifiuta di caricare il video

Codice:

asset = [[AVURLAsset alloc] initWithURL:[NSURL URLWithString:[docPath stringByAppendingPathComponent:@"video.mov"]] options:nil]; 
[asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler:^{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self composeIfReady]; 
    }); 
}]; 

...

- (void)composeIfReady 
{ 
    NSError *error = nil; 
    if([asset statusOfValueForKey:@"tracks" error:&error] == AVKeyValueStatusFailed) 
     NSLog(@"error loading: %@", [error description]); 
    if(error == nil) 
     NSLog(@"okay awesome"); 
} 

L'output:

error loading: Error Domain=AVFoundationErrorDomain Code=-11800 "The operation couldn’t be completed. (AVFoundationErrorDomain error -11800.)" UserInfo=0x1696f0 {NSUnderlyingError=0x169a40 "The operation couldn’t be completed. (OSStatus error -12936.)"} 

-11800, tra l'altro, è il codice di errore per "errore sconosciuto". Una specie di vicolo cieco. Qualche idea? C'è qualcosa che dovrei installare prima di provare a caricare la risorsa?

risposta

110

Risolto. Il trucco: utilizzare fileURLWithPath:, non URLWithString:. Apparentemente la differenza è davvero, davvero significativa.

+27

Sto usando fileURLWithPath e continuo a ottenere gli stessi errori. – gngrwzrd

+0

+1 Questo funziona per me..Grazie molto .. –

+1

Grazie mille verryy !!! Ora mi rendo conto che la differenza è significativa perché ha bisogno di un URL assoluto per il file e quindi l'URL relativo (/ var/mobile/...) fornito da URLWithString non funziona. –

6

Se qualcuno ha ancora problemi con questo anche dopo aver utilizzato fileURLWithPath, provare a richiedere NSTimeIntervals nell'array temporale se si utilizza int (s).

Questo non funziona:

NSMutableArray *playbackTimes = [NSMutableArray array]; 
    for (int i = 0; i <= 10; i ++) { 
     [playbackTimes addObject:@(i)]; 
    } 

    [self.videoPlayer requestThumbnailImagesAtTimes:playbackTimes timeOption:MPMovieTimeOptionNearestKeyFrame]; 

Questo funziona:

NSMutableArray *playbackTimes = [NSMutableArray array]; 
    for (int i = 0; i <= 10; i ++) { 
     [playbackTimes addObject:@((NSTimeInterval)i)]; 
    } 

    [self.videoPlayer requestThumbnailImagesAtTimes:playbackTimes timeOption:MPMovieTimeOptionNearestKeyFrame]; 
+0

Questo era il mio problema. Edwin –

+0

Puoi fare una versione veloce di questo? Per favore, – rottenoats

5

Se si utilizza -[NSURL fileURLWithPath:] per creare l'URL e ancora ottenere lo stesso errore.

Controllare AVURLAssetReferenceRestrictionsKey, Il m3u8 locale potrebbe non essere riprodotto se contiene una risorsa remota.

Impostare il valore su @(AVAssetReferenceRestrictionForbidNone) dovrebbe risolvere il problema.

+1

Dove lo imposta? – CodyMace

+0

@CodyMace È un tasto di opzione per 'AVURLAsset', vedi' - [AVURLAsset URLAssetWithURL: options:] ' – naituw

Problemi correlati