Verwenden von Cue-Points und MetadatenFlash Player 9 und höher, Adobe AIR 1.0 und höher Mit den NetStream-Rückrufmethoden können Sie während der Videowiedergabe Cue-Point- und Metadatenereignisse erfassen und verarbeiten. Verwenden von Cue-PointsIn der folgenden Tabelle werden die Rückrufmethoden beschrieben, mit denen Sie in Flash Player und AIR F4V- und FLV-Cue-Points erfassen können.
Im folgenden Beispiel wird eine einfache for..in-Schleife verwendet, um jede Eigenschaft im infoObject-Parameter, der von der onCuePoint()-Funktion empfangen wird, zu durchlaufen. Die trace()-Funktion wird aufgerufen, um eine Meldung anzuzeigen, wenn die Cue-Point-Daten empfangen werden: 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]);
}
}
Die folgende Ausgabe wird angezeigt: parameters: name: point1 time: 0.418 type: navigation In diesem Code wird eines von mehreren möglichen Verfahren zum Festlegen des Objekts verwendet, für das die Rückrufmethode ausgeführt wird. Sie können auch andere Techniken verwenden; weitere Informationen finden Sie unter Schreiben von Rückrufmethoden für Metadaten und Cue-Points. Verwenden von Video-MetadatenMithilfe der OnMetaData()- und OnXMPData()-Funktionen können Sie auf die Metadateninformationen in der Videodatei, einschließlich von Cue-Points, zugreifen. Verwenden von OnMetaData()Metadaten enthalten Angaben zur Videodatei wie Wiedergabedauer, Breite, Höhe und Bildrate. Welche Metadateninformationen Ihrer Videodatei hinzugefügt werden, ist von der Software abhängig, mit der Sie die Videodatei kodiert haben. 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]);
}
}
Mit dem oben stehenden Code wird folgende Ausgabe generiert: width: 320 audiodelay: 0.038 canSeekToEnd: true height: 213 cuePoints: ,, audiodatarate: 96 duration: 16.334 videodatarate: 400 framerate: 15 videocodecid: 4 audiocodecid: 2 Wenn das Video keine Audiodaten enthält, geben die audiobezogenen Metadateninformationen (z. B. audiodatarate) den Wert undefined zurück, da den Metadaten beim Kodieren keine Audioinformationen hinzugefügt werden.Im oben stehenden Code wurden die Cue-Point-Informationen nicht angezeigt. Um die Cue-Point-Metadaten anzuzeigen, können Sie die folgenden Funktion verwenden, mit der die Elemente in einem Objekt rekursiv angezeigt werden: 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);
}
}
}
Mithilfe des vorangegangenen Codeausschnitts zum Senden des infoObject-Parameters in der onMetaData()-Methode wird die folgende Ausgabe erstellt: 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
Im folgenden Beispiel werden die Metadaten für ein MP4-Video angezeigt. Es wird vorausgesetzt, dass ein TextArea-Objekt namens metaDataOut vorhanden ist, in das die Metadaten geschrieben werden. 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;
}
}
}
Die onMetaData()-Funktion hat für dieses Video die folgende Ausgabe erzeugt: moovposition=731965 height=352 avclevel=21 videocodecid=avc1 duration=2.36 width=704 videoframerate=25 avcprofile=88 trackinfo=[object Object] Verwenden des InformationsobjektsIn der folgenden Tabelle sind die möglichen Werte für Video-Metadaten aufgeführt, die an die onMetaData()-Rückruffunktion im von ihnen empfangenen Objekt übergeben werden:
In der folgenden Tabelle sind die möglichen Werte für den Parameter videocodecid aufgeführt:
In der folgenden Tabelle sind die möglichen Werte für den Parameter audiocodecid aufgeführt:
Verwenden von onXMPData()Die onXMPData()-Rückruffunktion empfängt spezifische Informationen der Adobe Extensible Metadata Platform (XMP), die in der Adobe F4V- oder FLV-Videodatei eingebettet sind. Die XMP-Metadaten enthalten sowohl Cue-Points als auch andere Video-Metadaten. XMP-Metadaten werden mit Flash Player 10 und Adobe 1.5 eingeführt und werden von späteren Versionen unterstützt. Im folgenden Beispiel werden in den XMP-Metadaten enthaltene Cue-Point-Daten verarbeitet: 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);
}
}
}
Bei einer kurzen Videodatei namens „startrekintro.f4v“ werden im Beispiel die folgenden trace-Linien erzeugt. Die Linien zeigen die Cue-Point-Daten für Navigations- und Ereignis-Cue-Points in den XMP-Metadaten: 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
Hinweis: In XMP-Daten wird die Zeit in Form von „DVA Ticks“ anstelle von Sekunden gespeichert. Sie berechnen die Cue-Point-Zeit, indem Sie die Startzeit durch die Bildrate teilen. Beispiel: Die Startzeit 7695905817600 geteilt durch die Bildrate 254016000000 ist gleich 30:30.
Um die vollständigen unformatierten XMP-Metadaten, einschließlich der Bildrate, zu sehen, müssen Sie die Anmerkungsbezeichner (//) vor der zweiten und dritten trace()-Anweisung am Anfang der onXMPData()-Funktion entfernen. Weitere Informationen zu XMP finden Sie unter:
Verwenden von BildmetadatenDas onImageData-Ereignisobjekt sendet Bilddaten als Byte-Array über einen AMF0-Datenkanal Die Daten können im Format JPEG, PNG oder GIF vorliegen. Definieren Sie eine onImageData()-Rückrufmethode zur Verarbeitung dieser Informationen wie Sie Rückrufmethoden für onCuePoint und onMetaData definieren würden. Im folgenden Beispiel wird eine onImageData()-Rückrufmethode verwendet, um auf Bilddaten zuzugreifen und diese anzuzeigen: 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);
}
Verwenden von TextmetadatenDas onTextData-Ereignis sendet Textdaten über einen AMF0-Datenkanal. Die Textdaten liegen im Format UTF-8 vor und enthalten zusätzliche Informationen über Formatierungen, die auf der „3GP Timed Text“-Spezifikation basieren. Diese Spezifikation definiert ein standardisiertes Format für Untertitel. Definieren Sie eine onTextData()-Rückrufmethode zur Verarbeitung dieser Informationen wie Sie Rückrufmethoden für onCuePoint oder onMetaData definieren würden. Im folgenden Beispiel wird die onTextData()-Methode verwendet, um die Track-ID und den entsprechenden Tracktext anzuzeigen. 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);
}
|
|