Uso de puntos de referencia y metadatosFlash Player 9 y posterior, Adobe AIR 1.0 y posterior Los métodos callback NetStream se utilizan para capturar y procesar eventos de metadatos y puntos de referencia conforme se reproduce el vídeo. Uso de puntos de referenciaEn la siguiente tabla se describen los métodos callback que se pueden utilizar para capturar puntos de referencia F4V y FLV en Flash Player y AIR.
En el siguiente ejemplo se utiliza un sencillo bucle for..in para repetir todas las propiedades del parámetro infoObject que recibe la función onCuePoint(). Llama a la función trace() para que aparezca un mensaje cuando reciba los datos de punto de referencia: 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 el siguiente resultado: parameters: name: point1 time: 0.418 type: navigation Este código utiliza una de las distintas técnicas para configurar el objeto en el que se ejecuta el método callback. También puede utilizar otras técnicas; para obtener más información, consulte Escritura de métodos callback para metadatos y puntos de referencia. Uso de metadatos de vídeoLas funciones OnMetaData() y OnXMPData() se pueden emplear para acceder a la información de metadatos en su archivo de vídeo, incluyendo puntos de referencia. Uso de OnMetaData()Los metadatos incluyen información sobre el archivo de vídeo, como la duración, anchura, altura y velocidad de fotogramas. La información de metadatos que se añade al archivo de vídeo depende del software que se utilice para codificar el archivo de vídeo. 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]);
}
}
El código anterior genera resultados como los siguientes: width: 320 audiodelay: 0.038 canSeekToEnd: true height: 213 cuePoints: ,, audiodatarate: 96 duration: 16.334 videodatarate: 400 framerate: 15 videocodecid: 4 audiocodecid: 2 Si el vídeo no tiene sonido, la información de metadatos relativa al audio (como audiodatarate) devuelve undefined, ya que no se ha añadido información de audio a los metadatos durante la codificación.En el código anterior, no se muestra la información de punto de referencia. Para ver los metadatos del punto de referencia, se puede utilizar la siguiente función que muestra de forma sucesiva los elementos en una clase 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);
}
}
}
Mediante el fragmento de código anterior para rastrear el parámetro infoObject del método onMetaData(), se crea la salida siguiente: 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
El siguiente ejemplo muestra los metadatos para un vídeo MP4. Se da por hecho que existe un objeto llamado metaDataOut, en el que se escriben los metadatos. 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;
}
}
}
La función onMetaData() generó los siguientes resultados para este vídeo: moovposition=731965 height=352 avclevel=21 videocodecid=avc1 duration=2.36 width=704 videoframerate=25 avcprofile=88 trackinfo=[object Object] Uso del objeto informationLa siguiente tabla muestra los posibles valores para los metadatos de vídeo que se transmiten a la función callback onMetaData() en el objeto que reciben:
La tabla siguiente muestra los posibles valores del parámetro videocodecid:
La tabla siguiente muestra los posibles valores del parámetro audiocodecid:
Uso de onXMPData()La función callback onXMPData() recibe información específica de Adobe Extensible Metadata Platform (XMP) incorporada en el archivo de vídeo Adobe F4V o FLV. Los metadatos XMP incluyen puntos de referencia, así como otros metadatos de vídeo. La compatibilidad con metadatos XMP se incorpora a partir de Flash Player 10 y Adobe AIR 1.5 y se admite en versiones posteriores. En el siguiente ejemplo se procesan datos del punto de referencia en los metadatos 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);
}
}
}
Para un breve archivo de vídeo denominado startrekintro.f4v, este ejemplo produce las siguientes líneas de trazado. Las líneas muestran los datos del punto de referencia para los puntos de referencia de evento y navegación en los metadatos 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: en los datos XMP, el tiempo se almacena como ticks DVA en lugar de en segundos. Para calcular la hora del punto de referencia, divida la hora de inicio entre la velocidad de fotogramas. Por ejemplo, la hora de inicio de 7695905817600 dividida entre una velocidad de fotogramas de 254016000000 es igual a 30:30.
Para ver los metadatos XMP completos sin formato, lo que incluye la velocidad de fotogramas, elimine los identificadores de comentarios (//’s) que preceden a la segunda y tercera sentencia trace() al principio de la función onXMPData(). Para obtener más información sobre XMP, consulte:
Uso de metadatos de imagenEl evento onImageData envía los datos de imagen como un conjunto de bytes a través de un canal de datos AMF0. Los datos se pueden presentar en formatos JPEG, PNG o GIF. Defina un método callback onImageData() para procesar esta información, del mismo modo que definiría métodos callback para onCuePoint y onMetaData. El siguiente ejemplo muestra y accede a los datos de imagen utilizando el método callback 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 metadatos de textoEl evento onTextData envía datos de texto mediante un canal de datos AMF0. Los datos de texto presentan un formato UTF-8 y contienen información adicional sobre el formato, en función de la especificación de texto temporizado 3GP. Esta especificación define un formato de subtítulo estandarizado. Defina un método callback onTextData() para procesar esta información, del mismo modo que definiría métodos callback para onCuePoint o onMetaData. En el siguiente ejemplo, el método onTextData() muestra el número de ID de pista y el texto de pista correspondiente. 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);
}
|
|