Scrubber (UISlider) en AVPlayer?

Cuando reproduce videos remotos a través de AVPlayer y comienza a rebobinar, el depurador tiene errores.

Estoy haciendo un jugador basado en este ejemplo de Apple.

¿Cómo implementarlo sin problemas?

A continuación sigue el código de mi proyecto: https://github.com/nullproduction/Player

 - (void)initScrubberTimer { double interval = .1f; CMTime playerDuration = [self playerItemDuration]; if (CMTIME_IS_INVALID(playerDuration)) { return; } double duration = CMTimeGetSeconds(playerDuration); if (isfinite(duration)) { CGFloat width = CGRectGetWidth([scrubberSlider bounds]); interval = 0.5f * duration / width; } __weak id weakSelf = self; CMTime intervalSeconds = CMTimeMakeWithSeconds(interval, NSEC_PER_SEC); mTimeObserver = [self.player addPeriodicTimeObserverForInterval:intervalSeconds queue:dispatch_get_main_queue() usingBlock:^(CMTime time) { [weakSelf syncScrubber]; }]; } - (void)syncScrubber { CMTime playerDuration = [self playerItemDuration]; if (CMTIME_IS_INVALID(playerDuration)) { scrubberSlider.minimumValue = 0.0; return; } double duration = CMTimeGetSeconds(playerDuration); if (isfinite(duration)) { float minValue = [scrubberSlider minimumValue]; float maxValue = [scrubberSlider maximumValue]; double time = CMTimeGetSeconds([self.player currentTime]); [scrubberSlider setValue:(maxValue - minValue) * time / duration + minValue]; } } - (IBAction)beginScrubbing:(id)sender { mRestoreAfterScrubbingRate = [self.player rate]; [self.player setRate:0.f]; [self removePlayerTimeObserver]; } - (IBAction)scrub:(id)sender { if ([sender isKindOfClass:[UISlider class]]) { UISlider* slider = sender; CMTime playerDuration = [self playerItemDuration]; if (CMTIME_IS_INVALID(playerDuration)) { return; } double duration = CMTimeGetSeconds(playerDuration); if (isfinite(duration)) { float minValue = [slider minimumValue]; float maxValue = [slider maximumValue]; float value = [slider value]; double time = duration * (value - minValue) / (maxValue - minValue); [self.player seekToTime:CMTimeMakeWithSeconds(time, NSEC_PER_SEC)]; } } } - (IBAction)endScrubbing:(id)sender { if (!mTimeObserver) { CMTime playerDuration = [self playerItemDuration]; if (CMTIME_IS_INVALID(playerDuration)) { return; } double duration = CMTimeGetSeconds(playerDuration); if (isfinite(duration)) { CGFloat width = CGRectGetWidth([scrubberSlider bounds]); double tolerance = 0.5f * duration / width; __weak id weakSelf = self; CMTime intervalSeconds = CMTimeMakeWithSeconds(tolerance, NSEC_PER_SEC); mTimeObserver = [self.player addPeriodicTimeObserverForInterval:intervalSeconds queue:dispatch_get_main_queue() usingBlock: ^(CMTime time) { [weakSelf syncScrubber]; }]; } } if (mRestoreAfterScrubbingRate) { [self.player setRate:mRestoreAfterScrubbingRate]; mRestoreAfterScrubbingRate = 0.f; } } 

Creo que el problema es que tu depurador todavía está actualizando desde el video, mientras estás usando la barra de búsqueda. Implementarlo de una manera, que pause al jugador durante el lavado, y ya no tendrá este error. Pagar mi solución:

La function para actualizar tu reproductor:

 - (IBAction)seekbarAction:(UISlider *)sender { CMTime videoLength = playerItem1.duration; //gets the video duration float videoLengthInSeconds = videoLength.value/videoLength.timescale; //transfers the CMTime duration into seconds [player1 seekToTime:CMTimeMakeWithSeconds(videoLengthInSeconds*sender.value, 1)]; } 

Y otra acción de barra de búsqueda con "tocar hacia abajo" para pausar el video:

 - (IBAction)pauseSeek:(id)sender { [player1 pause]; } 

Y otra acción de barra de búsqueda con "Retocar" para reanudar el video cuando suelte el depurador. Espero que esto ayude.