Uso de puntos de referencia y metadatos

Flash 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 referencia

En 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.

Tiempo de ejecución

F4V

FLV

Flash Player 9/ AIR1.0

OnCuePoint

OnMetaData

Flash Player 10

OnCuePoint

OnMetaData

OnMetaData

OnXMPData

OnXMPData

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ídeo

Las 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 information

La 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:

Parámetro

Descripción

aacaot

Tipo de objeto de audio AAC; se admiten 0, 1 o 2.

avclevel

Número de nivel AVC IDC como, por ejemplo, 10, 11, 20, 21, etc.

avcprofile

Número de perfil AVC como, por ejemplo, 55, 77, 100, etc.

audiocodecid,

Cadena que indica el códec de audio (técnica de codificación/descodificación) utilizado; por ejemplo, “.Mp3” o “mp4a”

audiodatarate

Número que indica la velocidad a la que se ha codificado el audio, expresada en kilobytes por segundo.

audiodelay

Número que indica el tiempo del archivo FLV correspondiente al "tiempo 0" del archivo FLV original. Es necesario demorar ligeramente el contenido del vídeo para sincronizarlo correctamente con el audio.

canSeekToEnd

Un valor booleano que es true si el archivo FLV se codifica con un fotograma clave en el último fotograma, lo que permite buscar hasta el final de un clip de película de descarga progresiva. Es false si el archivo FLV no se codifica con un fotograma clave en el último fotograma.

cuePoints

Conjunto de objetos, uno en cada punto de referencia incorporado en el archivo FLV. El valor es undefined si el archivo FLV no contiene ningún punto de referencia. Cada objeto tiene las siguientes propiedades:

  • type : cadena que especifica el tipo de punto de referencia como "navigation" o "event".

  • name : cadena que indica el nombre del punto de referencia.

  • time : número que indica el tiempo del punto de referencia en segundos, con una precisión de tres decimales (milisegundos).

  • parameters : objeto opcional que tiene pares nombre-valor designados por el usuario durante la creación de los puntos de referencia.

duration

Número que especifica la duración del archivo de vídeo, en segundos.

framerate

Número que especifica la velocidad de fotogramas del archivo FLV.

height

Número que especifica la altura del archivo FLV, en píxeles.

seekpoints

Conjunto que incluye los fotogramas clave disponibles como marcas horarias en milisegundos. Opcional.

etiquetas

Conjunto de pares clave-valor que representa la información en el átomo “ilst”, que es el equivalente de las etiquetas ID3 para archivos MP4. iTunes utiliza estas etiquetas. Se puede utilizar para mostrar ilustraciones, si está disponible.

trackinfo

Objeto que proporciona información sobre todas las pistas del archivo MP4, incluyendo su ID de descripción de ejemplo.

videocodecid,

Cadena que es la versión de códec que se utilizó para codificar el vídeo; por ejemplo, “avc1” o “VP6F”.

videodatarate

Número que especifica la velocidad de datos de vídeo del archivo FLV.

videoframerate

Velocidad de fotogramas del vídeo MP4.

width

Número que especifica la anchura del archivo FLV, en píxeles.

La tabla siguiente muestra los posibles valores del parámetro videocodecid :

videocodecid,

Nombre de códec

2

Sorenson H.263

3

Screen video (solo en SWF versión 7 y posterior)

4

VP6 (solo en SWF versión 8 y posterior)

5

Vídeo VP6 con canal alfa (solo en SWF versión 8 y posterior)

La tabla siguiente muestra los posibles valores del parámetro audiocodecid :

audiocodecid,

Nombre de códec

0

uncompressed

1

ADPCM

2

MP3

4

Nellymoser @ 16 kHz mono

5

Nellymoser, 8kHz mono

6

Nellymoser

10

AAC

11

Speex

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() .

Uso de metadatos de imagen

El 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 texto

El 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); 
}