Windows Azure

Die Demokratisierung von Videoinhalten mit Windows Azure Media Services

Bruno Terkaly
Ricardo Villalobos

Einer der unverkennbaren Trends, der in den kommenden Jahren zu einem erstaunlichen Wachstum führen wird, ist das Streaming von Videoinhalten. Laut dem Cisco Visual Networking Index (VNI) 2011 werden sich die diesbezüglichen Internetaktivitäten im Jahr 2015 vervierfacht haben. Dieses Phänomen wird durch verschiedene Faktoren bedingt, unter anderem durch: sinkende Kosten für Speicherplatz, skalierbare Cloud Computing- und Speicherressourcen, Netzwerke mit großer Bandbreite und schließlich durch eine Vielzahl von videofähigen Geräten wie Tablets oder Smartphone-Anwendungen. Das Erzeugen, Verschlüssen und Verteilen von Videos war noch nie so praktisch und günstig, sogar für Hobbyentwickler.

Es findet derzeit eine größere Auseinandersetzung in Bezug auf die Frage statt, ob Videoinhalte mit einem Copyright versehen oder durch ein solches geschützt sein sollten. Viele von uns haben den tiefgreifenden und erstaunlichen Wandel der Musikindustrie miterlebt, die zunehmend weniger in die großen Plattenfirmen sondern vielmehr in die kleinen internetbasierten Medienunternehmen investiert. Die größeren Satelliten- und Kabelfernsehenanbieter setzen sich mit dem zunehmenden Wachstum von Video on Demand auseinander, sowie dem Gebrauch weiterer Internetkanäle zur Verteilung, unter anderem mit YouTube, Ustream und justin.tv, um nur ein paar zu nennen.

Microsoft bleibt jedoch auch nicht untätig, während all dies passiert. Im Mai 2012 brachte das Softwareunternehmen neue Mediendienstfunktionen in Windows Azure heraus, die die Demokratisierung, Verwaltung und massenhafte Verteilung von Video unterstützen. Windows Azure Media Services (im Folgenden kurz "Media Services" genannt) unterstützt unterschiedliche Gerätetypen, von Smartphones über Tablets bis zu High-End Video Workstations. Diese Funktionspalette—zuvor unter dem Code-Namen "Nimbus" bekannt—gestattet es individuellen Entwicklern und Unternehmen, cloud-basierte Medienlösungen für das Aufnehmen, Verarbeiten, Verwalten und Ausliefern von Medieninhalten zu erstellen.

Problemlösungen

Diese neuen Media Services Funktionen bieten eine automatisierte, standardisierte und kosteneffektive Lösung für den Bereich des Medienmanagements, der Barrieren und komplexe Eigenschaften durch das Angebot von drei Hauptfunktionen rasant abbaut:

  1. Automatische Skalierbarkeit durch Nutzung der Vorteile von Cloud Computing, darin eingeschlossen ist die Erhöhung von Kapazitäten auf Nachfrage, gemäß den Bedürfnissen des Users.
  2. Ein vielfältig programmierbares Interface, basierend auf einer RESTful API, zusammen mit der Microsoft .NET Framework Client Library, die es Entwicklern gestattet, Workflows leicht zu erzeugen, zu verwalten und zu unterhalten.
  3. Ein Ökosystem aus Verbundpartnern, das Komponenten unterschiedlicher Firmen einschließt, die zu jedem Zeitpunkt an die zuvor vorgestellten Workflows angeschlossen werden können.

Diese einsichtigen Media Services lösen eine Vielzahl von Problemen, mit denen Unternehmen konfrontiert sind, und zwar in den Bereichen des Erzeugens, Verwaltens und Verteilens von Inhalten. Als erstes sind die Kosten zu nennen, denn das Erstellen eines Video-fähigen Datencenters ist teuer. Die Anschaffung von Servern, Encodern, Netzwerkausstattung und entsprechender Software stellte eine große Einstiegshürde dar. Das zweite Problem, das Media Services lösen, ist das weitverbreitete Thema angepasster "individueller" Workflows. Viele Unternehmen im Mediensektor haben ihre eigenen proprietären Geschäftsverträge entwickelt, sodass es schwierig ist, unterschiedliche Dienste für verschiedene Käufer zu koordinieren, die auf unterschiedliche Formate und Protokolle zurückgreifen. Die Standardisierung von Video verbessert die Koordination und Produktivität, wenn es mehrere Teilhaber gibt, die an der Entstehung und Verwaltung von Inhalten beteiligt werden.

