Verwenden von Cue-Points und Metadaten

Flash Player 9 und höher, Adobe AIR 1.0 und höher

Mit den NetStream-Rückrufmethoden können Sie während der Videowiedergabe Cue-Point- und Metadatenereignisse erfassen und verarbeiten.

Verwenden von Cue-Points

In der folgenden Tabelle werden die Rückrufmethoden beschrieben, mit denen Sie in Flash Player und AIR F4V- und FLV-Cue-Points erfassen können.

Laufzeit

F4V

FLV

Flash Player 9/ AIR1.0

OnCuePoint

OnMetaData

Flash Player 10

OnCuePoint

OnMetaData

OnMetaData

OnXMPData

OnXMPData

Im folgenden Beispiel wird eine einfache for..in -Schleife verwendet, um jede Eigenschaft im infoObject -Parameter, der von der onCuePoint() -Funktion empfangen wird, zu durchlaufen. Die trace()-Funktion wird aufgerufen, um eine Meldung anzuzeigen, wenn die Cue-Point-Daten empfangen werden:

var nc:NetConnection = new NetConnection(); 
nc.connect(null); 
 
var ns:NetStream = new NetStream(nc); 
ns.client = this; 
ns.play("video.flv"); 
 
var vid:Video = new Video(); 
vid.attachNetStream(ns); 
addChild(vid); 
 
function onCuePoint(infoObject:Object):void 
{ 
    var key:String; 
    for (key in infoObject) 
    { 
        trace(key + ": " + infoObject[key]); 
    } 
}

Die folgende Ausgabe wird angezeigt:

parameters:  
name: point1 
time: 0.418 
type: navigation

In diesem Code wird eines von mehreren möglichen Verfahren zum Festlegen des Objekts verwendet, für das die Rückrufmethode ausgeführt wird. Sie können auch andere Techniken verwenden; weitere Informationen finden Sie unter Schreiben von Rückrufmethoden für Metadaten und Cue-Points .

Verwenden von Video-Metadaten

Mithilfe der OnMetaData() - und OnXMPData() -Funktionen können Sie auf die Metadateninformationen in der Videodatei, einschließlich von Cue-Points, zugreifen.

Verwenden von OnMetaData()

Metadaten enthalten Angaben zur Videodatei wie Wiedergabedauer, Breite, Höhe und Bildrate. Welche Metadateninformationen Ihrer Videodatei hinzugefügt werden, ist von der Software abhängig, mit der Sie die Videodatei kodiert haben.

var nc:NetConnection = new NetConnection(); 
nc.connect(null); 
 
var ns:NetStream = new NetStream(nc); 
ns.client = this; 
ns.play("video.flv"); 
 
var vid:Video = new Video(); 
vid.attachNetStream(ns); 
addChild(vid); 
 
function onMetaData(infoObject:Object):void 
{ 
    var key:String; 
    for (key in infoObject) 
    { 
        trace(key + ": " + infoObject[key]); 
    } 
}

Mit dem oben stehenden Code wird folgende Ausgabe generiert:

width: 320 
audiodelay: 0.038 
canSeekToEnd: true 
height: 213 
cuePoints: ,, 
audiodatarate: 96 
duration: 16.334 
videodatarate: 400 
framerate: 15 
videocodecid: 4 
audiocodecid: 2
Wenn das Video keine Audiodaten enthält, geben die audiobezogenen Metadateninformationen (z. B. audiodatarate ) den Wert undefined zurück, da den Metadaten beim Kodieren keine Audioinformationen hinzugefügt werden.

Im oben stehenden Code wurden die Cue-Point-Informationen nicht angezeigt. Um die Cue-Point-Metadaten anzuzeigen, können Sie die folgenden Funktion verwenden, mit der die Elemente in einem Objekt rekursiv angezeigt werden:

function traceObject(obj:Object, indent:uint = 0):void 
{ 
    var indentString:String = ""; 
    var i:uint; 
    var prop:String; 
    var val:*; 
    for (i = 0; i < indent; i++) 
    { 
        indentString += "\t"; 
    } 
    for (prop in obj) 
    { 
        val = obj[prop]; 
        if (typeof(val) == "object") 
        { 
            trace(indentString + " " + prop + ": [Object]"); 
            traceObject(val, indent + 1); 
        } 
        else 
        { 
            trace(indentString + " " + prop + ": " + val); 
        } 
    } 
}

Mithilfe des vorangegangenen Codeausschnitts zum Senden des infoObject -Parameters in der onMetaData() -Methode wird die folgende Ausgabe erstellt:

