2015-03-10 8 views
6

In meiner Anwendung verwende ich den AVPlayer, um einige Streams (m3u8 Datei) mit HLS-Protokoll zu lesen. Ich muss wissen, wie oft während einer Streaming-Sitzung der Client die Bitrate wechselt.Erkennen, wenn AvPlayer Wechselrate

Nehmen wir an, die Bandbreite des Clients nimmt zu. Der Client wechselt also in ein Segment mit höherer Bitrate. Kann der AVPlayer diesen Schalter erkennen?

Danke.

Antwort

9

Ich hatte in letzter Zeit ein ähnliches Problem. Die Lösung fühlte sich ein bisschen hacky an, aber es funktionierte soweit ich sah. Zuerst richte ich einen Beobachter für neue Access Log-Benachrichtigungen ein:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(handleAVPlayerAccess:) 
              name:AVPlayerItemNewAccessLogEntryNotification 
              object:nil]; 

Welches ruft diese Funktion auf. Es kann wahrscheinlich optimiert werden, aber hier ist die Grundidee:

- (void)handleAVPlayerAccess:(NSNotification *)notif { 
    AVPlayerItemAccessLog *accessLog = [((AVPlayerItem *)notif.object) accessLog]; 
    AVPlayerItemAccessLogEvent *lastEvent = accessLog.events.lastObject; 
    float lastEventNumber = lastEvent.indicatedBitrate; 
    if (lastEventNumber != self.lastBitRate) { 
     //Here is where you can increment a variable to keep track of the number of times you switch your bit rate. 
     NSLog(@"Switch indicatedBitrate from: %f to: %f", self.lastBitRate, lastEventNumber); 
     self.lastBitRate = lastEventNumber; 
    } 
} 

Jedes Mal gibt es an das Zugriffsprotokoll einen neuer Eintrag vorhanden ist, überprüft er die letzte angegebene Bitrate aus dem jüngsten Eintrag (der lastObject im Zugriffsprotokoll der Spieler Artikel). Es vergleicht diese angezeigte Bitrate mit einer Eigenschaft, die die Bitrate von dieser letzten Änderung gespeichert hat.

+0

Hat den Trick gemacht! Danke: D – tcacciatore

4

BoardProgrammer Lösung funktioniert gut! In meinem Fall brauchte ich die angezeigte Bitrate, um festzustellen, wann die Inhaltsqualität von SD auf HD umschaltete. Hier ist die Swift 3 Version.

// Add observer. 
NotificationCenter.default.addObserver(self, 
              selector: #selector(handleAVPlayerAccess), 

              name: NSNotification.Name.AVPlayerItemNewAccessLogEntry, 
              object: nil) 

// Handle notification. 
func handleAVPlayerAccess(notification: Notification) { 

    guard let playerItem = notification.object as? AVPlayerItem, 
     let lastEvent = playerItem.accessLog()?.events.last else { 
     return 
    } 

    let indicatedBitrate = lastEvent.indicatedBitrate 

    // Use bitrate to determine bandwidth decrease or increase. 
}