Offene Standards

Media Services basieren auf offenen Standards, was bedeutet, dass sie von nahezu jedem Client eingesetzt werden, einschließlich Java, PHP, Objective-C und jQuery, um nur ein paar zu nennen. Der vollständige Funktionsumfang ist durch eine gewöhnliche RESTful API erhältlich; diese verwendet das Open Data Protocol (OData), mit dem flexible Suchfähigkeiten unterstützt werden. Es gibt ebenfalls eine .NET C# SDK—entstanden auf Basis der RESTful API—die den Zugang zum Framework für Entwickler, die diese Sprache verwenden, erleichtert und vereinfacht (siehe Abbildung 1).

Abbildung 1 Zwei Ansätze für den Gebrauch von Windows Azure Media Services

REST/OData API

Entwickler erhalten eine Zugang zu den Media Services Komponenten über den Representational State Transfer (REST) API layer. Da REST auf HTTP basiert, kann es praktisch von überall durch das breite Angebot von Sprachen, Anwendungen und Plattformen verwendet werden. Kurz: Die REST API ist das universelle, öffentliche und programmierbare Interface, mit dem man Zugang zu den Media Services über das Web erhalten kann.

REST ist ein strategischer Architekturentwurf, mit dem vernetzte Client-Server Anwendungen basierend auf offenen Standards erstellt werden können. REST stellt ein statusfreies, zwischenspeicherbares und standardisiertes Protokoll (HTTP) zur Verfügung, mit dem Informationen zwischen den vernetzten Rechnern gesendet werden können.

.NET API

Selbstverständlich gibt es auch einen .NET Client SDK (der die REST API-Anrufe zusammenfasst und den Aufbauprozess eines .NET-based Media Services Client-Anwendung vereinfacht).

Dieser Artikel wird den Fokus auf die .NET API legen. Weitere Artikel werden die REST-basierten Ansätze behandeln.

Nutzung der Media Services (API)

Um besser die Vorteile der Media Services Funktionen von Windows Azure verstehen zu können, legt dieser Artikel den Fokus auf ein spezielles Fallbeispiel. Denken Sie an ein Homevideo, das unter verschiedenen Familienmitgliedern geteilt werden soll bzw. unter Freunden, die alle eine breite Palette mobiler Anwendungen nutzen. Abbildung 2 zeigt den globalen Workflow, der erforderlich ist, um individuell erstellte Videoinhalte auf der ganzen Welt zu verteilen.

Overall Workflow Required to Distribute Video ContentAbbildung 2 Notwendigkeit eines globalen Workflow zur Verteilung von Videoinhalte.

Voraussetzungen

Hochladen und Kodieren von Inhalt

Beginnen wir mit einer grundlegenden Aufgabe beim Verteilen von Videoinhalten. Der Code in Abbildung 3 erfüllt zwei wichtige Ziele, der/die sich jeder setzt, der/die mit Video arbeitet. Als erstes wird der ursprüngliche Inhalt hochgeladen, damit er verarbeitet werden kann. Zweitens wird der Inhalt auf eine Weise kodiert, dass er von unterschiedlichen Geräten abgerufen werden kann. Es gibt sehr viele Videoformate, wie z. B. MPEG, MPEG-2 (QuickTime), RealMedia, H.264 (MP4) und Windows Media, um nur ein paar zu nennen—sogar YouTube verwendet ein eigenes Codierformat. Codierformate sind nicht gleich. Vielen von diesen sollen klein sein, damit sie schnelle Web-Downloads und Renderings ermöglichen. Andere, wie der H.264, legen eine Wert auf Qualität ohne die Videogröße zu beachten.

