¿Cómo reproducir videos desde la URL de transmisión con algún mecanismo de pre-buffering tal como lo hizo Facebook?

En mi aplicación tengo Timeline como Facebook y quiero implementar la reproducción automática de la misma manera que lo hace Facebook. Puedo reproducir un video cada vez que el usuario deja de desplazarse en la input de video dentro de UITableViewCell pero demora de 5 a 10 segundos reproducir un video que es el problema.

Necesito una guía experta sobre cómo precalentar los videos de urls en al less 5 segundos para brindar a los usuarios una mejor experiencia o qué otra forma de reproducir videos desde URL instantáneamente en la networking 3g. Un usuario puede tener 100 publicaciones de videos.

No puedo descubrir qué class almacena los videos AVURLAsset, AVPlayerItem o AVPlayer mientras se reproduce.

Estoy cargando AVURLAsset loadValuesAsynchronouslyForKeys y creando AVPlayerItems y luego Guardar en NSDictionary para URL Key. A continuación está mi código. Por motivos de security, la URL caduca después de 15 minutos.

-(void)setContentURL:(NSURL *)contentURL { if (contentURL) { [self.moviePlayer replaceCurrentItemWithPlayerItem:nil]; [_activityIndicator startAnimating]; __block AVPlayerItem *playerItem=[_appDelegate.dictAVPlayerItems objectForKey:[contentURL.absoluteString stringByAppendingString:self.postIdOrBlogId]]; if (!playerItem) { AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:contentURL options:nil]; NSArray *keys = [NSArray arrayWithObject:@"playable"]; [asset loadValuesAsynchronouslyForKeys:keys completionHandler:^() { NSLog(@"keys %@", keys); [self checkAssestStatus:asset]; if (asset==nil)return ; playerItem = [AVPlayerItem playerItemWithAsset:asset]; [_appDelegate.dictAVPlayerItems setObject:playerItem forKey:[contentURL.absoluteString stringByAppendingString:self.postIdOrBlogId]]; dispatch_async(dispatch_get_main_queue(), ^{ [self addPlayerItem:playerItem isNewAsset:NO]; }); }]; _contentURL = contentURL; } else [self addPlayerItem:playerItem isNewAsset:YES]; } } -(void)checkAssestStatus:(AVURLAsset*)asset { NSError *error = nil; AVKeyValueStatus tracksStatus = [asset statusOfValueForKey:@"playable" error:&error]; NSLog(@" AVURLAsset error = %@",error); if(!asset.isPlayable) { NSLog(@"assest is not playable"); [self.activityIndicator stopAnimating]; return; } switch (tracksStatus) { case AVKeyValueStatusLoaded: { NSLog(@"loaded"); } break; case AVKeyValueStatusFailed: { if (error && (error.code == AVErrorUnknown || error.code == AVErrorFailedToLoadMediaData)) { [_appDelegate.dictAVPlayerItems removeObjectForKey:[asset.URL.absoluteString stringByAppendingString:self.postIdOrBlogId]]; NSLog(@"url Expinetworking"); asset=nil; [CommonTimelineAPI requestFreshURLFor:asset.URL.absoluteString withCompletionBlock:^(NSString *freshURL, NSError *error) { if(freshURL) { NSURL* url=[NSURL URLWithString:freshURL]; if (url) { self.contentURL=url; } } }]; } } break; case AVKeyValueStatusCancelled: { NSLog(@"cancelled"); } break; case AVKeyValueStatusUnknown: { NSLog(@"unkonwn"); } break; case AVKeyValueStatusLoading: { NSLog(@"Loading"); }break; } }