2012-12-26 13 views
37

Czy istnieje sposób, aby uzyskać dostęp do adresu URL z obiektu AVPlayer który został zainicjowany z adresem URL, na przykład:Uzyskiwanie dostępu do adresu URL z obiektu AVPlayer?

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

The 'AVPlayer' [Dokumenty] (https://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVPlayer_Class/Reference/ Reference.html) nie wydają się dawać sposobu na pobranie adresu URL. Możesz spróbować sprawdzić, czy odpowiada on 'valueForKey:' z różnymi permutacjami '@" adresu URL "', ale wątpię, że zostanie ujawniony. – coneybeare

Odpowiedz

68

AVPlayer odgrywa AVPlayerItem. AVPlayerItem s są wspierane przez obiekty klasy AVAsset. Podczas korzystania z metody playerWithURL: z AVPlayer automatycznie tworzy ona AVPlayerItem zabezpieczoną przez zasób będący podklasą AVAsset o nazwie AVURLAsset. AVURLAsset ma właściwość URL.

Tak, w przypadku, w którym podałeś, możesz łatwo uzyskać NSURL aktualnie odtwarzanego przedmiotu. Oto przykładowa funkcja, jak to zrobić:

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

Nie jest szybkim ekspertem, ale wydaje się, że można to zrobić szybciej niż na krótko.

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

Może chcesz sprawdzić, czy 'player.currentItem' nie jest' nil' również w przypadku pustego init – jocull

+1

@ jaocull Na pewno możesz sprawdzić 'nil', aby nie tracić czasu na wysyłanie wiadomości do' nil'. Ale piękno obiektywu-c polega na tym, że ten kod jest całkowicie bezpieczny. W celu-c wysłanie wiadomości do 'nil' nie powoduje awarii i po prostu zwraca 'zero' lub' 0' lub 'NO' (w zależności od typu zwrotu, i tak są one takie same). Tak więc jedynym wymaganym sprawdzeniem jest dołączona instrukcja if, aby upewnić się, że zasób jest zasobem URL, ponieważ w przeciwnym razie nie odpowiadałby selektorowi '-URL' i ulegałby awarii. – NJones

+0

Nie pamiętam, co się działo, kiedy to pisałem, ale jeśli 'player.currentItem' jest zerowe, próba użycia' player.currentItem.asset' spowoduje awarię. To jedyna rzecz, na którą naprawdę trzeba uważać. – jocull

5

roztwór do szybkiej 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 
}