Abbildung 3 Hochladen und Durchführen einer Codierung

static void Main(string[] args)
{
  // Part 1 - Connect to Media Services
  //          Setup upload progress event
  //          Upload a video to encode
  CloudMediaContext mediaContext =
    new CloudMediaContext("[ ACCOUNT NAME ]","[ ACCOUNT KEY ]");
  mediaContext.Assets.OnUploadProgress += Assets_OnUploadProgress;
  var asset = mediaContext.Assets.Create(    
    @"C:\windows\Performance\WinSat\winsat.wmv");
  // Part 2 - Create a task, specify encoding details
  Console.Clear();
  IJob job = mediaContext.Jobs.CreateJob("Sample Job");
  var expressionEncoder = mediaContext.MediaProcessors.Where(
    mp => mp.Name == "Expression Encoder").Single();
  var task = job.Tasks.Add(
    mediaProcessor: expressionEncoder,
    configuration: "H.264 HD 720p VBR");
  task.Inputs.Add(asset);
  task.Outputs.Add("Sample Task Output Asset");
  // Part 3 - Submit the encoding job to begin processing
  while (job.State != JobState.Finished)
  {
    job = mediaContext.Jobs.Refresh(job.Id);
    Console.SetCursorPosition(0, 0);
    Console.WriteLine("Job Name: " + job.Name);
    Console.WriteLine("Job ID: " + job.Id);
    Console.WriteLine();
    Console.WriteLine("Job State: {0,-20}", job.State);
    Console.WriteLine("Task Progress: {0:0.00}%  ",
      job.Tasks.Single().Progress);
    Thread.Sleep(500);
  }
  Console.WriteLine();
  Console.WriteLine("Job Complete!");
  Console.ReadLine();
}
// Part 4 - Display completion progress (See Part 1, where the callback was set up)
static void Assets_OnUploadProgress(object sender, 
  UploadProgressEventArgs e)
{
  Console.WriteLine(e.Progress);
}

Abbildung 4 erläutert den Code aus Abbildung 3 entsprechend der Abschnitte Teil 1 bis Teil 4.

Abbildung 4 Kommentare für den Quellcode in Abbildung 3 (Siehe Teile 1-4)

Teil 1

Dieser Code verfolgt drei Hauptziele:

   1. Erzeugen eines CloudMediaContext-Objekts, das die Überprüfung von Anmeldedaten zur Authentifizierung bereitstellt. Dieser Kontext wird für den gesamten restlichen Code verwendet sowie für das Verwalten und Verarbeiten der Media Assets.

  2. Set up des Rückruf Codes mit Namen Assets_OnUploadProgress, der dazu verwendet wird, um dem Nutzer eine Rückmeldung über die Vervollständigung (in Prozent) des Upload-Prozesses zu geben.

  3. Lädt die Original-Videodatei hoch (winsat.wmv), sodass diese verarbeitet werden kann.

Anmerkung: Die hier verwendete Terminologie ist "Asset" (Bestand), der sich in diesem Fall auf das Originalvideo bezieht.

Teil 2 Dieser Code setzt es sich zum Ziel, eine Aufgabe zu erzeugen, die aus einem Medienprozessor, einer Konfiguration sowie einem In- und Output besteht. Beachte: Die Kodierung erfolgt mit den Konfigurationseinstellungen “H.264 HD 720p VBR.” Wir verwenden Microsoft Expression Encoder. Zusätzliche Medienprozessoren werden als zusätzliche Partner der Medienindustrie verfügbar sein.
Teil 3 Hier beginnt der eigentliche Verarbeitungsprozess. Sie können sich diesen Job als einen Workflow mit einer Reihe von Aufgaben vorstellen. Aufgaben können nacheinander oder parallel ablaufen.
Teil 4 Dieser Code ist einfach der Rückruf, der automatisch während des Hochladens des Videos erstellt wird. Er wird üblicherweise dazu verwendet, um eine Rückmeldung über die Vollständigkeit des Upload Prozesses (in %) zu geben.

