Actiepunten en metagegevens gebruikenFlash 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 gebruikenIn de volgende tabel worden de callbackmethoden beschreven die u kunt gebruiken om F4V- en FLV-actiepunten vast te leggen in Flash Player en AIR.
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 gebruikenU kunt de functies OnMetaData() and OnXMPData() gebruiken om informatie over metagegevens, inclusief actiepunten, te benaderen in het videobestand. OnMetaData() gebruikenMetagegevens 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 ![]() 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 gebruikenIn de volgende tabel worden de mogelijke waarden getoond voor videometagegevens die worden doorgegeven aan de callbackfunctie onMetaData() in het object dat ze ontvangen:
In de volgende tabel worden de mogelijke waarden voor de parameter videocodecid weergegeven:
In de volgende tabel worden de mogelijke waarden voor de parameter audiocodecid weergegeven:
onXMPData() gebruikenDe 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. Voor meer informatie over XMP zie:
Metagegevens van afbeeldingen gebruikenDe 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 gebruikenDe 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); } |
![]() |