it-swarm.com.de

Ist es möglich, HLS-Segmente mit AVPlayer zwischenzuspeichern?

Wurzelproblem

Unser Video puffert viel, wenn Sie in iOS suchen. Es puffert einiges mehr als unser Web-Player, der Kopien der bereits betrachteten Segmente im temporären Speicher speichert.

Gewünschte Lösung

Zwischenspeichern der Videosegmente lokal auf der Festplatte des Geräts. Es ist in Ordnung, eine einzelne Qualität zwischenzuspeichern und immer wieder abzuspielen.

Blocker

In AVFoundation/AVPlayer kann kein Caching durchgeführt werden.

Was wir ausprobiert haben

2 Möglichkeiten zum Abfangen von Netzwerkanforderungen mit AVPlayer.

  1. An AVAssetResourceLoaderDelegate anpassen und das manuelle Laden der Medien handhaben

Funktioniert nicht mit HLS. Sie können die m3u8-Dateien laden, indem Sie AVAssetResourceLoaderDelegate implementieren, mit dem Sie die Authentifizierung übergeben oder die Antwort entschlüsseln können. Die .ts-Dateien können jedoch nicht geladen werden. Hier ist der Code, den wir versucht haben: https://Gist.github.com/nathanhillyer/84e46152d7c4c88183b6

  1. Implementieren eines NSURL-Protokolls zum Erfassen von Anforderungen für .ts-Dateien.

AVURLAsset vermeidet es tatsächlich, abgefangen zu werden. Irgendwie werden die Netzwerkanforderungen einfach nicht erfasst. (Keine Ahnung warum)

26
Nathan Hillyer

Beginnen wir mit einer wirklich guten Nachricht - iOS 10 und höher - gibt dies aus der Box heraus. Bald keine Notwendigkeit mehr für Hacks. Weitere Informationen finden Sie in der folgenden WWDC16-Sitzung über Neuigkeiten im HTTP-Live-Streaming: https://developer.Apple.com/videos/play/wwdc2016/504/

Nun zurück zum aktuellen Stand der Dinge - iOS 9 und niedriger: Mit AVPlayer, nein. Sie können HLS-Segmente jedoch über einen lokalen HTTP-Server zwischenspeichern und den lokalen Stream mit AVPlayer abspielen.

AVPlayer und AVAsset enthalten nicht die erforderlichen Informationen, wenn Sie mit der HLS-Wiedergabe umgehen (sie verhält sich anders als eine statische MP4-Datei).

TL; DR - Sie müssen HTTP-Anforderungen verwenden, um die Segmente abzurufen und sie über einen lokalen HTTP-Server bereitzustellen.

Einige Unternehmen, einschließlich derjenigen, für die ich arbeite, verwenden diese Strategie.

Verwenden Sie eine Verbindung, um die Segmente in der gewünschten Qualität herunterzuladen, erstellen Sie das Manifest neu und glätten Sie es in ein Verzeichnis und eine Qualität. Verwenden Sie anschließend einen lokalen http-Server in der App, um es für AVPlayer bereitzustellen (AVPlayer kann nur HLS-Streams abspielen, die über das System laufen.) HTTP - nicht aus Dateianlagen).

Es gibt Edge-Fälle, z. B. Pufferung, wenn Sie in einem Durchlauf spielen und herunterladen möchten, das m3u8-Manifest korrekt neu erstellen und verschiedene AVPlayer-Zustände mit Festplattenlesen.

Ich habe dies aus erster Hand erfahren, sowohl mit einem solchen System seit 5 Jahren in Produktion als auch mit anderen Videoprodukten im App Store, die dieselbe Lösung verwenden - insgesamt für viele Benutzer.

Dies ist auch die beste Lösung, die wir für Android gefunden haben.

9
Liviu R

Tatsächlich können wir AVPlayer dazu bringen, ein Video aus dem Netzwerk abzuspielen. Wenn Sie die heruntergeladenen Daten jedoch zwischenspeichern möchten, um sie lokal wiederzugeben, ist dies mit AVPlayer jetzt unmöglich. 

Glücklicherweise gibt es das API "resourceLoader" in AVURLAsset, mit dem Sie kontrollierten Zugriff auf eine Remote-Audiodatei für AVPlayer bereitstellen können. Dies funktioniert wie ein lokaler HTTP-Proxy, jedoch ohne all die Schwierigkeiten.

Weitere Informationen finden Sie unter https://Gist.github.com/anonymous/83a93746d1ea52e9d23f

2
HDT

About NSURLProtocol: Soweit ich verstanden habe, werden eigene Anfragen gestellt, sodass Ihre benutzerdefinierten Tags/Felder/Markierungen entfernt werden.

Ich habe es anders gemacht: Segmentanfragen auf ein benutzerdefiniertes URL-Schema umleiten und das Schema in der canInitWithRequest-Methode des Protokolls überprüfen.

Auf diese Weise funktioniert es gut. (verbrachte eine Woche, um ganze hls-Verarbeitungssache herauszufinden ...)

0
norlin