Mein erster eigener Streaming-Server in F# – Teil 3

Willkommen im dritten und letzten Teil dieser Reihe. Im ersten Teil hatten wir unsere Entwicklungsumgebung vorbereitet, während wir im zweiten Teil in die Tasten gehauen haben und am Ende in der Lage waren, eine lokale Video Datei im Browser als auch in VLC zu streamen. Im heutigen Teil kümmern wir uns um das letzte noch fehlende Puzzlestück: die Anbindung an den Azure Blob Storage.

Azure: Vorbereitungen im Storage

Bevor wir uns in den Code begeben, bereiten wir den Teil in Azure vor. In diesem Block gilt es einen Storage Account in Azure anzulegen, falls noch keiner vorhanden ist. In Abbildung 1 sieht man wie es aussehen könnte, wenn man den Weg über das Azure Portal geht.

Streaming-Server - Anlegen eines Storage Account in Azure-26102017-Mobile-24KB, generic.de AG

Abbildung 1: Anlegen eines Storage Account in Azure

Als nächstes sollte man einen Container anlegen. Für meine Demonstrationszwecke habe ich ihn einfach demo genannt. Anschließend lade ich mein bisher benutztes Video in den Container hoch. Beide Schritte können über das Azure Portal erledigt werden, oder genauso gut über den Azure Storage Explorer. Zu guter Letzt könnt ihr auch gleich darauf achten, dass ihr den Connectionstring für euren Storage Account gefunden habt. Auch hier gilt, dass es über beide Wege geht. Den Connectionstring werdet ihr später noch brauchen.

Suave: Ein weiterer WebPart

Für das Streamen aus Azure legen wir einen weiteren WebPart an. Allerdings werden wir sehen, dass wir viel Code auslagern könnten, oder sogar eine weitere Abstraktion einführen können. Zuerst kümmern wir uns aber um die reine Anbindung an den Azure Storage.

Das gezeigte Stück Code dient dazu einen Stream zu öffnen, für einen gegebenen Container und Blob. Den Connectionstring habe ich als Konstante im Code hinterlegt. Wichtig ist hierbei zu wissen, dass es neben OpenReadAsync noch eine zweite Methode gibt einen Blob zu öffnen. Ich meine DownloadToStreamAsync. Mit der zweiten Methode hatte ich allerdings Probleme mit manchen Browsern, speziell mit Safari auf iOS. Leider hatte ich keine Zeit die Ursache herauszufinden. Mit OpenReadAsync hingegen gab es keine Probleme.

Im Grunde können wir nun openBlobStream als einfachen Ersatz für File.Open verwenden.

Wer den letzten Teil gelesen und noch im Kopf hat, dürfte erkennen, dass die einzige geänderte Zeile das Öffnen des Streams ist. Technisch interessant ist, dass wir zwar mit einem Stream arbeiten, aber im Hintergrund ebenfalls auch HTTP Range Header und Partial Content Antworten von Azure geliefert werden.

Codeseitig ist es noch weiter möglich, den Code zu verallgemeinern. Statt einem WebPart streamFile wäre eine Funktion streamStream denkbar, die als Argument einen Stream nimmt. Für mich war aber dieses Mal wichtiger, ein Ergebnis zu sehen.

Daher integrieren wir stattdessen unsere neue streamFile Funktion in unsere Routen und testen unser Endprodukt.

Um Namenskonflikte zu vermeiden, habe ich die beiden streamFile Funktionen in ihre eigenen Module gesteckt, Local und Azure. Zudem habe ich die alte Route mit der lokalen Datei ebenfalls drin gelassen. Wenn ich den Server nun starte und mit VLC unseren neuen Stream teste, sehe ich folgendes:

Streaming-Server - VLC mit dem Stream aus Azure-26102017-Mobile-2MB, generic.de AG

Abbildung 2: VLC mit dem Stream aus Azure

Erfolg, würde ich sagen.

Fazit

Das war der dritte und letzte Teil dieser Serie. Über die Serie hinweg haben wir uns F#, .NET Core, Suave, FParsec und Azure beschäftigt. Am Ende hatten wir einen Stream wiedergeben können. Die Implementierung ist dabei an vielen Stellen eine Abkürzung gegangen. Für den produktiven Einsatz ist der Code damit nicht geeignet, aber zur Demonstration einer Machbarkeit reicht es sicherlich aus. Da meine Motivation nur die Neugierde war, ist das als Ergebnis für mich okay.

Zuletzt will ich nochmal auf eine Alternative zur gezeigten Lösung zu sprechen kommen. Im vorigen Abschnitt hatte ich ja bereits angedeutet, dass der Azure Blob Storage auch die notwendigen Header/Antworten für HTTP Streaming unterstützt. Wer kein Problem damit hat, kann also genauso gut eine Shared Access Signature (SAS) für das Video generieren und dann mit dieser URL das Video genauso gut abspielen, im Browser als auch in VLC. Die Implementierung in Azure dürfte im Vergleich zur hier gezeigten vollständig sein.

Den Quellcode zur Serie gibt es hier.

Danke fürs Lesen.