2012-12-26 3 views
37

C'è un modo per accedere all'URL da un oggetto AVPlayer che è stata inizializzata con un URL, come in:Accesso all'URL dall'oggetto AVPlayer?

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

I AVPlayer' [doc] '(https://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVPlayer_Class/Reference/ Reference.html) non sembra dare un modo per afferrare l'URL. Puoi provare a vedere se risponde a 'valueForKey:' con varie permutazioni di '@" URL "', ma dubito che sarà esposto. – coneybeare

risposta

68

Un AVPlayer svolge un AVPlayerItem. AVPlayerItem s sono supportati da oggetti della classe AVAsset. Quando si utilizza il metodo playerWithURL: di AVPlayer, viene creato automaticamente il AVPlayerItem supportato da una risorsa che è una sottoclasse di AVAsset denominata AVURLAsset. AVURLAsset ha una proprietà URL.

Quindi, sì, nel caso in cui si è fornito è possibile ottenere il NSURL della voce attualmente in riproduzione abbastanza facilmente. Ecco una funzione di esempio di come fare questo:

-(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]; 
} 

Non una rapida esperto, ma sembra che può essere fatto in rapida più brevemente.

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

Potrebbe voler controllare che 'player.currentItem' non sia' nil' anche nel caso di un init vuoto – jocull

+1

@jocull È certamente possibile controllare 'nil' in modo da non perdere tempo a inviare messaggi a' nil'. Ma la bellezza dell'obiettivo-c è che questo codice è completamente sicuro. In ogg-c l'invio di un messaggio a 'nil' non si interrompe e restituisce semplicemente un 'nil' o' 0' o 'NO' (a seconda del tipo di reso, sono comunque uguali). Quindi l'unico controllo richiesto è la dichiarazione if che ho incluso per assicurarmi che l'asset sia un asset-url perché se non lo fosse, non risponderebbe al selettore '-URL', e andrebbe in crash. – NJones

+0

Ho dimenticato cosa stava succedendo quando ho scritto questo, ma se 'player.currentItem' è nulla, allora provando ad usare' player.currentItem.asset' si bloccherà. Questa è l'unica cosa a cui prestare attenzione. – jocull

5

Soluzione 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 
}