有没有一种方法可以从已经用URL初始化的AVPlayer对象中访问该URL,例如:
NSURL *url = [NSURL URLWithString: @"http://www.example.org/audio"];
self.player = [AVPlayer playerWithURL: url];
AVPlayer
播放一个 AVPlayerItem
。 AVPlayerItem
由类 AVAsset
的对象支持。当使用 AVPlayer
的 playerWithURL:
方法时,它会自动创建一个由名为 AVURLAsset
的 AVAsset
子类支持的资源所支持的 AVPlayerItem
。 AVURLAsset
具有一个 URL
属性。
因此,在您提供的情况下,您可以相当轻松地获取当前播放物品的 NSURL
。以下是一个示例函数,说明如何执行此操作:
-(NSURL *)urlOfCurrentlyPlayingInPlayer:(AVPlayer *)player{
// get current asset
AVAsset *currentPlayerAsset = player.currentItem.asset;
// make sure the current asset is an AVURLAsset
if (![currentPlayerAsset isKindOfClass:AVURLAsset.class]) return nil;
// return the NSURL
return [(AVURLAsset *)currentPlayerAsset URL];
}
我不是Swift专家,但似乎可以用Swift更简洁地完成。
func urlOfCurrentlyPlayingInPlayer(player : AVPlayer) -> URL? {
return ((player.currentItem?.asset) as? AVURLAsset)?.url
}
player.currentItem
是否不为nil
。 - jocullnil
,以避免向 nil
发送消息浪费时间。但 Objective-C 的美妙之处在于这段代码是完全安全的。在 Objective-C 中,向 nil
发送消息不会崩溃,而只是返回一个“nil”或“0”或“NO”(取决于返回类型,它们都是相同的)。因此,唯一需要检查的是我包含的 if 语句,以确保资产是 URL 资产,因为如果不是,则不会响应 -URL
选择器,并且会崩溃。 - NJonesplayer.currentItem
为空,则尝试使用 player.currentItem.asset
将导致崩溃。这是唯一需要特别注意的事情。 - joculllet url: URL? = (player?.currentItem?.asset as? AVURLAsset)?.url
Swift 3的解决方案
func getVideoUrl() -> URL? {
let asset = self.player?.currentItem?.asset
if asset == nil {
return nil
}
if let urlAsset = asset as? AVURLAsset {
return urlAsset.url
}
return nil
}
基于@eonist的回答,扩展AVPlayerItem。
extension AVPlayerItem { var url: URL? { return (asset as? AVURLAsset)?.url } }
AVPlayer
的文档似乎没有提供获取URL的方法。您可以尝试使用各种排列组合的@"URL"
来调用valueForKey:
,但我怀疑它会被公开。 - coneybeare