Iphone AVURLAsset无法与远程文件一起加载

Iphone AVURLAsset无法与远程文件一起加载,iphone,ios,avfoundation,Iphone,Ios,Avfoundation,我在使用AVURLAsset时遇到问题 NSString * const kContentURL = @ "http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"; ... NSURL *contentURL = [NSURL URLWithString:kContentURL]; AVURLAsset *asset = [AVURLAsset URLAssetWithURL:contentURL

我在使用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,错误消息为“无法打开”。我看到的所有示例都使用本地文件,所以使用远程文件可能会有问题

问候,,
昆汀

你不能像苹果公司的声明那样直接为HTTP直播流创建一个
avurlaste
。 您必须使用流url创建一个
AVPlayerItem
,并用它实例化一个AVPlayer

AVPlayerItem *pItem = [AVPlayerItem playerItemWithURL:theStreamURL];
AVPlayer *player = [AVPlayer playerWithPlayerItem:pItem];
如果您需要访问后面的
avurlaste
,可以按照以下步骤操作

步骤1/注册玩家物品的
状态
属性的更改

[playerItem addObserver:self forKeyPath:@"status" options:0 context:nil];
步骤2/在
observeValueForKeyPath:of对象:更改:上下文:

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

编辑:更正了答案

谢谢,我尝试了此解决方案,但没有调用currentItem值上的observer方法,因为在添加observer时已设置了属性。所以我在AVPlayerItem的状态上放置了一个观察者方法,从这里我可以得到AvPlayerCurrentItem。@Quentin你说得对,谢谢!与我的代码的另一部分混在一起。。。我编辑了我的答案来纠正这个问题。