Verwenden von Cue-Points und Metadaten
Flash 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-Points
In der folgenden Tabelle werden die Rückrufmethoden beschrieben, mit denen Sie in Flash Player und AIR F4V- und FLV-Cue-Points erfassen können.
Laufzeit
|
F4V
|
FLV
|
Flash Player 9/ AIR1.0
|
|
OnCuePoint
|
|
|
OnMetaData
|
Flash Player 10
|
|
OnCuePoint
|
|
OnMetaData
|
OnMetaData
|
|
OnXMPData
|
OnXMPData
|
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-Metadaten
Mithilfe 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 Informationsobjekts
In 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:
Parameter
|
Beschreibung
|
aacaot
|
AAC-Audio-Objekttyp; 0, 1, oder 2 werden unterstützt.
|
avclevel
|
AVC IDC-Levelnummer, zum Beispiel 10, 11, 20, 21 usw.
|
avcprofile
|
AVC-Profilnummer, zum Beispiel 55, 77, 100 usw.
|
audiocodecid
|
Ein String, der angibt, welcher Audio-Codec (Kodier-/Dekodiertechnik) verwendet wurde, zum Beispiel „.Mp3“ oder „mp4a“.
|
audiodatarate
|
Eine Zahl, die die Abtastrate angibt, mit der das Audio kodiert wurde, in Kilobyte pro Sekunde.
|
audiodelay
|
Eine Zahl, die angibt, bei welcher Zeit in der FLV-Datei der Zeitpunkt 0 der ursprünglichen FLV-Datei vorhanden ist. Der Videoinhalt muss leicht verzögert werden, um korrekt mit dem Audio synchronisiert zu werden.
|
canSeekToEnd
|
Ein boolescher Wert. Die Einstellung
true
bedeutet, dass die FLV-Datei mit einem Schlüsselbild im letzten Bild kodiert wurde, das den Suchlauf bis zum Ende einer progressiv heruntergeladenen Videodatei ermöglicht. Der Wert lautet
false
, wenn die FLV-Datei nicht mit einem Schlüsselbild im letzten Bild kodiert wurde.
|
cuePoints
|
Ein Array von Objekten, eines für jeden in die FLV-Datei eingebetteten Cue-Point. Der Wert ist nicht definiert, wenn die FLV-Datei keine Cue-Points enthält. Jedes Objekt hat die folgenden Eigenschaften:
-
type
: ein String, der den Typ des Cue-Points als „navigation“ oder „event“ angibt.
-
name
: ein String, der den Namen des Cue-Points angibt.
-
time
: eine Zahl, die die Zeit des Cue-Points in Sekunden mit einer Genauigkeit von drei Dezimalstellen (Millisekunden) angibt.
-
parameters
: ein optionales Objekt mit Name-Wert-Paaren, die vom Benutzer beim Erstellen des Cue-Points festgelegt wurden.
|
duration
|
Eine Zahl, die die Dauer der Videodatei in Sekunden angibt.
|
framerate
|
Eine Zahl, die die Bildrate der FLV-Datei angibt.
|
height
|
Eine Zahl, die die Höhe der FLV-Datei in Pixel angibt.
|
seekpoints
|
Ein Array, das die verfügbaren Schlüsselbilder als Zeitstempel in Millisekunden auflistet. Optional.
|
tags
|
Ein Array von Schlüssel-Wert-Paaren, die die Informationen im „ilst“-Atom darstellen (entspricht bei MP4-Dateien den ID3-Tags). iTunes verwendet diese Tags. Kann zur Anzeige von Grafiken verwendet werden, falls verfügbar.
|
trackinfo
|
Objekt, das Informationen zu allen Tracks in der MP4-Datei enthält, einschließlich der Sample-Beschreibung-ID.
|
videocodecid
|
Ein String, der die Codec-Version angibt, mit der das Video kodiert wurde. Beispiel: „avc1“ oder „VP6F“
|
videodatarate
|
Eine Zahl, die die Video-Datenrate der FLV-Datei angibt.
|
videoframerate
|
Bildrate des MP4-Videos.
|
width
|
Eine Zahl, die die Breite der FLV-Datei in Pixel angibt.
|
In der folgenden Tabelle sind die möglichen Werte für den Parameter
videocodecid
aufgeführt:
videocodecid
|
Codec-Name
|
2
|
Sorenson H.263
|
3
|
Bildschirmvideo (nur SWF 7 und höher)
|
4
|
VP6 (nur SWF 8 und höher)
|
5
|
VP6-Video mit Alpha-Kanal (nur SWF 8 und höher)
|
In der folgenden Tabelle sind die möglichen Werte für den Parameter
audiocodecid
aufgeführt:
audiocodecid
|
Codec-Name
|
0
|
Unkomprimiert
|
1
|
ADPCM
|
2
|
MP3
|
4
|
Nellymoser bei 16 kHz Mono
|
5
|
Nellymoser, 8 kHz Mono
|
6
|
Nellymoser
|
10
|
AAC
|
11
|
Speex
|
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 Bildmetadaten
Das
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 Textmetadaten
Das
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);
}
|
|
|
|
|