2012-12-26 20 views
37

Gibt es eine Möglichkeit, die URL von einem AVPlayer Objekt zuzugreifen, die mit einer URL initialisiert wurde, wie in:Zugriff auf URL vom AVPlayer-Objekt?

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

Die 'AVPlayer' [docs] (https://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVPlayer_Class/Reference/ Reference.html) scheint keine Möglichkeit zu geben, die URL zu erfassen. Sie können versuchen, zu sehen, ob es auf 'valueForKey:' mit verschiedenen Permutationen von '@" URL "antwortet, aber ich bezweifle, dass es herausgestellt wird. – coneybeare

Antwort

68

Ein AVPlayer spielt eine AVPlayerItem. AVPlayerItem s werden durch Objekte der Klasse AVAsset unterstützt. Wenn Sie die playerWithURL:-Methode von verwenden, wird automatisch die AVPlayerItem erstellt, die von einem Asset unterstützt wird, das eine Unterklasse von AVAsset mit dem Namen AVURLAsset ist. AVURLAsset hat eine URL Eigenschaft.

Also, ja, in dem Fall, den Sie zur Verfügung gestellt haben, können Sie die NSURL des aktuell spielenden Artikels ziemlich einfach bekommen. Hier ist ein Beispiel davon ab, wie dies zu tun:

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

kein geschickter Experte, aber es scheint, kann es in swift kurz mehr getan werden.

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

Vielleicht möchten Sie überprüfen, dass 'player.currentItem' nicht' nil' ist, auch im Falle einer leeren Init – jocull

+1

@jocull Sie könnten sicher nach 'nil' suchen, um keine Zeit mit dem Versenden von Nachrichten nach' nil' zu verschwenden. Aber die Schönheit von objective-c ist, dass dieser Code absolut sicher ist. In objective-c stürzt eine Nachricht an "nil" nicht ab und gibt einfach 'nil' oder '0' oder 'NO' zurück (je nach Rückgabetyp sind sie sowieso alle gleich). Daher ist die einzige Überprüfung, die erforderlich ist, die if-Anweisung, die ich eingefügt habe, um sicherzustellen, dass das Asset ein URL-Asset ist, denn wenn dies nicht der Fall wäre, würde es nicht auf den '-URL'-Selektor reagieren und würde abstürzen. – NJones

+0

Ich vergesse, was passiert ist, als ich das geschrieben habe, aber wenn 'player.currentItem' gleich Null ist, dann wird der Versuch,' player.currentItem.asset' zu verwenden, abstürzen. Das ist das einzige, worauf man wirklich achten sollte. – jocull

5

Lösung für 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 
} 
Verwandte Themen