Actiepunten en metagegevens gebruiken

Flash Player 9 of hoger, Adobe AIR 1.0 of hoger

Met de NetStream-callbackmethoden kunt u actiepunt- en metagegevensgebeurtenissen vastleggen en verwerken terwijl de video wordt afgespeeld.

Actiepunten gebruiken

In de volgende tabel worden de callbackmethoden beschreven die u kunt gebruiken om F4V- en FLV-actiepunten vast te leggen in Flash Player en AIR.

Runtime

F4V

FLV

Flash Player 9 / AIR 1.0

 

OnCuePoint

   

OnMetaData

Flash Player 10

 

OnCuePoint

 

OnMetaData

OnMetaData

 

OnXMPData

OnXMPData

In het volgende voorbeeld wordt een eenvoudige for...in-lus gebruikt om een bewerking uit te voeren op elke eigenschap in de parameter infoObject die de functie onCuePoint() ontvangt. De lus roept de functie trace() op om een bericht weer te geven wanneer actiepuntgegevens worden ontvangen:

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]); 
    } 
}

De volgende uitvoer wordt weergegeven:

parameters:  
name: point1 
time: 0.418 
type: navigation

Deze code maakt gebruik van een van de vele technieken voor het instellen van het object waarop de callbackmethode wordt uitgevoerd. U kunt andere technieken gebruiken, zie Callbackmethoden schrijven voor metagegevens en actiepunten voor meer informatie.

Videometagegevens gebruiken

U kunt de functies OnMetaData() and OnXMPData() gebruiken om informatie over metagegevens, inclusief actiepunten, te benaderen in het videobestand.

OnMetaData() gebruiken

Metagegevens bevatten informatie over het videobestand, zoals duur, breedte, hoogte en framesnelheid. Welke informatie over metagegevens wordt toegevoegd aan het videobestand, is afhankelijk van de software die u gebruikt om het videobestand te coderen.

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]); 
    } 
}

De bovenstaande code genereert de volgende uitvoer:

width: 320 
audiodelay: 0.038 
canSeekToEnd: true 
height: 213 
cuePoints: ,, 
audiodatarate: 96 
duration: 16.334 
videodatarate: 400 
framerate: 15 
videocodecid: 4 
audiocodecid: 2
Wanneer u video zonder audio hebt, wordt de informatie over metagegevens betreffende audio (zoals audiodatarate) geretourneerd als undefined omdat geen audio-informatie aan de metagegevens is toegevoegd tijdens het coderen.

In de bovenstaande code wordt de actiepuntinformatie niet weergegeven. U kunt de volgende functie gebruiken die de items in een object recursief weergeeft om de metagegevens van de actiepunten weer te geven:

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); 
        } 
    } 
}

Wanneer u het vorige codefragment gebruikt om de parameter infoObject in de methode onMetaData() weer te geven, wordt de volgende uitvoer gegenereerd:

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

Het volgende voorbeeld geeft de metagegevens voor een MP4-video weer. Hierbij wordt ervan uitgegaan dat er een TextArea-object is met de naam metaDataOut, waarnaar de metagegevens worden geschreven.

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; 
        } 
    } 
}

De functie onMetaData() heeft de volgende uitvoer geproduceerd voor deze video:

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

Het informatieobject gebruiken

In de volgende tabel worden de mogelijke waarden getoond voor videometagegevens die worden doorgegeven aan de callbackfunctie onMetaData() in het object dat ze ontvangen:

Parameter

Beschrijving

aacaot

Objecttype AAC-audio; 0, 1 en 2 worden ondersteund.

avclevel

AVC IDC-niveaunummer zoals 10, 11, 20, 21 enzovoort.

avcprofile

AVC-profielnummer zoals 55, 77, 100 enzovoort.

audiocodecid

Een tekenreeks die de gebruikte audio-codec aangeeft (techniek voor coderen/decoderen), bijvoorbeeld .mp3 of mp4a.

audiodatarate

Een getal dat de snelheid aangeeft waarmee audio wordt gecodeerd, in kilobytes per seconde.

audiodelay

Een getal dat aangeeft op welk tijdstip in het FLV-bestand ‘tijd 0’ van het oorspronkelijke FLV-bestand valt. De video-inhoud moet met een kleine hoeveelheid worden vertraagd voor correcte synchronisatie van de audio.

canSeekToEnd

Een Booleaanse waarde die true is als het FLV-bestand met een hoofdframe op het laatste frame is gecodeerd, waardoor u naar het einde van een filmfragment met progressieve download kunt zoeken. Wanneer het FLV-bestand niet met een hoofdframe op het laatste frame is gecodeerd, is de waarde false.

cuePoints

