İşaret noktalarını ve meta verileri kullanmaFlash Player 9 ve üstü, Adobe AIR 1.0 ve üstü Video oynatılırken işaret noktası ve meta veri olaylarını yakalamak ve işlemek için NetStream geri çağrı yöntemlerini kullanın. İşaret noktalarını kullanmaAşağıdaki tablo, Flash Player uygulamasında F4V ve FLV işaret noktalarını yakalamak için kullanabileceğiniz geri çağrı yöntemlerini açıklar.
Aşağıdaki örnek, basit bir for..in döngüsünü kullanarak, onCuePoint() işlevinin aldığı infoObject parametresindeki özelliklerin her birini yineler. İşaret noktası verileri aldığında bir mesaj görüntülemek için trace() işlevini çağırır: 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]); } } Şu çıktı görüntülenir: parameters: name: point1 time: 0.418 type: navigation Bu kod, geri çağrı yönteminin üzerinde çalıştığı nesneyi ayarlamak için çok sayıdaki teknikten birini kullanır. Başka teknikler de kullanabilirsiniz; daha fazla bilgi için, bkz. Meta veri ve işaret noktaları için geri çağrı yöntemleri yazma. Video meta verilerini kullanmaİşaret noktaları da dahil olmak üzere, video dosyanızdaki meta verilere erişmek için OnMetaData() ve OnXMPData() işlevlerini kullanabilirsiniz. OnMetaData() öğesini kullanmaMeta veriler arasında, süre, genişlik, yükseklik ve kare hızı gibi video dosyanız hakkında bilgiler yer alır. Video dosyanıza eklenen meta veri bilgileri, video dosyasını kodlamak için kullandığınız yazılıma bağlıdır. 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]); } } Önceki kod, şunun gibi bir çıktı oluşturur: width: 320 audiodelay: 0.038 canSeekToEnd: true height: 213 cuePoints: ,, audiodatarate: 96 duration: 16.334 videodatarate: 400 framerate: 15 videocodecid: 4 audiocodecid: 2 Videonuzda ses yoksa, kodlama sırasında meta verilere ses bilgisi eklenmediğinden, sesle ilgili meta veri bilgileri (örn. audiodatarate) undefined değerini döndürür. Önceki kodda, işaret noktası bilgileri görüntülenmiyordu. İşaret noktası meta verilerini görüntülemek için, Object içindeki öğeleri art arda görüntüleyen şu işlevi kullanabilirsiniz: 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); } } } onMetaData() yönteminde infoObject parametresini izlemek için önceki kod parçasının kullanılması şu çıktıyı oluşturur: 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 Şu örnek, MP4 video için meta verileri görüntüler. Ayrıca meta verileri yazdığı, metaDataOut adında bir TextArea nesnesinin olduğunu varsayar. 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; } } } onMetaData() işlevi bu video için şu çıktıyı üretmiştir: moovposition=731965 height=352 avclevel=21 videocodecid=avc1 duration=2.36 width=704 videoframerate=25 avcprofile=88 trackinfo=[object Object] Bilgi nesnesini kullanmaAşağıdaki tablo, aldığı Objecy öğesinde onMetaData() geri çağrı işlevine iletilen video meta verileri için olası değerleri gösterir:
Aşağıdaki tablo, videocodecid parametresi için olası değerleri gösterir:
Aşağıdaki tablo, audiocodecid parametresi için olası değerleri gösterir:
onXMPData() öğesini kullanmaonXMPData() geri çağrı işlevi, Adobe F4V veya FLV video dosyasında gömülü olan, Adobe Genişletilebilir Meta Veriler Platformu'na (XMP) özgü bilgileri alır. XMP meta verileri, diğer video meta verilerinin yanı sıra işaret noktaları da içerir. XMP meta verileri desteği, Flash Player 10 ve Adobe AIR 1.5 ile sunulmuş olup sonraki sürümler tarafından desteklenir. Şu örnek, XMP meta verilerinde işaret noktası verilerini işler: 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); } } } startrekintro.f4v adında kısa bir video dosyası için, bu örnek aşağıdaki izleme satırlarını üretir. Satırlar, XMP meta verilerinde gezinme ve olay işaret noktaları için işaret noktası verilerini gösterir: 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 Not: XMP verilerinde, zaman saniye olarak değil, DVA Onay İşaretleri olarak saklanır. İşaret noktası zamanını hesaplamak için, başlangıç zamanını kare hızına bölün. Örneğin, 254016000000 değerine bölünmüş 7695905817600 başlangıç zamanı, 30:30 değerine eşittir.
Kare hızını da içeren ham XMP meta verilerinin tamamını görmek için, onXMPData() işlevinin başında ikinci ve üçüncü trace() deyimlerinin başında bulunan yorum tanımlayıcılarını (//) kaldırın. XMP hakkında daha fazla bilgi için bkz:
Görüntü meta verilerini kullanmaonImageData olayı, görüntü verilerini AMF0 veri kanalı üzerinden bir bayt dizisi olarak gönderir. Veriler JPEG, PNG veya GIF formatları. Bu bilgileri işlemek için, onCuePoint ve onMetaData öğelerinin geri çağrı yöntemlerini tanımladığınız aynı şekilde onImageData() geri çağrı yöntemini de tanımlayın. Aşağıdaki örnek, bir onImageData() geri çağrı yöntemini kullanarak görüntü verilerine erişir ve bu verileri görüntüler: 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); } Metin meta verilerini kullanmaonTextData olayı, AMF0 veri kanalı üzerinden metin verileri gönderir. Metin verisi UTF-8 formatındadır ve 3GP zamanlanmış metin belirtimini esas alarak formatlama hakkında ek bilgiler içerir. Belirtim, standartlaştırılmış bir altyazı formatını tanımlar. Bu bilgileri işlemek için, onCuePoint veya onMetaData öğesinin geri çağrı yöntemlerini tanımladığınız aynı şekilde onTextData() geri çağrı yöntemini de tanımlayın. Aşağıdaki örnekte, onTextData() yöntemi parça kimliğini ve karşılık gelen parça metnini görüntüler. 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); } |
|