width: 320 
audiodatarate: 96 
audiocodecid: 2 
videocodecid: 4 
videodatarate: 400 
canSeekToEnd: true 
duration: 16.334 
audiodelay: 0.038 
height: 213 
framerate: 15 
cuePoints: [Object] 
    0: [Object] 
        parameters: [Object] 
            lights: beginning 
        name: point1 
        time: 0.418 
        type: navigation 
    1: [Object] 
        parameters: [Object] 
            lights: middle 
        name: point2 
        time: 7.748 
        type: navigation 
    2: [Object] 
        parameters: [Object] 
            lights: end 
        name: point3 
        time: 16.02 
        type: navigation

Im folgenden Beispiel werden die Metadaten für ein MP4-Video angezeigt. Es wird vorausgesetzt, dass ein TextArea-Objekt namens metaDataOut vorhanden ist, in das die Metadaten geschrieben werden.

package 
{ 
    import flash.net.NetConnection; 
    import flash.net.NetStream; 
    import flash.events.NetStatusEvent; 
    import flash.media.Video; 
    import flash.display.StageDisplayState; 
    import flash.display.Loader; 
    import flash.display.Sprite; 
    import flash.events.MouseEvent; 
     
    public class onMetaDataExample extends Sprite 
    {     
        var video:Video = new Video(); 
         
        public function onMetaDataExample():void 
        { 
            var videoConnection:NetConnection = new NetConnection(); 
            videoConnection.connect(null); 
             
            var videoStream:NetStream = new NetStream(videoConnection); 
            videoStream.client = this; 
             
            addChild(video); 
            video.x = 185; 
            video.y = 5; 
                     
            video.attachNetStream(videoStream); 
             
            videoStream.play("video.mp4"); 
                         
            videoStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); 
        } 
                     
        public function onMetaData(infoObject:Object):void 
        { 
            for(var propName:String in infoObject) 
            { 
                metaDataOut.appendText(propName + "=" + infoObject[propName] + "\n"); 
            } 
        } 
         
        private function netStatusHandler(event:NetStatusEvent):void 
        { 
            if(event.info.code == "NetStream.Play.Stop") 
                stage.displayState = StageDisplayState.NORMAL; 
        } 
    } 
}

Die onMetaData() -Funktion hat für dieses Video die folgende Ausgabe erzeugt:

moovposition=731965 
height=352 
avclevel=21 
videocodecid=avc1 
duration=2.36 
width=704 
videoframerate=25 
avcprofile=88 
trackinfo=[object Object]

Verwenden des Informationsobjekts

In der folgenden Tabelle sind die möglichen Werte für Video-Metadaten aufgeführt, die an die onMetaData() -Rückruffunktion im von ihnen empfangenen Objekt übergeben werden:

Parameter

Beschreibung

aacaot

AAC-Audio-Objekttyp; 0, 1, oder 2 werden unterstützt.

avclevel

AVC IDC-Levelnummer, zum Beispiel 10, 11, 20, 21 usw.

avcprofile

AVC-Profilnummer, zum Beispiel 55, 77, 100 usw.

audiocodecid

Ein String, der angibt, welcher Audio-Codec (Kodier-/Dekodiertechnik) verwendet wurde, zum Beispiel „.Mp3“ oder „mp4a“.

audiodatarate

Eine Zahl, die die Abtastrate angibt, mit der das Audio kodiert wurde, in Kilobyte pro Sekunde.

audiodelay

Eine Zahl, die angibt, bei welcher Zeit in der FLV-Datei der Zeitpunkt 0 der ursprünglichen FLV-Datei vorhanden ist. Der Videoinhalt muss leicht verzögert werden, um korrekt mit dem Audio synchronisiert zu werden.

canSeekToEnd

Ein boolescher Wert. Die Einstellung true bedeutet, dass die FLV-Datei mit einem Schlüsselbild im letzten Bild kodiert wurde, das den Suchlauf bis zum Ende einer progressiv heruntergeladenen Videodatei ermöglicht. Der Wert lautet false , wenn die FLV-Datei nicht mit einem Schlüsselbild im letzten Bild kodiert wurde.

cuePoints

Ein Array von Objekten, eines für jeden in die FLV-Datei eingebetteten Cue-Point. Der Wert ist nicht definiert, wenn die FLV-Datei keine Cue-Points enthält. Jedes Objekt hat die folgenden Eigenschaften:

  • type : ein String, der den Typ des Cue-Points als „navigation“ oder „event“ angibt.

  • name : ein String, der den Namen des Cue-Points angibt.

  • time : eine Zahl, die die Zeit des Cue-Points in Sekunden mit einer Genauigkeit von drei Dezimalstellen (Millisekunden) angibt.

  • parameters : ein optionales Objekt mit Name-Wert-Paaren, die vom Benutzer beim Erstellen des Cue-Points festgelegt wurden.

