2011-02-08 39 views
5

Tengo un problema al usar AVURLAsset.AVURLAsset no se puede cargar con el archivo remoto

NSString * const kContentURL = @ 

"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"; 
... 

    NSURL *contentURL = [NSURL URLWithString:kContentURL]; 
    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:contentURL 
               options:nil]; 
    [asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:tracksKey] 
          completionHandler:^{ 
    ... 
           NSError *error = nil; 
           AVKeyValueStatus status = [asset statusOfValueForKey:tracksKey 
                       error:&error]; 
    ... 
    } 

En el bloque de finalización, el estado es AVKeyValueStatusFailed y el mensaje de error es "No se puede abrir". Todos exemples que he visto, utilizan un archivo local, así que tal vez hay un problema con un archivo remoto ...

Saludos, Quentin

Respuesta

6

No se puede crear directamente una AVURLAsset para una secuencia en vivo como HTTP declarado en el AV Foundation Programming Guide de Apple. Vas a tener que crear una AVPlayerItem con la url corriente y una instancia de un AVPlayer con él

AVPlayerItem *pItem = [AVPlayerItem playerItemWithURL:theStreamURL]; 
AVPlayer *player = [AVPlayer playerWithPlayerItem:pItem]; 

Si necesita tener acceso a la AVURLAsset detrás que se podía seguir estos pasos.

Paso 1/registro de los cambios de la propiedad status del artículo del jugador

[playerItem addObserver:self forKeyPath:@"status" options:0 context:nil]; 

Paso 2/en observeValueForKeyPath:ofObject:change:context:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
         change:(NSDictionary *)change context:(void *)context { 
    if ([keyPath isEqualToString:@"status"]) { 
     AVPlayerItem *pItem = (AVPlayerItem *)object; 
     if (pItem.status == AVPlayerItemStatusReadyToPlay) { 
      // Here you can access to the player item's asset 
      // e.g.: self.asset = (AVURLAsset *)pItem.asset; 
     } 
    } 
} 

EDITAR: corrigen la respuesta

+0

Gracias, intenté esta solución, pero el método del observador en el valor de CurrentItem no se llama porque la propiedad ya está configurada cuando agrego el observ er. Así que coloqué un método de observación sobre el estado de AVPlayerItem, y desde aquí pude obtener AVPlayer currentItem. – Quentin

+0

@Quentin ¡Tienes razón, gracias! Mezclado con otra parte de mi código ... He editado mi respuesta para corregir eso. – Jilouc

Cuestiones relacionadas