¿Cómo cambiar dinámicamente la velocidad de reproducción de video en iOS?

El ejemplo perfecto de lo que estoy tratando de lograr se puede ver en la aplicación Flow ● Slow and Fast Motion .

Se puede cambiar la velocidad de reproducción del video arrastrando puntos en la curva hacia arriba o hacia abajo. El video también se puede save en este estado.

Estoy buscando una forma de acelerar / bajar dinámicamente un video, de modo que la velocidad de reproducción se pueda cambiar mientras se reproduce el video.

Explicación de video

introduzca la descripción de la imagen aquí

LO QUE HE PROBADO

  • La propiedad de rate reproducción de AVPlayer Pero solo funciona con algunos valores para la velocidad de reproducción (0.50, 0.67, 0.80, 1.0, 1.25, 1.50 y 2.0) y no se puede save el video
  • La scaleTimeRange(..) de AVMutableComposition . Pero no funciona cuando desea reanudar el video para disminuir gradualmente el movimiento lento / rápido.

  • Muestra frameworks de video en la pantalla con CAEAGLLayer y CADisplayLink . Pero mis muchos bashs por tratar de lograr el movimiento lento / rápido con esto no han tenido éxito.

Todo esto me ha tomado meses y estoy empezando a dudar si podré lograr esto en absoluto.

Por lo tanto, cualquier sugerencia sería inmensamente valiosa.

En IOS, el object MPNowPlayingInfoCenter contiene un dictionary 'nowPlayingInfo' cuyo contenido describe el elemento que se está reproduciendo. Se recomienda que inicie la reproducción en 'currentplaybackrate' y luego establezca la velocidad. Mira este hilo en el foro del desarrollador.

Es posible que termines con algo como esto (pero esto es javascript) donde la velocidad de reproducción del video se ha acelerado en 4.

  document.querySelector('video').playbackRate = 4.0; document.querySelector('video').play(); 
 video{width:400px; height:auto;} 
 <video controls preload="true" autoplay> <source src="http://www.rachelgallen.com/nature.mp4" type="video/mp4" > </video> 

Entonces no estoy seguro de entender completamente el caso de uso que buscas, pero creo

 func setRate(_ rate: Float, time itemTime: CMTime, atHostTime hostClockTime: CMTime) 

[Fuente de documentation de Apple]

Es algo que estás buscando. Si bien esto puede no ser exactamente lo que necesita, tampoco estoy seguro de dónde está exactamente lo que está buscando en los documentos, pero con el método anterior solo, puede hacer lo siguiente para save videos a una velocidad variable:

1) Utilice el método anterior para reproducir el video en todo (suponiendo que no sea demasiado largo, de lo contrario esto será computacionalmente imposible / time de espera en algunos dispositivos) a las tasas deseadas cada segundo. Diseñe la interfaz de usuario para ajustar esto por segundo.

2) debajo del capó, puedes reproducir el video a esa velocidad "fotogtwig a fotogtwig" y capturar los fotogtwigs que deseas (en el # derecho que te dará la velocidad que deseas) y listo: save el número correcto de fotogtwigs juntos (omitir / duplicar según sea necesario para boost / disminuir la tasa deseada en function de la interfaz de usuario "selector") ahora ha logrado lo que desea

Para ser claro, lo que estoy hablando aquí es una salida de video @ 60FPS tiene 60 cuadros por segundo. Literalmente, "corte y pegue" frameworks juntos desde el video de origen en el video de "destino" en function de los valores de steppers de UI que reciba de su usuario (en el ejemplo de la captura de pantalla, la pregunta contiene, como base) y retome que muchos frameworks AKA si el usuario dice que los segundos 2-10 de su video de 20 segundos deben estar en 2X, solo poner 30 cuadros para cada uno de esos segundos (si se graban a 60 FPS) cuadros alternados. La salida será, a 60FPS, como una velocidad de 2X (ya que ahora hay 30 fotogtwigs por 1 segundo de video original, que es de 0.5 segundos a 60 FPS). De manera similar, cualquier valor se puede tener en count de manera adecuada en:

  • (FPS consistente deseado) = (video fuente FPS) = (video destino FPS) (es decir, 60 o 90)
  • (tasa) = (tasa de UI steppers / gráfico UI para elegir tasa @ cada intervalo de time) (es decir, 1X / 2x / 0.25X)
  • (FPS consistente deseado) * (tasa) = (# cuadros guardados en el video de destino)
  • (ttwigs de video de destino) = (video fuente) * (FPS consistente deseado) ~ modulado por ~ (por frecuencia de intervalo de time personalizado )

Los mecanismos exactos para ^^ podrían integrarse realmente en AVPlayer y no encontré los detalles, pero este solo debería ser un buen comienzo para que te pongas en marcha en esa dirección.