duration

Eine Zahl, die die Dauer der Videodatei in Sekunden angibt.

framerate

Eine Zahl, die die Bildrate der FLV-Datei angibt.

height

Eine Zahl, die die Höhe der FLV-Datei in Pixel angibt.

seekpoints

Ein Array, das die verfügbaren Schlüsselbilder als Zeitstempel in Millisekunden auflistet. Optional.

tags

Ein Array von Schlüssel-Wert-Paaren, die die Informationen im „ilst“-Atom darstellen (entspricht bei MP4-Dateien den ID3-Tags). iTunes verwendet diese Tags. Kann zur Anzeige von Grafiken verwendet werden, falls verfügbar.

trackinfo

Objekt, das Informationen zu allen Tracks in der MP4-Datei enthält, einschließlich der Sample-Beschreibung-ID.

videocodecid

Ein String, der die Codec-Version angibt, mit der das Video kodiert wurde. Beispiel: „avc1“ oder „VP6F“

videodatarate

Eine Zahl, die die Video-Datenrate der FLV-Datei angibt.

videoframerate

Bildrate des MP4-Videos.

width

Eine Zahl, die die Breite der FLV-Datei in Pixel angibt.

In der folgenden Tabelle sind die möglichen Werte für den Parameter videocodecid aufgeführt:

videocodecid

Codec-Name

2

Sorenson H.263

3

Bildschirmvideo (nur SWF 7 und höher)

4

VP6 (nur SWF 8 und höher)

5

VP6-Video mit Alpha-Kanal (nur SWF 8 und höher)

In der folgenden Tabelle sind die möglichen Werte für den Parameter audiocodecid aufgeführt:

audiocodecid

Codec-Name

0

Unkomprimiert

1

ADPCM

2

MP3

4

Nellymoser bei 16 kHz Mono

5

Nellymoser, 8 kHz Mono

6

Nellymoser

10

AAC

11

Speex

Verwenden von onXMPData()

Die onXMPData() -Rückruffunktion empfängt spezifische Informationen der Adobe Extensible Metadata Platform (XMP), die in der Adobe F4V- oder FLV-Videodatei eingebettet sind. Die XMP-Metadaten enthalten sowohl Cue-Points als auch andere Video-Metadaten. XMP-Metadaten werden mit Flash Player 10 und Adobe 1.5 eingeführt und werden von späteren Versionen unterstützt.

Im folgenden Beispiel werden in den XMP-Metadaten enthaltene Cue-Point-Daten verarbeitet:

package 
{ 
    import flash.display.*; 
    import flash.net.*; 
    import flash.events.NetStatusEvent; 
    import flash.media.Video; 
     
    public class onXMPDataExample extends Sprite 
    { 
        public function onXMPDataExample():void 
        { 
            var videoConnection:NetConnection = new NetConnection(); 
            videoConnection.connect(null); 
             
            var videoStream:NetStream = new NetStream(videoConnection); 
            videoStream.client = this; 
            var video:Video = new Video(); 
             
            addChild(video); 
             
            video.attachNetStream(videoStream); 
             
            videoStream.play("video.f4v"); 
        } 
         
        public function onMetaData(info:Object):void { 
            trace("onMetaData fired"); 
        } 
         
        public function onXMPData(infoObject:Object):void 
        { 
            trace("onXMPData Fired\n"); 
             //trace("raw XMP =\n"); 
             //trace(infoObject.data); 
            var cuePoints:Array = new Array(); 
            var cuePoint:Object; 
            var strFrameRate:String; 
            var nTracksFrameRate:Number; 
            var strTracks:String = ""; 
            var onXMPXML = new XML(infoObject.data); 
            // Set up namespaces to make referencing easier 
            var xmpDM:Namespace = new Namespace("http://ns.adobe.com/xmp/1.0/DynamicMedia/"); 
            var rdf:Namespace = new Namespace("http://www.w3.org/1999/02/22-rdf-syntax-ns#"); 
            for each (var it:XML in onXMPXML..xmpDM::Tracks) 
            { 
                 var strTrackName:String = it.rdf::Bag.rdf::li.rdf::Description.@xmpDM::trackName; 
                 var strFrameRateXML:String = it.rdf::Bag.rdf::li.rdf::Description.@xmpDM::frameRate; 
                 strFrameRate = strFrameRateXML.substr(1,strFrameRateXML.length); 
                 
                 nTracksFrameRate = Number(strFrameRate);  
                 
                 strTracks += it; 
            } 
            var onXMPTracksXML:XML = new XML(strTracks); 
            var strCuepoints:String = ""; 
            for each (var item:XML in onXMPTracksXML..xmpDM::markers) 
            { 
                strCuepoints += item; 
            } 
            trace(strCuepoints); 
        } 
    } 
}

