Konzept Streamingmessung

Konzeption der Messung

Um einen Streaming-Inhalt messen zu können, wird ein Sensor beim Client benötigt, der misst welche Bereiche auf einen Stream vom User abgespielt werden. 
Diese Bereiche können durch Zeitintervalle in Sekunden definiert werden - vorausgesetzt der entsprechende Player oder die abspielende Instanz kann über eine Methode die aktuelle Position in Sekunden auf dem Stream liefern. Durch regelmäßiges Auslesen der aktuellen Position ist es somit möglich alle Aktionen auf einen Stream zu tracken. Spulvorgänge können identifiziert werden, wenn es unerwartete Sprünge beim Auslesen der Position gibt und Stop- bzw. Pause-Aktionen werden dadurch identifiziert, dass sich die aktuelle Position nicht mehr verändert.

Das folgende Diagramm zeigt die Architektur der API:

Die Einfachheit der API und des Konzeptes führt zu den folgenden Features:

  • Es lässt sich jeder beliebige Streaming-Content messen, der in der Lage ist, die aktuelle Position in Sekunden auf dem Stream zu liefern.
  • Die API lässt sich sehr leicht auf andere Programmiersprachen portieren.
  • Es wird technologieübergreifend das gleiche Verfahren verwendet, wodurch gleicher Streaming-Content auch auf unterschiedlichen Frameworks bzw. Technologien vergleichbar wird.

Grundsätzliche Benutzung der API (programmiersprachenunabhängig)

In den folgenden Erläuterungen wird die Javascript-Syntax verwendet. Die Vorgehensweise ist aber bei jeder verwendeten Programmiersprache im Grundsatz die gleiche.

// 1. Instantiiere das API-Objekt
var sensors = new SpringStreams("angebotsname");

// 2. Ein Description-Objekt für den Streaming-Content anlegen.
var desc = {
   "stream":"videos/mystream",
   "duration":600, // in Sekunden
   "sx":video.width,
   "sy":video.height
};

// 3. Das Content-Objekt zur Verfügung stellen
var content = ...; // Irgendein Objekt, dass in der Lage ist die aktuelle Position in Sekunden zu liefern

// 4. Den Content mit dem Description-Objekt auf dem Sensor registieren.
var stream = sensors.track(content, desc);

Erläuterungen:

zu 1: Instantiiere das API-Objekt

  • (warning)Der korrekte Angebotsname muß angegeben werden. Dieser Angebotsname wird vom Betreiber der Streaming-Lösung vergeben.

    var sensors = new SpringStreams("angebotsname");
    
  • Eine Instanz des Objektes SpringStreams ist im Framework nur einmalig anzulegen. Ab da können ein oder mehrere Streams der track-Methode zur Messung übergeben werden.

zu 2: Ein Description-Objekt für den Streaming-Content anlegen

  • Im Description-Objekt muss mindestens der Name des Streams angegeben werden.

    	
    var desc = {
       "stream":"videos/mystream",
       "duration":600 // in Sekunden
    };
    

     

    Mit dem Description-Objekt übergibt man der API nähere Informationen zum Streaming-Content. Hierbei sind folgende Variablen erlaubt bzw. werden vom Messsystem verstanden.

    Variable

    Optional

    Beschreibung

    stream

    Nein

    Der Names des Streams, der optimalerweise als Hierarchie übergeben wird. z.B. videos/nachrichten/lokal/streamname

    duration

    Nein

    Die Duration muss angegeben werden. Im Falle von Livestreams kann sie weggelassen werden oder wird mit dem Wert 0 geliefert

    ct

    Ja

    Hier kann ein beliebiger Wert verwendet werden, der ein Aussage über den ContentType macht.
    Beispielweise könnte der Wert ad angegeben werden, um den Stream als Werbung zu markieren.

    sx

    Ja

    Die Breite (width) des Streamfensters - sofern es sich um einen Film handelt.
    Im Falle eines Radiostreams, können die Variablen weggelassen werden oder werden mit dem Wert 0 geliefert.

    sy

    Ja

    Die Höhe (height) des Streamfensters - sofern es sich um einen Film handelt.
    Im Falle eines Radiostreams, können die Variablen weggelassen werden oder werden mit dem Wert 0 geliefert.

