Uso di cue point e metadatiFlash 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 pointNella tabella seguente sono descritti i metodi di callback che potete usare per acquisire cue point F4V e FLV in Flash Player e AIR.
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 videoPotete 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 informationNella tabella seguente sono riportati i possibili valori dei metadati video che vengono passati alla funzione di callback onMetaData() nell'oggetto che ricevono:
Nella tabella seguente sono riportati i valori possibili per il parametro videocodecid:
Nella tabella seguente sono riportati i valori possibili per il parametro audiocodecid:
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(). Per ulteriori informazioni su XMP, vedete:
Uso di metadati di immagineL'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 testoL'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);
}
|
|