从AVPlayer对象访问URL?

56

有没有一种方法可以从已经用URL初始化的AVPlayer对象中访问该URL,例如:

NSURL *url = [NSURL URLWithString: @"http://www.example.org/audio"];
self.player = [AVPlayer playerWithURL: url];

AVPlayer文档似乎没有提供获取URL的方法。您可以尝试使用各种排列组合的@"URL"来调用valueForKey:,但我怀疑它会被公开。 - coneybeare
4个回答

102

AVPlayer 播放一个 AVPlayerItemAVPlayerItem 由类 AVAsset 的对象支持。当使用 AVPlayerplayerWithURL: 方法时,它会自动创建一个由名为 AVURLAssetAVAsset 子类支持的资源所支持的 AVPlayerItemAVURLAsset 具有一个 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 - jocull
2
@jocull 当然可以检查 nil,以避免向 nil 发送消息浪费时间。但 Objective-C 的美妙之处在于这段代码是完全安全的。在 Objective-C 中,向 nil 发送消息不会崩溃,而只是返回一个“nil”或“0”或“NO”(取决于返回类型,它们都是相同的)。因此,唯一需要检查的是我包含的 if 语句,以确保资产是 URL 资产,因为如果不是,则不会响应 -URL 选择器,并且会崩溃。 - NJones
我忘记写这段代码时正在发生什么,但是如果 player.currentItem 为空,则尝试使用 player.currentItem.asset 将导致崩溃。这是唯一需要特别注意的事情。 - jocull

17

一行代码的 Swift 4.1

let url: URL? = (player?.currentItem?.asset as? AVURLAsset)?.url

13

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
}

5

基于@eonist的回答,扩展AVPlayerItem。

extension AVPlayerItem {
    var url: URL? {
        return (asset as? AVURLAsset)?.url
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接