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,错误消息是“无法打开”。 我见过的所有例子,使用本地文件,所以也许有使用远程文件的问题…

问候,昆汀

您不能直接创build一个HTTP Livestream的AVURLAsset ,如Apple的AV Foundation编程指南所述 。 你必须创build一个带有streamurl的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 // eg: self.asset = (AVURLAsset *)pItem.asset; } } } 

编辑 :纠正了答案