avplayeritem siempre en estado desconocido

Acabo de encontrar un problema muy extraño,

Al cargar un file mp3 desde el almacenamiento local,

avplayeritem siempre está en estado desconocido y no se puede reproducir si el file está en la carpeta del documento.

path 1:

//AVAsset *asset = [[AVURLAsset alloc] initWithURL:_URL options:nil]; //AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithAsset:asset]; AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithURL:_URL]; //line 1 while (playerItem.status!=AVPlayerItemStatusReadyToPlay && playerItem.status!=AVPlayerItemStatusFailed) { NSLog(@"avplayer: %@ status: %d", playerItem, playerItem.status); [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; } //line 2 NSLog(@"avplayer status: %d item: %@", playerItem.status, _URL); NSArray *metadata = [playerItem.asset commonMetadata]; 

path 2:

 AVAsset *asset = [[AVURLAsset alloc] initWithURL:_URL options:nil]; AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithAsset:asset]; /* AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithURL:_URL]; //line 1 while (playerItem.status!=AVPlayerItemStatusReadyToPlay && playerItem.status!=AVPlayerItemStatusFailed) { NSLog(@"avplayer: %@ status: %d", playerItem, playerItem.status); [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; } //line 2 */ NSLog(@"avplayer status: %d item: %@", playerItem.status, _URL); NSArray *metadata = [playerItem.asset commonMetadata]; 

el ouput:

 2015-03-19 00:42:49.243 goodnightfm[6737:353911] avplayer: <AVPlayerItem: 0x7fdc3bbd5c00, asset = <AVURLAsset: 0x7fdc3bbd8a50, URL = file:///Users/galenzhao/Library/Developer/CoreSimulator/Devices/123A77A7-DC61-4795-8D9A-E71002E261DA/data/Containers/Data/Application/4CCEED79-1D5A-4D00-BC5E-FC52BD5393F9/Documents/CMStorage/70efdf2ec9b086079795c442636b55fb>> status: 0 

pero el código way2 funciona bien si el file mp3 estaba en el package de aplicaciones, incluso el estado aún aspira desconocido,

 2015-03-19 00:45:35.977 goodnightfm[6783:355678] avplayer status: 0 item: file:///Users/galenzhao/Library/Developer/CoreSimulator/Devices/123A77A7-DC61-4795-8D9A-E71002E261DA/data/Containers/Bundle/Application/F2446C29-49F3-4B92-A7B0-7EFCC1A19274/goodnightfm.app/demo5.mp3 

Estoy seguro de que el file en el package de la aplicación y el documento son iguales, se puede reproducir en cualquier otro software,

Al usar way2, el único diferente entre el file del package y el file del documento fue,

si el file mp3 se coloca en package, esta function puede devolver metadatos

 NSArray *metadata = [playerItem.asset commonMetadata]; 

pero devuelve nil utilizando la URL del documento

Primero debe agregar un observador al elemento del jugador para verificar su estado de manera apropiada:

 [playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:nil]; 

O agregue un observador a un object AVPlayer:

 [player addObserver:self forKeyPath:@"currentItem.status" options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:nil]; 

Luego agregue un método de observador como este:

 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([object isKindOfClass:[AVPlayerItem class]] && [keyPath isEqualToString:@"status"]) { AVPlayerItem *playerItem = (AVPlayerItem *)object; NSLog(@"avplayer: %@ status: %d", playerItem, playerItem.status); } else if ([object isKindOfClass:[AVPlayer class]] && [keyPath isEqualToString:@"currentItem.status"]) { AVPlayer *player = (AVPlayer *)object; NSLog(@"avplayer: %@ status: %d", player.currentItem, player.currentItem.status); } } 

Si todavía no tiene listo el elemento del reproductor, asegúrese de que el file de audio realmente exista en la ruta del directory de documentos especificado por la URL.