Inhalte verwalten

Eine Herausforderung beim Verwalten von Videobasierten Projekten ist es, sämtliche Bestände, Jobs und Aufgaben mitzuprotokollieren. An dem Erstellen von Inhalt sind oftmals Dutzende Dateien im Original beteiligt, weiterhin entstehen etwa Hundert weitere als kodierter Output. Das Aufzeichnen und Lokalisieren eines bestimmten Objektes, das zusätzlich weiterverarbeitet werden soll, kann in eine schwierige Aufgabe ausarten. Die Automatisierung dieses Prozesses mittels Standard-Schnittstellen verändert in diesem Bereich alles. Die Verwaltungsschnittstelle in Media Services öffnet die Tür zu umfassenderen Kooperationsprojekten zwischen allen Beteiligen und ermöglicht es Langzeit-Workflows effizienter zu gestalten. Das CloudMediaContext-Objekt stellt eine intuitive Schnittstelle zur Verfügung, mit der jedes einzelne Element, das mit dem Workflow verbunden ist, lokalisiert und als eine Serie von Sammlungen organisiert wird, die mit Hilfe der üblichen Libraries, wie LINQ, durchsucht werden können.

Der Code in Abbildung 5 zeigt die Möglichkeit, die Bestände in einer Schleife zu durchsuchen und die Informationen über Videofilme, ebenso wie die über andere Dateitypen, z. B. Bilder, anzuzeigen. Beachte: Das Kontext-Objekt besitzt eine Kollektion von Assets und ein Asset-Objekt besitzt eine Kollektion von Datenobjekten.

Abbildung 5 Verschiedene assoziierte Bestände innerhalb eines Accounts

static void Main(string[] args)
{
  // Part 1 - Connect to Media Services
  //          Loop through assets, displaying file information
  CloudMediaContext mediaContext = 
    new CloudMediaContext("[ ACCOUNT NAME ]",
    "[ ACCOUNT KEY ]");
  Console.WriteLine("ASSET INFORMATION");
  foreach (IAsset asset in mediaContext.Assets)
  {
    // Display the collection of assets.
    Console.WriteLine("Asset ID: " + asset.Id);
    Console.WriteLine("Name: " + asset.Name);
    // Display the files associated with each asset.
    foreach (IFileInfo fileItem in asset.Files)
    {
      Console.WriteLine("File Name: " + fileItem.Name);
      Console.WriteLine("File Create Date: " + fileItem.Created);
      Console.WriteLine("File Size: " + fileItem.ContentFileSize);
    }
  }
}

Der Code in Abbildung 6 zeigt die Möglichkeit, eine LINQ Query auszuführen um spezifische Bestände zu durchsuchen. Da theoretisch Tausende potenzieller Dateien verarbeitet werden können, stellt eine entsprechende Suchfunktion eine große Hilfe dar.

Abbildung 6 Die erstaunliche Einfachheit von LINQ bei der Durchsuchung von Beständen mit einem Name oder einer ID

// Returns an asset, given an asset name
static IAsset GetAssetNameFromContext(
  CloudMediaContext mediaContext, string assetName)
{
  IAsset asset = mediaContext.Assets.Where(a => a.Name ==
    assetName).FirstOrDefault();
  if (asset != null)
    return asset;
  else
    return null;
}
// Returns an asset, given an asset Id
static IAsset GetAssetIdFromContext(
  CloudMediaContext mediaContext, string assetId)
{
  IAsset asset = mediaContext.Assets.Where(a => a.Id ==
    assetId).FirstOrDefault();
  if (asset != null)
    return asset;
  else
    return null;
}

Zugangsrichtlinien

