Använda referenspunkter och metadata

Flash Player 9 och senare, Adobe AIR 1.0 och senare

Använd NetStream-callback-metoderna om du vill fånga in och bearbeta referenspunkts- och metadatahändelser allt eftersom videon spelas upp.

Använda referenspunkter

I tabellen nedan beskrivs callback-metoderna som du kan använda när du fångar in F4V- och FLV-referenspunkter i Flash Player och AIR.

Körtidsbibliotek

F4V

FLV

Flash Player 9/ AIR1.0

 

OnCuePoint

   

OnMetaData

Flash Player 10

 

OnCuePoint

 

OnMetaData

OnMetaData

 

OnXMPData

OnXMPData

I följande exempel används en enkel for..in-slinga för att iterera igenom varje egenskap i infoObject-parametern som funktionen onCuePoint() tar emot. Den anropar funktionen trace() för att visa ett meddelande när den tar emot referenspunktsdata:

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

Följande utdata visas:

parameters:  
name: point1 
time: 0.418 
type: navigation

I den här koden används en av flera tekniker för att ange objektet som kör callback-metoden. Du kan använda fler tekniker. Mer information finns i Skriva callback-metoder för metadata och referenspunkter.

Använda videometadata

Med funktionerna OnMetaData() och OnXMPData() får du åtkomst till metadatainformation i videofilen, bland annat referenspunkter.

Använda OnMetaData()

Metadata innehåller information om videofilen, t.ex. varaktighet, bredd, höjd och bildrutehastighet. Vilken metadatainformation som läggs till i videofilen beror på vilket program du använder för att koda videofilen.

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

Den föregående koden genererar följande utdata:

width: 320 
audiodelay: 0.038 
canSeekToEnd: true 
height: 213 
cuePoints: ,, 
audiodatarate: 96 
duration: 16.334 
videodatarate: 400 
framerate: 15 
videocodecid: 4 
audiocodecid: 2
Om videon saknar ljud returneras den ljudrelaterade metadatainformationen (som audiodatarate) undefined eftersom ingen ljudinformation har lagts till i metadata under kodningen.

I föregående kod visas inte referenspunktsinformationen. Om du vill visa metadata för referenspunkten kan du använda följande funktion som visar objekten rekursivt i ett objekt:

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

Om du använder föregående kodutdrag för att spåra infoObject-parametern i onMetaData()-metoden skapas följande utdata:

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

I följande exempel visas metadata för en MP4-video. Det förutsätter att det finns ett TextArea-objekt med namnet metaDataOut som metadata ska skrivas till.

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

Funktionen onMetaData() returnerar följande utdata för videon:

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

Använda informationsobjektet

I tabellen nedan visas möjliga värden för videometadata som skickas till callback-funktionen onMetaData() i det objekt som de tas emot i:

Parameter

Beskrivning

aacaot

AAC-ljudobjekttyp; 0, 1 eller 2 stöds.

avclevel

AVC IDC-nivånummer som 10, 11, 20, 21 och så vidare.

avcprofile

AVC-profilnummer som 55, 77, 100 och så vidare.

audiocodecid

En sträng som visar vilken ljudkodek som används (kodnings- och avkodningsteknik), till exempel .Mp3 eller mp4a.

audiodatarate

Ett tal som anger hastigheten som ljudet kodas med i kilobyte per sekund.

audiodelay

Ett tal som anger vilken tid i FLV-filen som är ”time 0” i den ursprungliga FLV-filen. Videoinnehållet måste fördröjas något för att synkronisera ljudet rätt.

canSeekToEnd

Ett booleskt värde som är true om FLV-filen är kodad med en nyckelbildruta på den sista bildrutan som möjliggör sökning ända till slutet av en progressivt nedladdad videofilm. Värdet är false om FLV-filen inte kodas med en nyckelbildruta på den sista bildrutan.

cuePoints

En array med objekt, en för varje referenspunkt som är inbäddad i FLV-filen. Värdet är odefinierat om FLV-filen inte innehåller några referenspunkter. Varje objekt innehåller följande egenskaper:

  • type: En sträng som anger typen av referenspunkt som antingen ”navigering” eller ”händelse”.

  • name: En sträng som är namnet på referenspunkten.

  • time: Ett tal som anger tiden i referenspunkten i sekunder med en noggrannhet på tre decimaler (millisekunder).

  • parameters: Ett valfritt objekt med namnvärdepar som bestäms av användaren när referenspunkterna skapas.

