Uso di cue point e metadati

Flash Player 9 e versioni successive, Adobe AIR 1.0 e versioni successive

Usate i metodi di callback NetStream per acquisire ed elaborare eventi cue point e metadati durante la riproduzione del video.

Uso dei cue point

Nella tabella seguente sono descritti i metodi di callback che potete usare per acquisire cue point F4V e FLV in Flash Player e AIR.

Fase di esecuzione

F4V

FLV

Flash Player 9/ AIR1.0

 

OnCuePoint

   

OnMetaData

Flash Player 10

 

OnCuePoint

 

OnMetaData

OnMetaData

 

OnXMPData

OnXMPData

L'esempio seguente usa un semplice ciclo for..in per eseguire l'iterazione in ciascuna delle proprietà del parametro infoObject ricevuto dalla funzione onCuePoint(). La funzione trace() viene chiamata per visualizzare un messaggio alla ricezione dei dati cue point:

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

Appare l'output seguente:

parameters:  
name: point1 
time: 0.418 
type: navigation

Questo codice usa una delle numerose tecniche disponibili per impostare l'oggetto su cui viene eseguito il metodo di callback. Potete usare anche altre tecniche; per ulteriori informazioni, vedete Scrittura di metodi di callback per metadati e cue point.

Uso di metadati video

Potete usare le funzioni OnMetaData() e OnXMPData() per accedere alle informazioni sui metadati nel file video, compresi i cue point.

Uso di OnMetaData()

I metadati comprendono informazioni sul file video come durata, larghezza, altezza e frequenza dei fotogrammi. Le informazioni sui metadati aggiunte al file video dipendono dal software utilizzato per codificare il file video.

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

Il codice precedente genera un output simile al seguente:

width: 320 
audiodelay: 0.038 
canSeekToEnd: true 
height: 213 
cuePoints: ,, 
audiodatarate: 96 
duration: 16.334 
videodatarate: 400 
framerate: 15 
videocodecid: 4 
audiocodecid: 2
Se il video non dispone dell'audio, le informazioni sui metadati relativi all'audio (come audiodatarate) restituiscono undefined perché durante la codifica non è stata aggiunta ai metadati alcuna informazione sull'audio.

Nel codice precedente, le informazioni sui cue point non erano visualizzate. Per visualizzare i metadati dei cue point, potete usare la funzione seguente che visualizza in modo ricorsivo gli elementi in un oggetto:

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

Se utilizzate lo snippet di codice precedente per tracciare il parametro infoObject nel metodo onMetaData(), viene creato l'output seguente:

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

L'esempio seguente visualizza i metadati per un video MP4. In questo esempio si presume l'esistenza di un oggetto TextArea denominato metaDataOut in cui scrivere i metadati.

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 funzione onMetaData() ha prodotto l'output seguente per il video:

moovposition=731965 
height=352 
avclevel=21 
videocodecid=avc1 
duration=2.36 
width=704 
videoframerate=25 
avcprofile=88 
trackinfo=[object Object]

Uso dell'oggetto information

Nella tabella seguente sono riportati i possibili valori dei metadati video che vengono passati alla funzione di callback onMetaData() nell'oggetto che ricevono:

Parametro

Descrizione

aacaot

Tipo di oggetto audio AAC; sono supportati 0, 1 o 2.

avclevel

Numero di livello AVC IDC quale 10, 11, 20, 21 e così via.

avcprofile

Numero di profilo AVC quale 55, 77, 100 e così via.

audiocodecid

Una stringa che indica il codec audio (tecnica di codifica/decodifica) usato. Ad esempio, “.Mp3” o “mp4a”

audiodatarate

Un numero che indica la frequenza con cui è stato codificato l'audio, espressa in kilobyte al secondo.

audiodelay

Un numero che indica il tempo del file FLV "time 0" del file FLV originale. Il contenuto video deve essere leggermente ritardato per sincronizzare correttamente l'audio.

canSeekToEnd

Un valore booleano che è true se il file FLV viene codificato con un fotogramma chiave sull'ultimo fotogramma che permette di cercare la fine di un file video a scaricamento progressivo. È false se il file FLV non viene codificato con un fotogramma chiave sull'ultimo fotogramma.

cuePoints

