2 votes

Le flux HLS utilisant AVAssetResourceLoaderDelegate TS Fragment Requests Missing Cookie Header (flux HLS utilisant AVAssetResourceLoaderDelegate TS Fragment Requests Missing Cookie Header)

J'utilise le AVAssetResourceLoadingDelegate pour intercepter toutes les demandes de manifeste pour un manifeste HLS

let str = "examplehttp://example.com/path/to/master.m3u8?token=SOMETOKEN"
guard let url = URL(string: str) else { return }

let asset = AVURLAsset(url: url)
let loaderQueue = DispatchQueue(label: "com.example.LoaderQueue")
asset.resourceLoader.setDelegate(delegate, queue: loaderQueue)

let item = AVPlayerItem(asset: asset)

player = AVPlayer(playerItem: item)
player?.playImmediately(atRate: 1.0)

Dans le délégué, j'effectue moi-même toutes les demandes de manifeste en utilisant URLSession et renvoie les réponses au AVAssetResourceLoadingRequest

// NOTE: dataRequest: AVAssetResourceLoadingDataRequest
dataRequest.respond(with: data)
loadingRequest.response = response
loadingRequest.finishLoading()

Ce flux est protégé par un processus d'authentification relativement standard :

La demande de manifeste principal est faite avec un paramètre de requête de jeton annexé. La réponse au manifeste principal comprend un en-tête set-cookie. Chaque demande ultérieure dont le domaine est spécifié dans l'en-tête de réponse set-cookie inclut le cookie dans ses en-têtes de demande.

Ce que je constate, c'est que toutes les demandes faites par l'intermédiaire du délégué ont le cookie ajouté à l'en-tête, mais comme le délégué ne peut pas être utilisé pour les segments TS, le cookie n'est pas ajouté.

Quelqu'un connaît-il un moyen de forcer le AVURLAsset pour toujours utiliser l'en-tête de cookie fourni par la réponse au manifeste principal pour les requêtes effectuées en dehors de l'environnement AVAssetResourceLoaderDelegate ?

Puisque je fournis le URLResponse retour à AVAssetResourceLoadingRequest et je sais qu'il est possible d'ajouter des cookies à une URLSession en utilisant la fonction httpShouldAccpetCookies , httpCookieAcceptPolicy y httpCookieStorage propriétés. Je ne pense pas que cela soit hors du champ des possibilités.

Je suis également conscient de la AVURLAssetHTTPCookiesKey qui peuvent être ajoutées à l'instanciation de l'élément AVURLAasset mais je n'ai pas le cookie tant qu'une demande de manifeste principal n'a pas été faite.

1voto

John Gainfort Points 71

Réponse d'Apple :

Il n'est pas possible d'utiliser le AVAssetResourceLoaderDelegate pour capturer et modifier le manifeste maître/enfant. et modifier les manifestes maître/enfant d'une liste de lecture HLS pour définir un pour le domaine de l'URL du manifeste. [ ] actuellement pas pris en charge dans AVFoundation.

[Le seul soutien actuel aux biscuits est l'abi AVURLAsset AVURLAssetHTTPCookiesKey pour permettre à l'option d'initialisation de l AVURLAsset d'utiliser des cookies HTTP supplémentaires pour les requêtes HTTP(S). Se https://developer.apple.com/reference/avfoundation/avurlassethttpcookieskey pour plus d'informations.

Il suffit de prendre ses biscuits et de créer un dictionnaire comme indiqué ci-dessous ( @{AVURLAssetHTTPCookiesKey : cookies} ), puis spécifier ce dictionnaire dans l'option AVURLAsset URLAssetWithURL:linkUrl options :

NSArray *cookies = [[NSHTTPCookieStorage sharedH cookies] ;

AVURLAsset * asset = [AVURLAsset URLAssetWithURL:yourURL options:@{AVURLAssetHTTPCookiesKey : cookies}] ;

AVPlayerItem * item = [AVPlayerItem playerItemWithAsset:asset] ;

AVPlayer *player = [[AVPlayer alloc] initWithPlayerItem:item] ;

Veuillez noter que cela ne vous permet de définir des cookies que lorsque l'AVAsset est et vous ne pouvez pas les modifier ultérieurement.

En outre, comme indiqué dans la documentation, dans HLS, (par exemple, média, clé de chiffrement, index de variante) peuvent être émises vers différents chemins ou hôtes. chemins ou hôtes différents. Dans ces deux cas, les requêtes HTTP seront dépourvues de cookies qui ne s'appliquent pas à l'URL AVURLAsset.

Une solution "non officielle" qui pourrait fonctionner est de passer la lecture à travers un proxy inverse qui vous permettra d'intercepter la requête, d'ajouter des en-têtes, d'ajouter des sondes, etc. d'ajouter des en-têtes, de l'envoyer au vrai serveur, puis d'extraire les en-têtes de la réponse. de la réponse avant de la renvoyer au lecteur AV.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X