2011-02-08 3 views
5

У меня проблема с использованием AVURLAsset.AVURLAsset не может загрузить с удаленным файлом

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]; 
    ... 
    } 

В блоке завершения, то состояние AVKeyValueStatusFailed и сообщение об ошибке «Не удается открыть». Все exemples я видел, использовать локальный файл, так что, возможно, есть проблема с использованием удаленного файла ...

С уважением, Квентином

ответ

6

Вы не можете напрямую создать AVURLAsset для НТТРА Живого потока, как заявлено в Apple AV Foundation Programming Guide. Вы должны создать AVPlayerItem с потоком URL и экземпляр AVPlayer с ним

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

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

Шаг 1/регистрация для изменений status имущества пункта игрока

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

Шаг 2/в 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; 
     } 
    } 
} 

EDIT: исправлен Ответ на этот вопрос

+0

Спасибо, я попробовал это решение, но метод observer on currentItem не вызывается, потому что свойство уже задано, когда я добавляю наблюдение э. Поэтому я поместил метод наблюдателя на статус AVPlayerItem, и отсюда мне удалось получить AVPlayer currentItem. – Quentin

+0

@Quentin Вы правы, спасибо! Смешанный с другой частью моего кода ... Я отредактировал свой ответ, чтобы исправить это. – Jilouc

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