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