Bei einer kurzen Videodatei namens „startrekintro.f4v“ werden im Beispiel die folgenden trace-Linien erzeugt. Die Linien zeigen die Cue-Point-Daten für Navigations- und Ereignis-Cue-Points in den XMP-Metadaten:

onMetaData fired 
onXMPData Fired 
 
<xmpDM:markers xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpDM="http://ns.adobe.com/xmp/1.0/DynamicMedia/" xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:x="adobe:ns:meta/"> 
  <rdf:Seq> 
    <rdf:li> 
      <rdf:Description xmpDM:startTime="7695905817600" xmpDM:name="Title1" xmpDM:type="FLVCuePoint" xmpDM:cuePointType="Navigation"> 
        <xmpDM:cuePointParams> 
          <rdf:Seq> 
            <rdf:li xmpDM:key="Title" xmpDM:value="Star Trek"/> 
            <rdf:li xmpDM:key="Color" xmpDM:value="Blue"/> 
          </rdf:Seq> 
        </xmpDM:cuePointParams> 
      </rdf:Description> 
    </rdf:li> 
    <rdf:li> 
      <rdf:Description xmpDM:startTime="10289459980800" xmpDM:name="Title2" xmpDM:type="FLVCuePoint" xmpDM:cuePointType="Event"> 
        <xmpDM:cuePointParams> 
          <rdf:Seq> 
            <rdf:li xmpDM:key="William Shatner" xmpDM:value="First Star"/> 
            <rdf:li xmpDM:key="Color" xmpDM:value="Light Blue"/> 
          </rdf:Seq> 
        </xmpDM:cuePointParams> 
      </rdf:Description> 
    </rdf:li> 
  </rdf:Seq> 
</xmpDM:markers> 
onMetaData fired
Hinweis: In XMP-Daten wird die Zeit in Form von „DVA Ticks“ anstelle von Sekunden gespeichert. Sie berechnen die Cue-Point-Zeit, indem Sie die Startzeit durch die Bildrate teilen. Beispiel: Die Startzeit 7695905817600 geteilt durch die Bildrate 254016000000 ist gleich 30:30.

Um die vollständigen unformatierten XMP-Metadaten, einschließlich der Bildrate, zu sehen, müssen Sie die Anmerkungsbezeichner (//) vor der zweiten und dritten trace() -Anweisung am Anfang der onXMPData() -Funktion entfernen.

Verwenden von Bildmetadaten

Das onImageData -Ereignisobjekt sendet Bilddaten als Byte-Array über einen AMF0-Datenkanal Die Daten können im Format JPEG, PNG oder GIF vorliegen. Definieren Sie eine onImageData() -Rückrufmethode zur Verarbeitung dieser Informationen wie Sie Rückrufmethoden für onCuePoint und onMetaData definieren würden. Im folgenden Beispiel wird eine onImageData() -Rückrufmethode verwendet, um auf Bilddaten zuzugreifen und diese anzuzeigen:

public function onImageData(imageData:Object):void 
{ 
    // display track number 
    trace(imageData.trackid); 
    var loader:Loader = new Loader(); 
    //imageData.data is a ByteArray object 
    loader.loadBytes(imageData.data); 
    addChild(loader); 
} 

Verwenden von Textmetadaten

Das onTextData -Ereignis sendet Textdaten über einen AMF0-Datenkanal. Die Textdaten liegen im Format UTF-8 vor und enthalten zusätzliche Informationen über Formatierungen, die auf der „3GP Timed Text“-Spezifikation basieren. Diese Spezifikation definiert ein standardisiertes Format für Untertitel. Definieren Sie eine onTextData() -Rückrufmethode zur Verarbeitung dieser Informationen wie Sie Rückrufmethoden für onCuePoint oder onMetaData definieren würden. Im folgenden Beispiel wird die onTextData() -Methode verwendet, um die Track-ID und den entsprechenden Tracktext anzuzeigen.

public function onTextData(textData:Object):void 
{ 
    // display the track number 
    trace(textData.trackid); 
    // displays the text, which can be a null string, indicating old text 
    // that should be erased 
    trace(textData.text); 
}