Je suis actuellement en train de mettre en œuvre le streaming hors ligne avec le streaming de Fairplay. Je télécharge que je télécharge des flux en utilisant un Je veux donner aux utilisateurs les commentaires sur la taille du téléchargement qui commence à commencer: p> Êtes-vous sûr de vouloir télécharger ce flux? Il faudra 2,4 Go à télécharger et vous avez actuellement 14 Go d'espace laissé p>
blockQuote> J'ai vérifiant les propriétés telles que avastetdownloadtask code>.
pas de typeofbytesreceived code> et
comteofbytesexpecettoreceive code> mais ces valeurs corrigent les valeurs correctes. P>
func URLSession(session: NSURLSession, assetDownloadTask: AVAssetDownloadTask, didLoadTimeRange timeRange: CMTimeRange, totalTimeRangesLoaded loadedTimeRanges: [NSValue], timeRangeExpectedToLoad: CMTimeRange) {
print("Downloaded \( convertFileSizeToMegabyte(Float(assetDownloadTask.countOfBytesReceived)))/\(convertFileSizeToMegabyte(Float(assetDownloadTask.countOfBytesExpectedToReceive))) MB")
}
3 Réponses :
Je n'ai pas travaillé avec cette API personnellement, mais je suis au moins un peu familier avec HTTP Live Streaming. Avec cette connaissance, je pense que je sais pourquoi vous ne pouvez pas obtenir les informations que vous recherchez. P>
Le protocole HLS est conçu pour la manipulation Live em> Streaming ainsi que la diffusion en continu d'actifs de longueur fixe. Cela le fait en découpant les médias dans ce qui sont généralement environ dix secondes morceaux, IIRC et énumérant les URL pour ces morceaux dans un fichier de playlist à une URL spécifique. P>
Cependant, il n'y a aucune garantie que la liste de lecture ne changera pas. strong> avec HLS, la liste de lecture peut potentiellement changer toutes les dix secondes, en supprimant les segments les plus anciens (ou non) et en ajoutant de nouveaux segments à la fin. . De cette manière, HLS soutient le streaming des émissions en direct qui n'ont pas de fin. Dans ce contexte, la notion de téléchargement ayant une taille est absurde. P>
Pour aggraver les choses, 2464 est probablement la taille du fichier de playlist et non de la taille du premier atout, c'est-à-dire qu'il ne vous indique que si ce Je soupçonne que pour obtenir les informations que vous souhaitez, même pour un actif non live, vous devrez probablement aller chercher la liste de lecture, l'analyser vous-même et effectuer une série de demandes de tête pour chacune des URL du segment multimédia énumérés dans ça. p>
Heureusement, la spécification HLS est une norme accessible au public, donc si vous souhaitez descendre ce chemin, vous pouvez lire des RFC pour en savoir plus sur la structure du fichier de playlist. Et Afaik, la liste de lecture elle-même n'est cryptée avec aucun DRM ou quoi que ce soit, il devrait donc être possible de le faire, même si la partie de déchiffrement réelle de l'API n'est pas publique (AFAIK). P> de Sous-classe Didreceiveresponse: Code> Fonctionne, auquel cas pourriez-vous obtenir la longueur de chaque segment en lisant la longueur de contenu code> de la longueur de contenu code> au fur et à mesure qu'elle l'attrape. Et même si cela fonctionne normalement, vous ne pouvez probablement toujours pas obtenir le nombre de segments de cette API (et rien ne garantit que tous les segments seront précisément la même longueur, bien qu'ils soient assez proches). P >
Les flux HLS sont en réalité une collection de fichiers appelés manifestes et flux de transport. Les manifestés contiennent généralement une liste de texte des sous-manifestes (chacune correspondant à un diasseur différent), et ces sous-manifestes contiennent une liste de flux de transport contenant les données de film réelles. P>
Dans votre code, lorsque vous téléchargez l'URL HLS, vous téléchargez réellement uniquement le Master Manifest, et c'est généralement quelques milliers d'octets. Si vous souhaitez copier tout le flux, vous devez analyser toutes les manifestes, reproduire la structure de dossiers du flux d'origine et saisir les segments de transport également (ceux-ci sont généralement dans des segments de 10 secondes, il peut donc y avoir des centaines de ces). Vous devrez peut-être réécrire les URL si les manifestes sont également spécifiés avec des URL absolues. P>
Pour calculer la taille de chaque flux, vous pouvez multiplier le débit binaire (répertorié dans le manifeste maître) de la durée du flux; Cela pourrait être une bonne estimation suffisante à des fins de téléchargement. P>
Une meilleure réponse ici, car vous utilisez l'AVASSetDownloadTâche dans le contexte de Fairplay hors ligne, vous devez mettre en œuvre l'avasquetTownloadDelegate. L'une des méthodes de ce protocole vous donne les progrès que vous recherchez: P>
> Urlsession: AssetDownloDTask: DidloadTimeMerange: TigeMerangesLoaded: TimerangeExpectedtoLoad: p>
voici WWDC 2016 Session 504 montrant ce délégué dans action. p>
Il y a beaucoup de détails liés à la lecture hors ligne avec Fairplay, c'est donc une bonne idée de passer par cette vidéo très soigneusement. P>
Ceci est mon code C # / XAMARIN pour calculer la taille de téléchargement finale. Il est probablement imparfait, en particulier avec les nouveaux codecs pris en charge avec IOS11, mais vous devriez avoir l'idée.
private static async Task<long> GetFullVideoBitrate(string manifestUrl) { string bandwidthPattern = "#EXT-X-STREAM-INF:.*(BANDWIDTH=(?<bitrate>\\d+)).*"; string videoPattern = "^" + bandwidthPattern + "(RESOLUTION=(?<width>\\d+)x(?<height>\\d+)).*CODECS=\".*avc1.*\".*$"; string audioPattern = "^(?!.*RESOLUTION)" + bandwidthPattern + "CODECS=\".*mp4a.*\".*$"; HttpClient manifestClient = new HttpClient(); Regex videoInfoRegex = new Regex(videoPattern, RegexOptions.Multiline); Regex audioInfoRegex = new Regex(audioPattern, RegexOptions.Multiline); string manifestData = await manifestClient.GetStringAsync(manifestUrl); MatchCollection videoMatches = videoInfoRegex.Matches(manifestData); MatchCollection audioMatches = audioInfoRegex.Matches(manifestData); List<long> videoBitrates = new List<long>(); List<long> audioBitrates = new List<long>(); foreach (Match match in videoMatches) { long bitrate; if (long.TryParse(match.Groups["bitrate"] .Value, out bitrate)) { videoBitrates.Add(bitrate); } } foreach (Match match in audioMatches) { long bitrate; if (long.TryParse(match.Groups["bitrate"] .Value, out bitrate)) { audioBitrates.Add(bitrate); } } if (videoBitrates.Any() && audioBitrates.Any()) { IEnumerable<long> availableBitrate = videoBitrates.Where(b => b >= Settings.VideoQuality.ToBitRate()); long videoBitrateSelected = availableBitrate.Any() ? availableBitrate.First() : videoBitrates.Max(); long totalAudioBitrate = audioBitrates.Sum(); return videoBitrateSelected + totalAudioBitrate; } return 0; }
Avez-vous déjà résolu ce @antoine
Vérifiez également: développeur.apple.com/forums/thread/74130