使用提示點和中繼資料Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本 使用 NetStream 回呼方法,即可在視訊播放時,捕捉及處理提示點和中繼資料事件。 使用提示點下表說明您可以用來在 Flash Player 和 AIR 中捕捉 F4V 和 FLV 提示點的回呼方法。
下列範例會使用簡單的 for..in 迴圈,重複執行 onCuePoint() 函數所收到之 infoObject 參數中的每一個屬性。它會在收到提示點資料時,呼叫 trace() 函數並顯示訊息。 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]); } } 執行範例後,會顯示下列輸出: parameters: name: point1 time: 0.418 type: navigation 這個程式碼會使用前述技術中的其中一項,設定回呼方法所執行的目標物件。您可以使用其它技術。如需詳細資訊,請參閱為中繼資料和提示點撰寫回呼方法。 使用視訊中繼資料您可以使用 OnMetaData() 和 OnXMPData() 函數,存取視訊檔案內的中繼資料資訊 (包括提示點)。 使用 OnMetaData()中繼資料包含視訊檔案的相關資訊,例如時間長度、寬度、高度和影格速率。視您用來編碼視訊檔案的軟體而定,加入至視訊檔案的中繼資料資訊將有所不同。 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]); } } 上述程式碼會產生下列輸出: width: 320 audiodelay: 0.038 canSeekToEnd: true height: 213 cuePoints: ,, audiodatarate: 96 duration: 16.334 videodatarate: 400 framerate: 15 videocodecid: 4 audiocodecid: 2 如果您的視訊檔案不含音效,則與音效相關的中繼資料資訊 (例如 audiodatarate) 便會傳回 undefined,因為在編碼過程中,並未將音效資訊加入中繼資料內。 在上述程式碼中,提示點資訊並未顯示。為了顯示提示點中繼資料,您可以使用下列函數,它會以遞迴方式顯示 Object 中的項目: 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() 方法中的 infoObject 參數,將會建立下列輸出: 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 下列範例會顯示 MP4 視訊的中繼資料。它會假設有個名為 metaDataOut 的 TextArea 物件,以便在其中寫入中繼資料。 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() 函數為此視訊所產生的輸出如下: moovposition=731965 height=352 avclevel=21 videocodecid=avc1 duration=2.36 width=704 videoframerate=25 avcprofile=88 trackinfo=[object Object] 使用資訊物件下表列出視訊中繼資料的可能值,這些值會傳遞至所收到之 Object 中的 onMetaData() 回呼函數:
下表列出 videocodecid 參數的可能值:
下表列出 audiocodecid 參數的可能值:
使用 onXMPData()onXMPData() 回呼函數會接收內嵌於 Adobe F4V 或 FLV 視訊檔案中的 Adobe 可延伸中繼資料平台 (XMP) 專屬資訊。XMP 中繼資料包含提示點以及其它視訊中繼資料。XMP 中繼資料支援是 Flash Player 10 和 Adobe AIR 1.5 新增的功能,後續版本都將持續提供這項支援。 下列範例會處理 XMP 中繼資料內的提示點資料: 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 的簡短視訊檔案,上述範例會產生下列追蹤程式碼行。這些程式碼行會顯示用於瀏覽的提示點資料以及 XMP 中繼資料內的事件提示點: 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 備註: 在 XMP 資料中,時間的儲存單位為「DVA 刻度」,而非秒。若要計算提示點時間,請將開始時間除以影格速率。例如,開始時間 7695905817600 除以影格速率 254016000000 等於 30:30。
若要查看完整的原始 XMP 中繼資料 (包括影格速率),請移除 onXMPData() 函數開頭的第二和第三個 trace() 陳述式之前的註解識別項 (//’s)。 如需有關 XMP 的詳細資訊,請前往:
使用影像中繼資料onImageData 事件會透過 AMF0 資料通道,傳送影像資料做為位元組陣列。資料的格式可以是 JPEG、PNG 或 GIF。以您為 onCuePoint 和 onMetaData 定義回呼方法的相同方式來定義 onImageData() 回呼方法,即可處理此資訊。下列範例會使用 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); } 使用文字中繼資料onTextData 事件會透過 AMF0 資料通道傳送文字資料。此文字資料採用 UTF-8 格式,而且包含根據 3GP 定時文字規格進行格式化的其它相關資訊。此規格會定義標準化的副標題格式。以您為 onCuePoint 或 onMetaData 定義回呼方法的相同方式,定義 onTextData() 回呼方法即可處理此資訊。在下列範例中,onTextData() 方法會顯示曲目 ID 編號以及對應的曲目文字。 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); } |
|