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는, 당신은 직접 HTTP 라이브 스트림 등을위한 AVURLAsset을 만들 수 없습니다 ... 그래서 아마 원격 파일을 사용하여 문제가,

감사합니다, 쿠엔틴

답변

6

을 로컬 파일을 사용하여 애플의 AV Foundation Programming Guide에 언급되어있다. 당신은 당신이 다음 단계를 수행 할 수 그 뒤에 AVURLAsset에 액세스해야하는 경우 당신은

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

와 함께 AVPlayer를을 스트림 URL과 AVPlayerItem를 만들고 인스턴스화해야합니다.

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

편집으로는 : 대답을

+0

감사를 수정, I 이 솔루션을 사용해 보았지만 observ를 추가 할 때 property가 이미 설정되어 있기 때문에 currentItem 값에 대한 observer 메소드가 호출되지 않았습니다. 어. 그래서 저는 AVPlayerItem의 상태에 옵저버 (Observer) 메서드를 두었습니다. 여기에서 AVPlayer currentItem을 얻을 수있었습니다. – Quentin

+0

@Quentin 네가 맞아, 고마워! 내 코드의 다른 부분과 혼합 된 ... 나는 그것을 해결하기 위해 내 대답을 편집했습니다. – Jilouc

관련 문제