从AVPlayer对象访问URL?

Cla*_*ijo 43 ios avplayer

有没有办法从已使用URL初始化的AVPlayer对象访问URL,如下所示:

NSURL *url = [NSURL URLWithString: @"http://www.example.org/audio"];
self.player = [AVPlayer playerWithURL: url];
Run Code Online (Sandbox Code Playgroud)

NJo*_*nes 80

一个人AVPlayerAVPlayerItem.AVPlayerItems由类的对象支持AVAsset.当您使用它的playerWithURL:方法时,AVPlayer它会自动创建AVPlayerItem由作为AVAssetnamed 的子类的资产支持AVURLAsset.AVURLAssetURL房产.

所以,是的,在你提供的情况下,你可以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];
}
Run Code Online (Sandbox Code Playgroud)

不是一个快速的专家,但它似乎可以更迅速地完成.

func urlOfCurrentlyPlayingInPlayer(player : AVPlayer) -> URL? {
    return ((player.currentItem?.asset) as? AVURLAsset)?.url
}
Run Code Online (Sandbox Code Playgroud)

  • @jocull您当然可以检查“nil”,以免浪费时间向“nil”发送消息。但 Objective-C 的优点在于这段代码是完全安全的。在 Objective-C 中,向“nil”发送消息不会崩溃,只会返回“nil”或“0”或“NO”(取决于返回类型,无论如何它们都是相同的)。因此,唯一需要检查的是我包含的 if 语句,以确保资产是 url 资产,因为如果不是,那么它不会响应“-URL”选择器,并且会崩溃。 (2认同)

Eri*_*ner 9

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
}
Run Code Online (Sandbox Code Playgroud)


eon*_*ist 6

Oneliner迅捷4.1

let url: URL? = (player?.currentItem?.asset as? AVURLAsset)?.url
Run Code Online (Sandbox Code Playgroud)


Вла*_*ток 6

AVPlayerItem 扩展基于@eonist答案。

扩展 AVPlayerItem {
    var url: 网址?{
        返回(资产为?AVURLAsset)?.url
    }
}