2012-12-26 78 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 
}