2011-10-05 9 views
6

Estoy más o menos usando el código de aquí: AVPlayer Video SeekToTime Sin embargo, cuando intento desplazarme parece bloquear ciertos puntos de tiempo (básicamente cada fotograma que establece en la segunda marca de tiempo), de modo que cuando paso por la fregadora sigo disparando hacia adelante y hacia atrás entre donde está mi dedo y el último segundo que pasó y el video solo cambia en esas segundas marcas.iOS AVPlayer seektotime bloqueo en ciertos puntos

Ahora, un "gran" cambio que realicé porque queremos un desplazamiento suave es que en cualquier lugar donde haya "seekToTime" lo reemplacé con un seekToTime: toleranceAntes: kCMTimeZero toleranceAfter: kCMTimeZero.

¡Si necesita más información, por favor hágamelo saber! ¡Gracias por adelantado!

Respuesta

12

se refieren a continuación código: el código es una parte de la muestra de Apple código

AVPlayerDemo

Si intenta implementar un reproductor de streaming, consulte el código de ejemplo siguiente.

StitchedStreamPlayer

también, un completo implementos exactamente exfoliante es mediante el control deslizante, como a continuación. porque un gran reproductor de video debería considerar UX. como sabes ejecutar la aplicación de video predeterminada. mientras frega, si arrastra hacia abajo el deslizador debe estar afinado.

CPSlider | OBSlider

/* The user is dragging the movie controller thumb to scrub through the movie. */ 
- (IBAction)beginScrubbing:(id)sender 
{ 
    mRestoreAfterScrubbingRate = [mPlayer rate]; 
    [mPlayer setRate:0.f]; 

    /* Remove previous timer. */ 
    [self removePlayerTimeObserver]; 
} 

/* Set the player current time to match the scrubber position. */ 
- (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); 

      [mPlayer seekToTime:CMTimeMakeWithSeconds(time, NSEC_PER_SEC)]; 
     } 
    } 
} 

/* The user has released the movie thumb control to stop scrubbing through the movie. */ 
- (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([mScrubber bounds]); 
      double tolerance = 0.5f * duration/width; 

      mTimeObserver = [[mPlayer addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(tolerance, NSEC_PER_SEC) queue:NULL usingBlock: 
      ^(CMTime time) 
      { 
       [self syncScrubber]; 
      }] retain]; 
     } 
    } 

    if (mRestoreAfterScrubbingRate) 
    { 
     [mPlayer setRate:mRestoreAfterScrubbingRate]; 
     mRestoreAfterScrubbingRate = 0.f; 
    } 
} 
+0

Sabes que este código funciona mucho mejor fuera de esa vista/controlador que hicieron para mí. No intenté solo el código del depurador, ¡funciona mucho mejor gracias! –

+0

intentaré eso. gracias! – headkit

3

Junto con bitmapdata.com respuesta (utilizando [AVPlayer setRate] en lugar de pausa/seektime) es necesario tener un vídeo codificado con un fotograma clave en cada marcos. ¡Solo re-codifiqué mi video con esa configuración y ahora puedo navegar a través de mi video sin problemas!

+0

¡Un gran consejo! ¡Gracias! –

+0

Pero, ¿cómo vuelves a codificar el video? – openfrog

+0

Utilicé Adobe Media Encoder, que era perfecto para el trabajo. – kikko

Cuestiones relacionadas