2015-03-18 2 views
5

я нашел очень странную проблему,avplayeritem всегда в неизвестном состоянии

при загрузке mp3 файла из локального хранилища,

avplayeritem всегда неизвестный статус и не играли, если файл размещен в папке с документами ,

путь 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]; 

путь 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]; 

вывод:

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 

но код way2 работает хорошо, если mp3 файл был в приложении пачке даже статус еще сосать неизвестно,

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 

Я уверен, что файл в приложении пачке & документа такой же один, он может играть в любом другом программном обеспечении,

с помощью way2, только различался расслоение файл файл & документа был,

если mp3 файл, размещаемый в пачке, эта функция может возвращать Метаданные

NSArray *metadata = [playerItem.asset commonMetadata]; 

но возвращать ноль, используя URL документа

+0

Вы должны дождаться изменения статуса, соблюдая путь ключа состояния, используя KVO. – Rivera

ответ

1

Сначала нужно добавить наблюдателя к элементу игрока, чтобы проверить его состояние надлежащим образом:

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

Или добавить наблюдателя к объекту AVPlayer:

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

Затем добавить метод наблюдателя, как это:

- (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); 
    } 
} 

Если вы все еще не получить деталь игрок готов, пожалуйста, убедитесь, что звуковой файл действительно существует на пути директории документа, указанного в URL.

+1

В чем смысл добавления как игрока, так и игрока в качестве наблюдателей; не должен ли игрок быть достаточным? –

Смежные вопросы