Een array van objecten, één voor elk actiepunt dat in het FLV-bestand is ingesloten. Als het FLV-bestand geen actiepunten bevat, is de waarde ongedefinieerd. Elk object heeft de volgende eigenschappen:

  • type: een tekenreeks die het type actiepunt aangeeft, zoals ‘navigatie’ of ‘gebeurtenis’.

  • name: een tekenreeks die de naam van het actiepunt aangeeft.

  • time: een getal dat de tijd van het actiepunt aangeeft, opgegeven in seconden en met een precisie van drie decimalen (milliseconden).

  • parameters: een optioneel object dat naam/waarde-paren bevat die door de gebruiker worden opgegeven bij het maken van actiepunten.

duration

Een getal dat de duur van het videobestand opgeeft, in seconden.

framerate

Een getal dat de framesnelheid van het FLV-bestand aangeeft.

height

Een getal dat de hoogte van het FLV-bestand aangeeft, in pixels.

seekpoints

Een array van de beschikbare hoofdframes als tijdstempels in milliseconden. Optioneel.

tags

Een array van sleutelwaardeparen die de informatie in het atoom “ilst” vertegenwoordigt. Dit is het equivalent van ID3-tags voor MP4-bestanden. iTunes maakt gebruikt van deze tags. Kan worden gebruikt voor de weergave van illustraties, als deze beschikbaar zijn.

trackinfo

Een object dat informatie levert over alle tracks in het MP4-bestand, inclusief de voorbeeldbeschrijvings-id.

videocodecid

Een tekenreeks die de codec-versie aangeeft die is gebruikt om de video te coderen. - bijvoorbeeld “avc1” of “VP6F”

videodatarate

Een getal dat de videogegevenssnelheid van het FLV-bestand aangeeft.

videoframerate

De framesnelheid van de MP4-video.

width

Een getal dat de breedte van het FLV-bestand aangeeft, in pixels.

In de volgende tabel worden de mogelijke waarden voor de parameter videocodecid weergegeven:

videocodecid

Codec-naam

2

Sorenson H.263

3

Schermvideo (alleen SWF versie 7 en hoger)

4

VP6 (alleen SWF versie 8 en hoger)

5

VP6-video met alfakanaal (alleen SWF versie 8 en hoger)

In de volgende tabel worden de mogelijke waarden voor de parameter audiocodecid weergegeven:

audiocodecid

Codec-naam

0

geen compressie

1

ADPCM

2

MP3

4

Nellymoser @ 16 kHz mono

5

Nellymoser, 8 kHz mono

6

Nellymoser

10

AAC

11

Speex

onXMPData() gebruiken

De callbackfunctie onXMPData() ontvangt specifieke Adobe XMP-gegevens (Extensible Metadata Platform) die zijn ingesloten in het Adobe F4V- of FLV-videobestand. De XMP-metagegevens bevatten zowel actiepunten als andere videometagegevens. Ondersteuning voor XMP-metagegevens wordt geïntroduceerd met Flash Player 10 en Adobe AIR 1.5 en wordt door de daaropvolgende versies ondersteund.

In het volgende voorbeeld worden actiepuntgegevens in de XMP-metagegevens verwerkt:

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); 
        } 
    } 
}

Voor een kort videobestand met de naam startrekintro.f4v maakt dit voorbeeld de volgende traceerregels. De regels geven de actiepuntgegevens voor navigatie en de gebeurtenisactiepunten in de XMP-metagegevens aan:

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
Opmerking: In XMP-gegevens wordt tijd opgeslagen als DVA Ticks, en niet als seconden. Voor de berekening van de actiepunttijd deelt u de begintijd door de framesnelheid. De begintijd 7695905817600 gedeeld door een framesnelheid van 254016000000 is gelijk aan 30:30.

Als u de volledige, onbewerkte XMP-metagegevens wilt bekijken, die ook de framesnelheid bevatten, verwijdert u de aanduidingen voor opmerkingen (//) die vóór de tweede en derde trace()-instructie aan het begin van de functie onXMPData() staan.

Metagegevens van afbeeldingen gebruiken

De gebeurtenis onImageData verzendt afbeeldingsgegevens als een bytearray via een AMF0-gegevenskanaal. De gegevens kunnen in de indeling JPEG, PNG of GIF zijn. Definieer de callbackmethode onImageData() voor de verwerking van deze gegevens op dezelfde manier als u callbackmethoden zou definiëren voor onCuePoint en onMetaData. In het volgende voorbeeld wordt de callbackmethode onImageData() gebruikt om afbeeldingsgegevens te benaderen en weer te geven:

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); 
} 

Tekstmetagegevens gebruiken

De gebeurtenis onTextData verzendt tekstgegevens via een AMF0-gegevenskanaal. De tekstgegevens hebben de UTF-8-indeling en bevatten aanvullende informatie over opmaak op basis van de 3GP-specificatie voor getimede tekst. Deze specificatie legt een gestandaardiseerde indeling voor ondertitels vast. Definieer de callbackmethode onTextData() voor de verwerking van deze gegevens op dezelfde manier als u callbackmethoden zou definiëren voor onCuePoint of onMetaData. In het volgende voorbeeld geeft de methode onTextData() de track-id en de bijbehorende tracktekst weer.

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); 
}