2011-02-08 93 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

您不能直接創建一個HTTP實時流作爲AVURLAsset在蘋果的AV Foundation Programming Guide中陳述。 你必須與它

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

創建流URL的AVPlayerItem和實例化一個AVPlayer如果需要訪問背後的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

謝謝,我試過這個解決方案,但是對currentItem值的觀察者方法沒有被調用,因爲當我添加observ時,屬性已經被設置呃。所以我在AVPlayerItem的狀態上放置了一個觀察器方法,從這裏我可以獲得AVPlayer的currentItem。 – Quentin 2011-02-08 17:11:23