zu 3: Das Content-Objekt zur Verfügung stellen

  • Die einzige Anforderung an dieses Objekt seitens der Streaming-API ist, dass es die Möglichkeit bietet die aktuelle Position auf einem Stream in Sekunden auslesen zu können. Je nach Programmiersprache sind hier ebenfalls softwaretechnische Lösungen denkbar, wie die Implementierung von Interfaces oder die Implementierung von Adapterklassen.

    var content = ...; 
    

zu 4: Den Content mit dem Description-Objekt auf dem Sensor registieren.

  • Im nächsten Schritt der Streaming-Content und das Description-Objekt der API-Methode track übergeben werden. Ab diesem Zeitpunkt wird die aktuelle Position auf dem Stream getracked. An dieser Stelle ist es möglich mehrere Streams parallel zu messen, in dem jeder zusätzlich Streaming-Content mit dem zugehörigen Description-Objekt ebenfalls der track-Methode übergeben wird.

    var stream = sensors.track(content, desc);
    
  • Die Messung einzelner Streams kann jederzeit durch den Aufruf der Methode Stream.stop() abgebrochen werden.

Interne Funktionsbeschreibung der API

Nachdem der Streaming-Content der track-Methode mit dem zugehörigen Description-Objekt übergeben worden ist, wird intern alle 200ms die aktuelle Position auf dem Streaming-Content abgefragt. Intern werden alle Intervalle gesammelt, die vom User auf dem Stream betrachtet worden sind. Bei konstanter Sichtung ist dies ein Intervall. Sobald festgestellt wird, dass sich die aktuelle Position um mehr als 1 Sekunde um die zu erwarteten Position verändert, kann von einem Start-, Stop- oder Spulereignis oder auch einem Buffering ausgegangen werden. In diesem Fall wird ein neues Sichtungsintervall angelegt.

Ein Intervall ist definiert als:

[start, end, timestamp]

start

Die Startsekunde auf dem Stream

end

Die Endsekunde auf dem Stream

timestamp

Der clientseitige Zeitpunkt beim Erstellen des Intervalls

Alle gesammelten Nutzungsinformationen der gemessenen Streams werden in einem HTTP-Request codiert und regelmäßig dem Messsystem übermittelt. Hierbei gelten folgende Regeln:

  • bei jeder Interaktion (Start-, Stop- oder Spulvorgänge oder Bufferingphasen) wird sofort ein Update gesendet.
  • bei konstanter Sichtung mindestens alle 20 Sekunden.

Datentransport

// System-Objekt
[{"sx":1280,
"sy":1024,
"pl":"FlashPlugin",
"plv":"WIN 10,0,45,2"
},
// Nutzungsinformationen
{"stream":"spring/teststream", 
     "dur":"600", 
     "sx":"400",
     "sy":"300",
     "uid":"267fgut",
      "vt":356, 
     "pst":[[0,0,"kzog7e"],[22,378,"kzog7e"]]
}]

Beim Datentransport werden zwei Objekte übermittelt:

  • Das System-Objekt, dass Informationen enthält wie Bildschirmauflösung, Playername und Playerversion.

    Variable

    Optional?

    Beschreibung

    sx

    Nein

    Die Breite des Bildschirms in Pixel (width)

    sy

    Nein

    Die Höhe des Bildschirms in Pixel (height)

    pl

    Nein

    Der Name des Players

    plv

    Nein

    Die Playerversion

  • Die Nutzungsinformationen einer Messung

    Variable

    Optional?

    Beschreibung

    plv

    Nein

    Die Playerversion

    stream

    Nein

    Der Name des Streams

    dur,duration

    Nein, wenn es kein Livestream ist.

    Die Länge des Streams in Sekunden

    sx

    Nein

    Die Breite des Streamfensters in Pixel (width) oder den Wert 0

    sy

    Nein

    Die Höhe des Streamfensters in Pixel (height) oder den Wert 0

    uid

    Nein

    Die Unique Id des Nutzungsvorganges

    vt

    Nein

    Die Viewtime in Sekunden. Die Viewtime wird gemessen ab dem Aufruf der Methode SpringStreams.track(...)

    pst

    Nein

    Die Playstates. Die Liste mit Sichtungsintervallen auf dem Stream.

Die Beschreibung Codierung des HTTP-Request ist nicht Bestandteil dieser Dokumentation. Der Request ist aber so gestaltet, dass bei Debugging-Tätigkeiten die Variablen trotzdem eindeutig identifizierbar sind.