significado example ios video-streaming avfoundation avplayer http-live-streaming

ios - example - hls significado



¿Es posible cachear segmentos HLS con AVPlayer? (3)

Acerca de NSURLProtocol : Como entendí, realiza solicitudes propias, por lo que se eliminarán sus etiquetas / campos / marcas personalizadas.

Lo hice de otra manera: redirigir las solicitudes de segmentos a algún esquema de url personalizado y simplemente verificar el esquema en el método canInitWithRequest del protocolo.

De esta manera funciona bien. (Pasé una semana para resolver todo el proceso de hls ...)

Problema de la raíz

Nuestro video amortigua mucho cuando buscamos en iOS. Guarda un poco más que nuestro reproductor web que guarda copias de los segmentos ya vistos en el almacenamiento temporal.

Solución deseada

Cachear los segmentos de video localmente en el disco del dispositivo. Estamos bien con el almacenamiento en caché de una sola calidad y siempre la reproducimos.

Bloqueador

No podemos encontrar una manera de realizar el almacenamiento en caché dentro de AVFoundation / AVPlayer.

Lo que hemos intentado

2 formas de interceptar solicitudes de red con AVPlayer.

  1. Cumplir con AVAssetResourceLoaderDelegate y manejar la carga de los medios manualmente

No funciona con HLS. Puede cargar los archivos m3u8 implementando AVAssetResourceLoaderDelegate, que le permite pasar la autenticación o descifrar la respuesta, sin embargo los archivos .ts no pueden cargarse. Aquí está el código que probamos: https://gist.github.com/nathanhillyer/84e46152d7c4c88183b6

  1. Implementando un NSURLProtocol para capturar solicitudes de archivos .ts .

AVURLAsset en realidad evita ser interceptado. De alguna manera las solicitudes de red simplemente no son capturadas. (No hay idea de por qué)


Comencemos con noticias realmente buenas (iOS 10 y versiones posteriores) lo da de inmediato. No más necesidad de hacks pronto. Se pueden encontrar más detalles en la siguiente sesión de WWDC16 sobre novedades en HTTP Live Streaming: https://developer.apple.com/videos/play/wwdc2016/504/

Ahora volvamos al estado actual de las cosas: iOS 9 y versiones inferiores: con AVPlayer, no. Pero puede almacenar en caché segmentos HLS a través de un servidor HTTP local y reproducir la transmisión local con AVPlayer.

AVPlayer y AVAsset no contienen la información necesaria cuando se trata con la reproducción HLS (se comporta de manera diferente a un archivo estático MP4, por ejemplo).

TL; DR: debe utilizar solicitudes HTTP para obtener los segmentos y atenderlos mediante un servidor HTTP local.

Algunas compañías, incluida una para la que trabajo, están usando esta estrategia.

Use una conexión para descargar los segmentos con la calidad que desee, reconstruya el manifiesto y aplane todo en un directorio y una calidad y luego use un servidor http local dentro de la aplicación para servirlo en AVPlayer (AVPlayer solo puede reproducir secuencias HLS servidas por encima HTTP - no de los activos del archivo).

Hay casos de borde, como el almacenamiento en búfer si desea jugar y descargar en una ejecución, reconstruir correctamente el manifiesto m3u8 y diferentes estados de AVPlayer con lectura de disco.

Descubrí esto a partir del conocimiento de primera mano, tanto con un sistema de este tipo en producción durante 5 años como con otros productos de video en la App Store que usan la misma solución, en total para muchos usuarios.

Esta es también la mejor solución que hemos encontrado para Android.


En realidad, podemos hacer que AVPlayer reproduzca un video desde la red, pero si desea guardar en caché los datos descargados para reproducirlos localmente, con AVPlayer parece imposible ahora.

Afortunadamente, hay una gran API: el objeto resourceLoader en AVURLAsset, que puede proporcionar acceso controlado a un archivo de audio remoto a AVPlayer. Esto funciona como un proxy HTTP local pero sin todas las molestias.

Puede encontrar más detalles en https://gist.github.com/anonymous/83a93746d1ea52e9d23f