2015-03-10 6 views
6

Nella mia applicazione, utilizzo AVPlayer per leggere alcuni flussi (file m3u8), con protocollo HLS. Ho bisogno di sapere quante volte, durante una sessione di streaming, il client cambia bitrate.Rileva quando il bit rate dello switch di AvPlayer è

Supponiamo che la larghezza di banda del client sia in aumento. Quindi il client passerà a un segmento di bitrate più alto. L'AVPlayer può rilevare questo interruttore?

Grazie.

risposta

9

Ho avuto un problema simile di recente. La soluzione sembrava un po 'hacky ma ha funzionato fino a quando ho visto. Innanzitutto ho impostato un osservatore per le nuove notifiche del registro di accesso:

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

Quale chiama questa funzione. Probabilmente può essere ottimizzato ma qui è l'idea di base:

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

Ogni volta che c'è una nuova voce nel log di accesso, verifica l'ultimo bitrate indicato dalla voce più recente (la LastObject nel log di accesso per l'elemento giocatore). Confronta questo bitrate indicato con una proprietà che memorizzava il bitrate da quell'ultima modifica.

+0

Ha fatto il trucco! Grazie: D – tcacciatore

4

La soluzione di BoardProgrammer funziona alla grande! Nel mio caso, avevo bisogno del bitrate indicato per rilevare quando la qualità del contenuto passava da SD a HD. Ecco la versione Swift 3.

// 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. 
} 
Problemi correlati