pestañas notes home como cerrar boton app aplicaciones abiertas ios delay avplayer

ios - notes - como cerrar pestañas abiertas en iphone



Cómo reducir el retraso de inicio de iOS AVPlayer (5)

Aquí hay varias propiedades y métodos proporcionados por la clase AVAsset que pueden ayudar:

- (void)_pu_setCachedDuration:(id)arg1; - (id)pu_cachedDuration; - (struct { long long x1; int x2; unsigned int x3; long long x4; })pu_duration; - (void)pu_loadDurationWithCompletionHandler:(id /* block */)arg1;

Tenga en cuenta que para la siguiente pregunta: todos los activos son locales en el dispositivo, no se está produciendo transmisión en red. Los videos contienen pistas de audio.

Estoy trabajando en una aplicación de iOS que requiere reproducir archivos de video con un retraso mínimo para iniciar el video en cuestión. Lamentablemente, no sabemos qué video clip es el siguiente hasta que realmente necesitemos iniciarlo. Específicamente: cuando se está reproduciendo un video, sabremos cuál es el siguiente conjunto de (aproximadamente) 10 video clips, pero no sabemos cuál exactamente, hasta que llegue el momento de reproducir el siguiente clip "inmediatamente".

Lo que he hecho para ver los retrasos de inicio reales es llamar a addBoundaryTimeObserverForTimes en el reproductor de video, con un período de tiempo de un milisegundo para ver cuándo el video realmente comenzó a reproducirse, y tomo la diferencia de esa marca de tiempo con el primer lugar en el código que indica qué activo comenzar a jugar.

Por lo que he visto hasta ahora, he descubierto que usar la combinación de carga de AVAsset , y luego crear un AVPlayerItem partir de eso una vez que está listo, y luego esperar a AVPlayerStatusReadyToPlay antes de llamar a jugar, tiende a tomar entre 1 y 3 segundos para comenzar el clip.

Desde entonces he cambiado a lo que creo que es más o menos equivalente: llamar a [AVPlayerItem playerItemWithURL:] y esperar a que se AVPlayerItemStatusReadyToPlay . Aproximadamente el mismo rendimiento.

