AVURLAsset无法加载远程文件

时间:2011-02-08 15:22:42

标签: 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
                                               options:nil];
    [asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:tracksKey]
                            completionHandler:^{
    ...
                               NSError *error = nil;
                               AVKeyValueStatus status = [asset statusOfValueForKey:tracksKey
                                                                              error:&error];
    ...
    }

在完成块中,状态为AVKeyValueStatusFailed,错误消息为“无法打开”。我见过的所有例子都使用本地文件,所以使用远程文件可能有问题......

此致 昆汀

1 个答案:

答案 0 :(得分:6)

您无法直接为Apple Live AV Foundation Programming Guide中所述的HTTP Live流创建AVURLAsset。 您必须使用流网址创建AVPlayerItem并使用它实例化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;
        }
    }   
}

编辑:更正了答案