duration

Ett tal som anger varaktigheten för videofilen i sekunder.

framerate

Ett tal som anger bildrutehastigheten i FLV-filen.

height

Ett tal som anger FLV-filens höjd i pixlar.

seekpoints

En array som visar tillgängliga nyckelrutor som tidsstämplar i millisekunder. Valfritt.

tags

En array med nyckelvärdespar som representerar informationen i atomen ”ilst”, som är motsvarigheten till ID3-taggar för MP4-filer. iTunes använder dessa taggar. Kan användas för att visa grafik om sådan finns.

trackinfo

Objekt som omfattar information på alla spår i MP4-filen, även samplingens beskrivnings-ID.

videocodecid

En sträng som visar vilken kodekversion som videon kodas i. – till exempel för ”avc1” eller ”VP6F”

videodatarate

Ett tal som anger videodatahastigheten i FLV-filen.

videoframerate

MP4-videons bildhastighet.

width

Ett tal som anger FLV-filens bredd i pixlar.

I följande tabell visas giltiga värden för videocodecid-parametern:

videocodecid

Kodeknamn

2

Sorenson H.263

3

Screen-video (endast SWF version 7 och senare)

4

VP6 (endast SWF version 8 och senare)

5

VP6-video med alfakanal (endast SWF version 8 och senare)

I följande tabell visas giltiga värden för audiocodecid-parametern:

audiocodecid

Kodeknamn

0

ej komprimerad

1

ADPCM

2

Mp3

4

Nellymoser @ 16 kHz mono

5

Nellymoser 8 kHz mono

6

Nellymoser

10

AAC

11

Speex

Använda onXMPData()

Callback-funktionen onXMPData() får information om Adobe Extensible Metadata Platform (XMP) som bäddas in i Adobe F4V- eller FLV-videofilen. XMP-metadata omfattar referenspunkter samt andra videometadata. XMP-metadata stöds från och med Flash Player 10 och Adobe AIR 1.5 och i efterföljande versioner.

I följande exempel bearbetas referenspunktsdata i XMP-metadata:

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

För en kort videofil med namnet startrekintro.f4v skapar det här exemplet följande trace-rader. Raderna visar referenspunktsdata för navigering och händelsereferenspunkter i XMP-metadata:

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
Obs! I XMP lagras tid som DVA-ticks i stället för sekunder. Om du vill beräkna tiden för referenspunkten dividerar du starttiden med bildhastigheten. Exempel: Starttiden 7695905817600 dividerat med bildhastigheten 254016000000 är lika med 30:30.

Om du vill visa fullständiga råa XMP-metadata, som omfattar bildhastighet, tar du bort kommentarsidentifierarna (//) som föregår den andra och tredje trace()-satsen i början av onXMPData()-funktionen.

Mer information om XMP finns på:
  • http://partners.adobe.com/public/developer/xmp/topic.html

  • http://www.adobe.com/devnet/xmp/

Använda bildmetadata

Händelsen onImageData skickar bilddata i form av en byte-array genom en AMF0-datakanal. Data kan vara i JPEG-, PNG- eller GIF-format. Definiera en callback-metod av typen onImageData() om du vill bearbeta den här informationen, på samma sätt som du definierar callback-metoder för onCuePoint och onMetaData. Följande exempel får åtkomst till och visar bilddata med hjälp av callback-metoden onImageData():

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

Använda textmetadata

Händelsen onTextData skickar textdata genom en AMF0-datakanal. Alla textdata är i UTF-8-format och innehåller extra information om formatering baserat på textspecifikationen 3GP timed. Den här specifikationen definierar ett standardiserat textningsformat. Definiera en callback-metod av typen onTextData() om du vill bearbeta den här informationen, på samma sätt som du definierar callback-metoder för onCuePoint eller onMetaData. I följande exempel visar metoden onTextData() spårets ID-nummer och motsvarande spårtext.

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