Una cosa que estoy observando es que la primera carga de elementos de AVPlayer es más lenta que el resto. Parece que una idea es realizar un pre-vuelo del AVPlayer con un activo corto / vacío antes de intentar reproducir el primer video que podría ser una buena práctica general. [ Inicio lento para AVAudioPlayer la primera vez que se reproduce un sonido

Me encantaría tener los tiempos de inicio del video tanto como sea posible, y tener algunas ideas de cosas con las que experimentar, pero me gustaría recibir orientación de cualquier persona que pueda ayudar.

Actualización: la idea 7, a continuación, implementa tiempos de cambio de rendimientos de alrededor de 500 ms. Esto es una mejora, pero sería bueno hacerlo aún más rápido.

Idea 1: Use N AVPlayers (no funcionará)

Usando ~ 10 objetos de AVPPlayer y comenzando y pausando los ~ 10 clips, y una vez que sepamos cuál realmente necesitamos, cambie AVPlayer -pause el AVPlayer correcto, y comience nuevamente para el siguiente ciclo.

No creo que esto funcione, porque he leído que hay aproximadamente un límite de 4 activos AVPlayer''s en iOS. Había alguien preguntando sobre esto en StackOverflow aquí, y descubrió el límite de 4 AVPlayer: fast-switching-between-videos-using-avfoundation

Idea 2: Usar AVQueuePlayer (no funcionará)

No creo que AVPlayerItems 10 AVPlayerItems en un AVQueuePlayer los AVQueuePlayer todos para un inicio sin AVQueuePlayer . AVQueuePlayer es una cola, y creo que realmente solo hace que el siguiente video esté listo para su reproducción inmediata. No sé cuál de los ~ 10 videos que queremos reproducir, hasta que sea hora de comenzar ese. ios-avplayer-video-preloading

Idea 3: Cargar, reproducir y retener AVPlayerItems en segundo plano (todavía no está 100% seguro, pero no se ve bien)

Estoy viendo si hay algún beneficio para cargar y reproducir el primer segundo de cada clip de video en segundo plano (suprimir la salida de audio y video), y mantener una referencia a cada AVPlayerItem , y cuando sabemos qué elemento debe reproducirse de verdad, intercambie esa, y cambie el AVPlayer de fondo por el activo. Enjuague y repita.

La teoría sería que AVPlayer/AVPlayerItem todavía puede contener algunos recursos preparados que harían que la reproducción posterior sea más rápida. Hasta ahora, no he visto beneficios de esto, pero es posible que no tenga la configuración de AVPlayerLayer correctamente para el fondo. Dudo que esto realmente mejore las cosas de lo que he visto.

Idea 4: utilice un formato de archivo diferente, tal vez uno que sea más rápido de cargar.

Actualmente estoy usando el formato .m4v (video-MPEG4) H.264. H.264 tiene muchas opciones diferentes de códec, por lo que es posible que algunas opciones sean más rápidas de buscar que otras. He descubierto que el uso de configuraciones más avanzadas que hacen que el tamaño del archivo sea más pequeño aumenta el tiempo de búsqueda, pero no ha encontrado ninguna opción que vaya en la otra dirección.

Idea 5: Combinación de formato de video sin pérdida + AVQueuePlayer

Si hay un formato de video que es rápido de cargar, pero quizás donde el tamaño del archivo es insano, una idea podría ser pre-preparar los primeros 10 segundos de cada video clip con una versión hinchada pero más rápida de cargar, pero de vuelta eso con un activo que está codificado en H.264. Use un AVQueuePlayer, y agregue los primeros 10 segundos en el formato de archivo sin comprimir, y siga con uno que esté en H.264, que obtiene hasta 10 segundos de tiempo de preparación / precarga. Así que obtendría ''lo mejor'' de ambos mundos: tiempos de inicio rápidos, pero también se beneficia de un formato más compacto.

Idea 6: Usar un AVPlayer no estándar / escribir el mío / usar el de otra persona

Dadas mis necesidades, tal vez no pueda usar AVPlayer, pero tenga que recurrir a AVAssetReader, y decodifique los primeros segundos (posiblemente escriba el archivo sin procesar en el disco), y cuando se trate de reproducción, use el formato sin procesar para reproducirlo volver rápido. Parece un gran proyecto para mí, y si lo hago de una manera ingenua, no está claro / es probable que incluso funcione mejor. Cada cuadro de video decodificado y sin comprimir tiene 2.25 MB. Hablando ingenuamente, si vamos con ~ 30 fps para el video, terminaría con un requisito de lectura de disco de ~ 60 MB / s, lo que probablemente sea imposible / lo presione. Obviamente, tendríamos que hacer un cierto nivel de compresión de imágenes (tal vez formatos de compresión nativos de OpenGL / es a través de PVRTC) ... pero eso es una locura. Tal vez hay una biblioteca por ahí que puedo usar?

Idea 7: combine todo en un solo recurso de película, y seekToTime

Una idea que podría ser más sencilla que algunas de las anteriores es combinar todo en una sola película y usar seekToTime. El caso es que estaríamos saltando por todos lados. Esencialmente acceso aleatorio a la película. Creo que esto puede funcionar bien: avplayer-movie-playing-lag-in-ios5

¿Qué enfoque crees que sería el mejor? Hasta ahora, no he progresado tanto en términos de reducción del retraso.


Deberías probar la opción n. ° 7 primero, solo para ver si puedes hacer que funcione. Sospecho que en realidad no funcionará para sus necesidades, ya que el tiempo de búsqueda probablemente no sea lo suficientemente rápido como para proporcionarle un cambio sin interrupciones entre los clips. Si prueba eso y falla, le aconsejaría que haga la opción 4/6 y eche un vistazo a mi biblioteca de iOS diseñada específicamente para este propósito, solo haga una búsqueda rápida en Google en AVAnimator para obtener más información. Mi biblioteca hace posible implementar bucles sin interrupciones y cambiar de un clip a otro, es muy rápido porque el video debe decodificarse en un archivo de antemano. En su caso, los 10 videoclips serían decodificados en archivos antes de comenzar, pero luego cambiarlos sería rápido.


Es posible que el activo no esté listo una vez que lo haya creado, puede hacer cálculos como la duración de la película, asegúrese de incluir todos los metadatos de la película en el archivo.


Si entendí tu problema correctamente, parece que tienes un video continuo al que debes cargar la pista de audio en cualquier momento.

Si ese es el caso, sugiero buscar en BASS . BASS es una biblioteca de audio muy similar a AVPlayer que le brinda acceso (relativamente) fácil a las API de bajo nivel del framework AudioUnits en iOS. ¿Qué significa para ti? Significa que con un poco de manipulación del búfer (puede que ni lo necesite, depende de qué tan pequeño desee el retraso) puede comenzar a reproducir música al instante.

Sin embargo, las limitaciones se extienden al video, como ya dije, es una biblioteca de audio por lo que cualquier manipulación de video tendrá que hacerse con AVPlayer. Sin embargo, usar -seekToTime:toleranfeBefore:toleranceAfter: debe poder lograr una búsqueda rápida dentro del video siempre y cuando se despliegue previamente con todas las opciones necesarias.

Si se está sincronizando a través de varios dispositivos (lo que su aplicación podría sugerir) simplemente deje un comentario y me complacerá editar mi respuesta.

PD: BASS puede parecer desalentador al principio debido a su formato tipo C, pero es realmente muy fácil de usar por lo que es.


Sin haber hecho algo como esto en el pasado, basándome en tus pensamientos y experiencias probaría una combinación de 7 y 1: precarga un AVPlayer con los primeros segundos de los 10 videos de seguimiento. Entonces es muy probable que omitir sea más rápido y más confiable debido a la menor cantidad de datos. Mientras reproduce la pieza seleccionada, tiene tiempo suficiente para preparar el AVPlayer para el resto del video de seguimiento seleccionado en el fondo. Cuando el comienzo está terminado, cambia al AVPlayer preparado. Entonces, en total, usted en un momento dado tiene un máximo de 2 AVPlayers cargados.

Por supuesto, no sé si la conmutación se puede hacer tan suavemente que no moleste la reproducción.

(Hubiera agregado esto como un comentario si pudiera)

Mejor, Peter