Eine Kontrolle darüber, welche Nutzer bestimmte Bestände sehen und auf diese Zugreifen können, ist als Funktionalität in das Framework der Media Services eingebaut. Um Sicherheitsrechte zu kontrollieren, können die Besitzer der Inhalte Zugangsrichtlinien spezifizieren und darin Details zur Schreib- oder Leseerlaubnis angeben, aber auch festlegen, wie lange der Zugang verfügbar sein soll. Hiermit wird den Nutzern viel Macht zuteil, insbesondere im Hinblick auf das Austauschen von Workflows mit anderen Teilnehmern im Netzwerk.

Dieser Abschnitt zeigt, wie man grundlegende Aufgaben mit den Zugangsrechten ausführt, wie z. B. das Erzeugen und Zuweisen zu einem Bestand, ebenso wie das Auflisten derer, die bereits erzeugt wurden. Der Code in Abbildung 7 verfolgt das Ziel eine "Lese"-Richtlinie zu erstellen, die es gestatten soll, das man nur einen 30-minütigen Zugang zu einem Video erhält. Der Code beginnt mit dem Hochladen von winsat.wmv. Von diesem Punkt an wird eine neue Zugangsrichtlinie erzeugt, den sogenannten CanReadFor 30Minutes, der festlegt, dass eine Datei während des Hochladens nur für 30 Minuten gelesen werden kann. Im nächsten Schritt wird die Zugangsrichtlinie mit der hochgeladenen Videodatei verlinkt.

Abbildung 7 Zeitweiliges Bereitstellen von Videomaterial für den Download

static void Main(string[] args)
{
  // Part 1 - Specify an asset to upload
  //          Connect to Media Services
  string inputFilePath =
    @"C:\windows\Performance\WinSat\winsat.wmv";
  CloudMediaContext mediaContext =
    new CloudMediaContext("[ ACCOUNT NAME ]", "[ ACCOUNT KEY ]");
  // Part 2 - Upload an asset
  //          Create a policy for the asset
  //          Link access policy to asset
  IAsset asset = mediaContext.Assets.Create(inputFilePath);
  // Because this is a single-file asset, get the name of first file.
  string fileName = asset.Files[0].Name;
  IAccessPolicy readPolicy = mediaContext.AccessPolicies.Create(
    "CanReadFor30Minutes",
    TimeSpan.FromMinutes(30),
    AccessPermissions.Read);
  // Part 3 - Define a locator based on the read policy
  //          and expiration date
  //          Print the path for the locator you created
  //          Get the locator path Uri
  //          Build the full path to the file associated
  //          with the locator.
  ILocator locator = mediaContext.Locators.CreateSasLocator(
    asset, readPolicy);
  Console.WriteLine("Locator path: " + locator.Path);
  var uriBuilder = new UriBuilder(locator.Path);
  uriBuilder.Path += Path.AltDirectorySeparatorChar + fileName;
  Uri fullUrl = uriBuilder.Uri;
  // Part 4 - Print the full path to the file
  Console.WriteLine("Full URL to file: " + fullUrl);
}

Ein Locator ist eine persistente Kopie der Richtliniendatei, dessen Speicherort als URI ausgedrückt wird. Der Lokator gewährt unter den in der Richtlinie definierten Bedingungen Zugang zu der Ressource. Um innerhalb der 30-Minuten-Frist Zugang zur Ressource (das hochgeladene Video) zu erhalten benötigen wir in diesem Fall die vollständige URL zusammen mit der Lokator-Datei. (Siehe fullUrl in Abbildung 7.)

Herunterladen verarbeiteter Bestände

Der Code in Abbildung 8 schließlich verfolgt das Ziel, den Inhalt des Videos an einem lokalen Ort zu speichern. In diesem Fall ist die Datei winsat.mp4 der H.264-kodierte Output, der vom Original-Video erzeugt und als winsat.wmv gespeichert wurde. Sie können die Funktion folgendermaßen aufrufen:

DownloadAsset("nb:cid:UUID:a0297fe4-7080-4393-b874-7ddf0f759c40", @"c:\temp");

Abbildung 8 Zwei Ansätze für den Gebrauch von Windows Azure Media Services

