AVPlayer: cambiar la calidad de la transmisión mientras se reproduce

Estoy usando AVPlayer para reproducir videos de YouTube, para cada identificación de video de YouTube, recupero un par de urls de flujo en diferentes calidades.

Quiero reproducir una calidad de transmisión particular de acuerdo con el estado de la networking. Por ejemplo, si el usuario está en 3G, quiero reproducir la URL de menor calidad, pero si el usuario se mueve a Wi-Fi, quiero cambiar sin interrupciones a la transmisión de mejor calidad.

Esto no es nada nuevo, YouTube está haciendo eso en su aplicación y en muchos otros.

Así que me pregunto cuál es la mejor manera de hacer este tipo de conmutación con AVPlayer , no quiero que el usuario note la conmutación como sea posible, sin detener la reproducción de video o el almacenamiento en búfer.
¿Algún consejo?

No estoy seguro si este tipo de funcionalidad es compatible con los serveres de YouTube o si necesito hacerlo en el lado del cliente.

Debe echar un vistazo a la documentation de Apple en la transmisión en vivo HTTP.

La única forma de lograr el tipo de conmutación que desea y de lo que se habla en la documentation es el uso de files de índice m3u y files TS que contienen los datos de video.

Se conecta al file de índice y almacena sus contenidos, que serán múltiples URL junto con los requisitos de ancho de banda. Vea los ejemplos aquí . Luego, use la class Reachability para verificar el estado de la networking y conectarse a la transmisión adecuada. Inicie el notificador de accesibilidad y reaccione a los events cambiando la transmisión a la que está conectado. Esto hará que el file TS que pertenece a la secuencia se descargue y se almacene en el búfer para la reproducción, logrando el tipo de conmutación que desee.

Como dije anteriormente, el inconveniente es el requisito de usar files TS. ¡Esto significaría que los files de video tendrían que downloadse de Youtube, preparados con la herramienta de command-line mediafilesegmenter proporcionada por Apple y almacenados en un server FTP! No es ideal en absoluto, pero por lo que sé, la única forma de hacerlo.

Consulte el método AVPlayer replaceCurrentItemWithPlayerItem: Si yo fuera usted, usaría Reachbility para observar el estado de la networking del usuario. Cuando la accesibilidad de la networking se degrada, puede hacer algo como esto:

 AVPlayerItem *item = [AVPlayerItem playerItemWithURL:urlOfLowerQuality]; [item seekToTime:player.currentTime]; [player replaceCurrentItemWithPlayerItem:playerItem]; 

Use ReachabilityManager para verificar el estado actual del tipo de datos ya sea wifi o 3G. De acuerdo con el modo de datos, cambie el tipo de URL. Mientras que la URL de cambio toma el time actual del video y necesita configurar el time de búsqueda del video.