Tenga en cuenta que para la siguiente pregunta: todos los recursos son locales en el dispositivo, no se está produciendo la transmisión de la red. Los videos contienen pistas de audio.Cómo reducir el retraso de inicio de iOS AVPlayer
Estoy trabajando en una aplicación de iOS que requiere reproducir archivos de video con un retraso mínimo para iniciar el video clip 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 al addBoundaryTimeObserverForTimes
en el reproductor de video, con un período 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 encontrado que el uso de la combinación de AVAsset
carga y, a continuación, crear una AVPlayerItem
de que una vez que esté listo, y luego esperar a que AVPlayerStatusReadyToPlay
antes de que llame juego, tiende a tomar entre 1 y 3 segundos para comenzar el clip.
Desde entonces me he cambiado a lo que creo que es más o menos equivalente: llamar al [AVPlayerItem playerItemWithURL:]
y esperar a que AVPlayerItemStatusReadyToPlay
juegue. Aproximadamente el mismo rendimiento.
Una cosa que estoy observando es que la carga del primer elemento 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. [Slow start for AVAudioPlayer the first time a sound is played
Me encantaría tener los tiempos de inicio del video tanto como sea posible, y tener algunas ideas de cosas para experimentar, pero me gustaría recibir orientación de cualquier persona que pueda ayudar.
Actualización: la idea 7, a continuación, según implementa, produce tiempos de conmutación de alrededor de 500 ms. Esto es una mejora, pero sería bueno hacerlo aún más rápido.
Idea 1: Uso N AVPlayers (no funcionarán)
Usando ~ 10 AVPPlayer
objetos y puesta en pausa y todos ~ 10 clips, y una vez que sabemos cuál realmente necesitamos, conmutador para, y sin pausa, el AVPlayer
correcto, y vuelva a comenzar para el próximo ciclo.
No creo que esto funcione, porque he leído que hay aproximadamente un límite de 4 AVPlayer's
activos en iOS. Hubo alguien que preguntaba sobre esto en StackOverflow aquí, y descubrió el límite de 4 AVPlayer: fast-switching-between-videos-using-avfoundation
Idea 2: Uso AVQueuePlayer (no funciona)
no creo que empujar 10 AVPlayerItems
en un AVQueuePlayer
los precargará todos para un inicio sin interrupciones. AVQueuePlayer
es una cola, y creo que realmente solo hace que el siguiente video en la cola 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: Carga, Play, y retener AVPlayerItems
en el fondo (no es 100% seguro todavía - pero no en buen estado)
estoy mirando si hay algún beneficio para cargar y reproducir el primer segundo de cada videoclip en segundo plano (suprima la salida de audio y video), y mantenga una referencia a cada AVPlayerItem
, y cuando sepamos qué elemento debe reproducirse de manera real, intercambie ese uno y cambie el fondo de AVPlayer por el activo Enjuague y repita.
La teoría sería que recientemente se ha reproducido AVPlayer/AVPlayerItem
's todavía puede contener algunos recursos preparados que harían la posterior reproducción más rápida. Hasta ahora, no he visto beneficios de esto, pero es posible que no tenga la configuración AVPlayerLayer
correctamente para el fondo. Dudo que esto realmente mejore las cosas de lo que he visto.
Idea 4: ¿Utiliza un formato de archivo diferente, tal vez uno que sea más rápido de cargar?
Actualmente estoy usando .m4v (video-MPEG4) formato 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 vídeo sin pérdida + AVQueuePlayer
Si hay un formato de vídeo que es rápido para cargar, pero tal vez en que el tamaño del archivo es una locura, una idea podría ser la de pre-preparar el los primeros 10 segundos de cada video clip con una versión hinchada pero más rápida de cargar, pero respaldada con un activo 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: Utilice un AVPlayer no estándar/escribir mi propia/usar de otra persona
Dadas mis necesidades, tal vez no puedo usar AVPlayer, pero tienen que recurrir a AVAssetReader, y decodificar la primera unos segundos (posiblemente, escriba el archivo sin procesar en el disco), y cuando se trata de reproducción, utilice el formato sin formato para reproducirlo rápidamente. 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 activo película, y seekToTime
Una idea que podría ser más fácil que algunos de los anteriores, es combinar todo en una sola película, y utilizar seekToTime. El caso es que estaríamos saltando por todos lados. Esencialmente acceso aleatorio a la película. Creo que esto realmente puede funcionar bien: avplayer-movie-playing-lag-in-ios5
¿Cuál enfoque crees que sería el mejor? Hasta ahora, no he progresado tanto en términos de reducción del retraso.
Por lo que vale la pena, voy con la idea 7. Todavía es lento, pero no es tan impredecible lento como las otras opciones. La siguiente pregunta que tengo es: ¿las opciones del códec, la resolución y la frecuencia de las tramas clave tienen un impacto en la búsqueda del tiempo? –
Tarde en el juego, pero puede valer la pena cambiar los videos lo más rápido posible (es decir, inmediatamente después de que el nuevo comienza a reproducirse) y perfilar la aplicación para ver dónde pasa la mayor parte de su tiempo de CPU. –
Casi un año después, ¿qué descubriste con esto? – lnafziger