Progreso de transmisión AVPlayer

Estoy utilizando con éxito AVPlayer para transmitir audio desde un server y lo que quiero hacer ahora es mostrar un UISlider personalizado que muestra el progreso del almacenamiento en búfer.

Algo como esto:

introduzca la descripción de la imagen aquí

Con AVPlayer no parece haber una forma de get el tamaño de descarga total o la cantidad descargada actual para el file de audio, solo el time de reproducción actual y el time total de reproducción.

¿Hay alguna solución para esto?

Solo estoy trabajando en esto, y hasta ahora tengo lo siguiente:

 - (NSTimeInterval) availableDuration; { NSArray *loadedTimeRanges = [[self.player currentItem] loadedTimeRanges]; CMTimeRange timeRange = [[loadedTimeRanges objectAtIndex:0] CMTimeRangeValue]; Float64 startSeconds = CMTimeGetSeconds(timeRange.start); Float64 durationSeconds = CMTimeGetSeconds(timeRange.duration); NSTimeInterval result = startSeconds + durationSeconds; return result; } 

Debería funcionar bien:

C objective:

 - (CMTime)availableDuration { NSValue *range = self.player.currentItem.loadedTimeRanges.firstObject; if (range != nil){ return CMTimeRangeGetEnd(range.CMTimeRangeValue); } return kCMTimeZero; } 

Versión Swift:

 func availableDuration() -> CMTime { if let range = self.player?.currentItem?.loadedTimeRanges.first { return CMTimeRangeGetEnd(range.timeRangeValue) } return kCMTimeZero } 

Para ver el valor del time actual, puede usar: CMTimeShow ([self availableDuration]); o CMTimeShow (availableDuration ()) (para swift)

Este método devolverá el intervalo de time del buffer para su UISlider

 public var bufferAvail: NSTimeInterval { // Check if there is a player instance if ((player.currentItem) != nil) { // Get current AVPlayerItem var item: AVPlayerItem = player.currentItem if (item.status == AVPlayerItemStatus.ReadyToPlay) { var timeRangeArray: NSArray = item.loadedTimeRanges var aTimeRange: CMTimeRange = timeRangeArray.objectAtIndex(0).CMTimeRangeValue var startTime = CMTimeGetSeconds(aTimeRange.start) var loadedDuration = CMTimeGetSeconds(aTimeRange.duration) return (NSTimeInterval)(startTime + loadedDuration); } else { return(CMTimeGetSeconds(kCMTimeInvalid)) } } else { return(CMTimeGetSeconds(kCMTimeInvalid)) } } 

La respuesta seleccionada puede causar problemas si la matriz devuelta está vacía. Aquí hay una function fija:

 - (NSTimeInterval) availableDuration { NSArray *loadedTimeRanges = [[_player currentItem] loadedTimeRanges]; if ([loadedTimeRanges count]) { CMTimeRange timeRange = [[loadedTimeRanges objectAtIndex:0] CMTimeRangeValue]; Float64 startSeconds = CMTimeGetSeconds(timeRange.start); Float64 durationSeconds = CMTimeGetSeconds(timeRange.duration); NSTimeInterval result = startSeconds + durationSeconds; return result; } return 0; } 

El código de Suresh Kansujiya en Objective C

 NSTimeInterval bufferAvail; if (player.currentItem != nil) { AVPlayerItem *item = player.currentItem; if (item.status == AVPlayerStatusReadyToPlay) { NSArray *timeRangeArray = item.loadedTimeRanges; CMTimeRange aTimeRange = [[timeRangeArray objectAtIndex:0] CMTimeRangeValue]; Float64 startTime = CMTimeGetSeconds(aTimeRange.start); Float64 loadedDuration = CMTimeGetSeconds(aTimeRange.duration); bufferAvail = startTime + loadedDuration; NSLog(@"%@ - %f", [self class], bufferAvail); } else { NSLog(@"%@ - %f", [self class], CMTimeGetSeconds(kCMTimeInvalid)); } } else { NSLog(@"%@ - %f", [self class], CMTimeGetSeconds(kCMTimeInvalid)); }