2012-12-26 44 views
37

有没有办法从已初始化为URL的AVPlayer对象,请访问网址为:从AVPlayer对象访问URL?

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

的'AVPlayer' [文档](https://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVPlayer_Class/Reference/ Reference.html)似乎没有提供抓取URL的方法。你可以尝试看看它是否对'@“URL”'进行了各种排列的'valueForKey:'响应,但我怀疑它会被公开。 – coneybeare

回答

68

一个AVPlayer起着AVPlayerItemAVPlayerItem s支持类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]; 
} 

不是一个迅速的专家,但它似乎可以做得更快捷。

func urlOfCurrentlyPlayingInPlayer(player : AVPlayer) -> URL? { 
    return ((player.currentItem?.asset) as? AVURLAsset)?.url 
} 
+0

可能要检查的是'player.currentItem'不是'nil'也是空的init – jocull

+1

@jocull您当然可以检查'nil'以便不浪费时间将消息发送到'nil'的情况。但是objective-c的美妙之处在于这段代码是完全安全的。在objective-c发送消息给'nil'不会崩溃,只是返回一个'nil'或'0'或'NO'(取决于返回类型,它们都是一样的)。因此,唯一需要检查的是我包含的if语句,以确保资产是一个url资产,因为如果它不是,那么它不会响应'-URL'选择器,并且会崩溃。 – NJones

+0

我忘记了当我写这个时发生了什么,但是如果'player.currentItem'为零,那么尝试使用'player.currentItem.asset'会崩溃。这是唯一需要注意的事情。 – jocull

5

解夫特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 
}