Uso de pontos de sinalização e metadadosFlash Player 9 e posterior, Adobe AIR 1.0 e posterior Use os métodos de retorno de chamada NetStream para capturar e processar eventos de metadados e de ponto de sinalização durante a reprodução do vídeo. Uso de pontos de sinalizaçãoA tabela a seguir descreve os métodos de retorno de chamada que você pode usar para capturar pontos de sinalização F4V e FLV no Flash Player e no AIR.
O exemplo a seguir usa um loop for..in simples para se repetir em cada uma das propriedades do parâmetro infoObject que a função onCuePoint() recebe. Ele chama a função trace() para exibir uma mensagem quando recebe dados de ponto de sinalização: 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]); } } Aparece a seguinte saída: parameters: name: point1 time: 0.418 type: navigation Este código usa uma das várias técnicas para definir o objeto no qual é executado o método de retorno de chamada. Você pode usar outras técnicas; para obter mais informações, consulte Criação de métodos de retorno de chamada para metadados e pontos de sinalização. Uso de metadados de vídeoÉ possível usar as funções OnMetaData() e OnXMPData() para acessar as informações de metadados do arquivo de vídeo, inclusive pontos de sinalização. Uso de OnMetaData()Os metadados incluem informações sobre o arquivo de vídeo, como duração, largura, altura e taxa de quadros. As informações dos metadados que são adicionadas ao arquivo de vídeo dependem do software utilizado para codificar o arquivo. 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]); } } O código anterior gera uma saída parecida com esta: width: 320 audiodelay: 0.038 canSeekToEnd: true height: 213 cuePoints: ,, audiodatarate: 96 duration: 16.334 videodatarate: 400 framerate: 15 videocodecid: 4 audiocodecid: 2 ![]() No código anterior, as informações de ponto de sinalização não eram exibidas. Para exibir os metadados de ponto de sinalização, use esta função, que exibe os itens recursivamente em um 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); } } } O uso do snippet de código anterior para rastrear o parâmetro infoObject no método onMetaData() gera a seguinte saída: 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 O exemplo a seguir exibe os metadados de um vídeo MP4. Ele pressupõe que existe um objeto TextArea chamado metaDataOut, no qual grava os metadados. 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; } } } A função onMetaData() gerou a seguinte saída para esse vídeo: moovposition=731965 height=352 avclevel=21 videocodecid=avc1 duration=2.36 width=704 videoframerate=25 avcprofile=88 trackinfo=[object Object] Uso do objeto de informaçãoA tabela a seguir mostra os possíveis valores para os metadados de vídeo que são passados à função de retorno de chamada onMetaData() no Object por eles recebido:
A tabela a seguir mostra os valores possíveis para o parâmetro videocodecid:
A tabela a seguir mostra os valores possíveis para o parâmetro audiocodecid:
Uso de onXMPData()A função de retorno de chamada onXMPData() recebe informações específicas da plataforma XMP (Extensible Metadata Platform) da Adobe que são incorporadas ao arquivo de vídeo Adobe F4V ou FLV. Os metadados XMP incluem pontos de sinalização e outros metadados de vídeo. O suporte para metadados XMP foi introduzido com o Flash Player 10 e o Adobe AIR 1.5 e é suportado pelas versões subseqüentes. Este exemplo processa dados de ponto de sinalização nos metadados 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); } } } No caso de um arquivo de vídeo curto chamado startrekintro.f4v, este exemplo produz as linhas de rastreamento a seguir. As linhas mostram os dados de ponto de sinalização referentes a pontos de sinalização de navegação e de eventos nos metadados 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 Nota: Nos dados XMP, o tempo é armazenado como Tiques DVA e não como segundos. Para calcular o tempo do ponto de sinalização, divida a hora inicial pela taxa de quadros. Por exemplo, a hora inicial de 7695905817600 dividida por uma taxa de quadros de 254016000000 é igual a 30:30.
Para ver os metadados XMP brutos completos, que incluem a taxa de quadros, remova os identificadores de comentário (//’s) que precedem a segunda e a terceira instruções trace() no início da função onXMPData(). Para obter mais informações sobre a XMP, consulte:
Uso de metadados de imagemO evento onImageData envia dados de imagem como uma matriz de bytes por um canal de dados AMF0. Os dados podem estar nos formatos JPEG, PNG ou GIF. Defina um método de retorno de chamada onImageData() para processar essas informações, da mesma forma que você definiria métodos de retorno de chamada para onCuePoint e onMetaData. Este exemplo acessa e exibe dados de imagem usando um método de retorno de chamada 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); } Uso de metadados de textoO evento onTextData envia dados de texto por meio de um canal de dados AMF0. Os dados de texto estão no formato UTF-8 e contêm informações adicionais sobre formatação com base na especificação de texto com tempo 3GP. Essa especificação define um formato de legenda padronizado. Defina um método de retorno de chamada onTextData() para processar essas informações, da mesma forma que você definiria métodos de retorno de chamada para onCuePoint ou onMetaData. No próximo exemplo, o método onTextData() exibe o número de identificação da faixa e o texto da faixa correspondente. 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); } |
![]() |