AVPlayer realiza una request HTTP extra antes de la reproducción de video encriptado HLS / AES

Estamos utilizando AVPlayer en iOS 8.4 para reproducir HLS, video encriptado AES.

Nuestros files .m3u8 incluyen la url del server de licencias, por ejemplo:

EXT-X-KEY: METHOD = AES-128, URI = "https: // …."

En nuestra aplicación de iOS, estamos usando el método AVAssetResourceLoaderDelegate resourceLoader: shouldWaitForLoadingOfRequestedResource: para interceptar la request enviada por el AVPlayer (o algún object dentro de AVFoundation) al server de licencias. Dentro de ese método, agregamos un token (requerido por el server de licencias) a queryString de la request.

El server de licencias recibe la request con el token, devuelve la key de encryption y comienza la reproducción. En otras palabras, todo funciona como se esperaba.

Sin embargo , estamos notando (utilizando el monitor http de "Charles") que después de la creación del AVPlayerItem y antes de la invocación del método resourceLoader: AVFoundation envía una request inicial a la url del server de licencias; una request que no se "enruta" a través del método resourceLoader:. Esta request se rechaza en el server ya que nuestro código iOS nunca tiene la posibilidad de anexar el token antes de que se apague la request.

Resumen de events:

• AVPlayerItem / AVAsset se crea e inicializa con la url del file de índice .m3u8.

• Algo dentro de AVFoundation framwork realiza una request al server de licencias especificado en el file .m3u8. Esta request inicial NO es interceptada por el método recourceLoader: shouldWaitForLoadingOfRequestedResource: y la request no modificada llega al server de licencias. Debido a que la request no contiene un token obligatorio en queryString, falla y no se devuelve ninguna key de encryption.

AVFoundation realiza una segunda request al server licesnse. Esta request ES atrapada por recourceLoader: … y modificada adecuadamente. El server de licencias devuelve una key de encryption y comienza la reproducción.

Este comportamiento se puede replicar con la aplicación AVARLDelegateDemo de Apple.

Preguntas:

¿La request HTTP inicial enviada por AVFoundation es normal?

Si es así, ¿por qué es necesario y por qué no se "enruta" a través del método resourceLoader:?

¿Es posible suprimir la request inicial o modificarla antes de enviarla?

¡Gracias!

La respuesta simple a este problema es que AVAssetResourceLoaderDelegate solo gestionará las requestes de URL que no se pueden procesar de la manera normal.

En su caso, la URL de su key es una URL https: // normal, por lo que AVPlayer intentará procesar esta request en sí misma. Sin el token, sin embargo, este pedido es rechazado por su server. Por lo tanto, AVAssetResourceLoaderDelegate pasará la request a su delegado para manejarla.

Para evitar la request "extraña", modifique su list de reproducción para que la URL de la key de encryption tenga un esquema no válido. Use algo así como crypt: // … en lugar de https: // …

De esta manera, recibirá la llamada de cargador de resources en el primer bash, y puede replace el esquema crypt: // con https: // y agregar su token antes de realizar la request usted mismo de la manera normal.

Es justo cómo funciona AVAssetResourceLoaderDelegate , me temo. Consulte la aplicación de ejemplo de Apple aquí para get más detalles: https://developer.apple.com/library/ios/samplecode/sc1791/