static void DownloadAsset(string assetId, 
    string outputMediaFilesFolder)
{
  // Part 1 - Connect to Media Services
  //          Get an existing asset based on assetId passed in.
  CloudMediaContext mediaContext =
    new CloudMediaContext("[ ACCOUNT NAME ]","[ ACCOUNT KEY ]");
  IAsset asset = mediaContext.Assets.Where(a => a.Id ==
    assetId).SingleOrDefault();
  // Part 2 - If the asset exists, download the first file in the asset
  //          Download to outputMediaFilesFolder      
  if (asset != null)
  {
    Console.WriteLine("Asset name: " + asset.Name);
    IFileInfo theFile = asset.Files.FirstOrDefault();
    // You could iterate through the asset.Files collection with a
    // foreach statement, and download all files for assets that
    // have multiple files.
    // Example: foreach(IFileInfo file in asset.Files)
    // Download the file to the specified local folder.
    if (theFile != null)
      theFile.DownloadToFile(Path.GetFullPath(outputMediaFilesFolder +
        Path.DirectorySeparatorChar + theFile.Name));
    else
      Console.WriteLine("No files available for this asset.");
  }
  else
  {
    Console.WriteLine("Asset not available.");
  }
}

The assetId of winsat.mp4 is nb:cid:UUID:a0297fe4-7080-4393-b874-7ddf0f759c40. Es ist ein einfacher Fall, die herunterladbare Ressource über ihre assetId zu suchen und einen Bestimmungsordner für den Download zu bestimmen.

Vorteile von Cloud Computing

Zusammengefasst lässt sich sagen, dass die Media Services Funktionen von Windows Azure den Kodierungs- und Verteilungsprozess von Videoinhalten im Hinblick auf diverse Geräte oder Webkanäle vereinfachen, die unterschiedliche Formate und Auflösungen erfordern. Dies wird durch die Vorteile des Cloud Computing ermöglicht, welches die Skalierbarkeit von Rechen- und Speicherleistung auf Basis eines variablen Gebrauchs beinhaltet. Zusammen mit einer umfangreichen REST-basierten API und .NET Klient-Library erleichtert dies den Prozess des Kreierens, Verwaltens und Erhaltens von Workflows, die mit Komponenten aus dem riesigen Ökosystem eines Partners angereichert sind.

Media Services machen einen gigantischen Schritt nach vorn in der Produktion, Verwaltung und der Bereitstellung von Videoinhalten, was Ihnen die Automatisierung einer großen Anzahl digitaler Ressourcen ermöglicht und diese an einem zentralen Ort oder sogar verteilten Orten lokalisiert. Da Video das phänomenale Wachstum im Web in den nächsten Jahren mitbestimmen wird, kommt Media Services genau zur richtigen Zeit.

Später werden wir die REST API im Detail kennenlernen ebenso wie einen Teil der Drittanbieter-Unterstützung für gelegentliche Kodierer und High-End Fähigkeiten.

Bruno Terkaly arbeitet als Entwicklungsexperte für Microsoft. Seine fundierten Kenntnisse basieren auf mehreren Jahren Erfahrung in der Programmierung in unterschiedlichsten Plattformen, Sprachen, Frameworks, SDKs, Bibliotheken und APIs. Er schreibt Code, Blogs und referiert live über die Erstellung von cloudbasierten Anwendungen, insbesondere mit der Windows Azure-Plattform.

Der erfahrene Softwarearchitekt Ricardo Villalobos entwirft und erstellt seit über 15 Jahren Anwendungen für Unternehmen in der Supply-Chain-Management-Branche. Er besitzt verschiedene Microsoft-Zertifizierungen sowie einen MBA in Supply Chain Management der University of Dallas. Im Jahr 2010 kam er als Entwicklungsexperte für Windows Azure zu Microsoft.

Unser Dank gilt den folgenden technischen Experten für die Durchsicht dieses Artikels: John Deutscher, Samuel Ng and Tim Teebken