Un array di oggetti, uno per ciascun cue point incorporato nel file FLV. Il valore è undefined se il file FLV non contiene cue point. Ciascun oggetto ha le seguenti proprietà:

  • type: una stringa che specifica se il cue point è di tipo "navigation" o "event".

  • name: una stringa che indica il nome del cue point.

  • time: un numero che specifica il tempo del cue point in secondi e considera solo i primi tre decimali (millisecondi).

  • parameters: un oggetto opzionale in cui le coppie nome-valore vengono definite dall'utente durante la creazione dei cue point.

duration

Un numero che specifica la durata del file video, espressa in secondi.

framerate

Un numero che specifica la frequenza dei fotogrammi del file FLV.

height

Un numero che specifica l'altezza del file FLV, espressa in pixel.

seekpoints

Un array che elenca i fotogrammi chiave disponibili come timestamp in millisecondi. Opzionale.

tag

Un array di coppie chiave-valore che rappresenta le informazioni nell'atomo “ilst”, che è l'equivalente dei tag ID3 per i file MP4. iTunes usa questi tag. Può essere usato per visualizzare grafica, se disponibile.

trackinfo

Oggetto che fornisce informazioni su tutte le tracce nel file MP4, compresi gli ID di descrizione di esempio.

videocodecid

Una stringa che indica la versione codec utilizzata per codificare il video. - ad esempio, “avc1” o “VP6F”

videodatarate

Un numero che specifica la velocità dati video del file FLV.

videoframerate

Frequenza di fotogrammi del video MP4.

width

Un numero che specifica la larghezza del file FLV, espressa in pixel.

Nella tabella seguente sono riportati i valori possibili per il parametro videocodecid:

videocodecid

Nome del codec

2

Sorenson H.263

3

Screen video (solo SWF versione 7 e successive)

4

VP6 (solo SWF versione 8 e successive)

5

Video VP6 con canale alfa (solo SWF versione 8 e successive)

Nella tabella seguente sono riportati i valori possibili per il parametro audiocodecid:

audiocodecid

Nome del codec

0

uncompressed

1

ADPCM

2

Mp3

4

Nellymoser @ 16 kHz mono

5

Nellymoser, 8kHz mono

6

Nellymoser

10

AAC

11

Speex

Uso di onXMPData()

La funzione di callback onXMPData() riceve informazioni specifiche di Adobe Extensible Metadata Platform (XMP) che sono incorporate nel file video F4V o FLV Adobe. I metadati XMP includono cue point nonché altri metadati video. Il supporto dei metadati XMP è stato introdotto con Flash Player 10 e Adobe AIR 1.5 ed è presente nelle versioni successive.

L'esempio seguente elabora dati cue point nei metadati 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); 
        } 
    } 
}

Per un file video breve denominato startrekintro.f4v, questo esempio produce le righe di trace seguenti. Le righe mostrano i dati cue point per la navigazione e i cue point di evento nei metadati 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: nei dati XMP, il tempo è memorizzato come tacche DVA anziché come secondi. Per calcolare il tempo del cue point, dividete l'ora di inizio per la frequenza fotogrammi. Ad esempio, l'ora di inizio 7695905817600 divisa per una frequenza fotogrammi di 254016000000 è uguale a 30:30.

Per vedere i metadati XMP originari completi, che includono la frequenza fotogrammi, rimuovete gli identificatori di commento (//) che precedono la seconda e la terza istruzione trace() all'inizio della funzione onXMPData().

Uso di metadati di immagine

L'evento onImageData invia dati dell'immagine come array di byte tramite un canale dati AMF0. Il formato dei dati può essere JPEG, PNG o GIF. Definite un metodo di callback onImageData() per elaborare queste informazioni nello stesso modo in cui definireste i metodi di callback per onCuePoint e onMetaData. L'esempio seguente consente di accedere e visualizzare i dati immagine utilizzando un metodo di 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 di metadati di testo

L'evento onTextData invia i dati di testo tramite un canale dati AMF0. I dati di testo sono in formato UTF-8 e contengono informazioni aggiuntive sulla formattazione in base alla specifica Timed Text 3GP. Questa specifica definisce un formato sottotitoli standard. Definite un metodo di callback onTextData() per elaborare queste informazioni nello stesso modo in cui definireste i metodi di callback per onCuePoint o onMetaData. Nell'esempio seguente, il metodo onTextData() visualizza il numero ID della traccia e il testo della traccia corrispondente.

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