Utilisation des points de repère et des métadonnées

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Les méthodes de rappel NetStream vous permettent de capturer et de traiter les événements de point de repère et de métadonnées lorsque la vidéo est en cours de lecture.

Utilisation des points de repère

Le tableau ci-dessous décrit les méthodes de rappel que vous pouvez utiliser pour capturer les points de repère F4V et FLV dans Flash Player et AIR.

Moteur d’exécution

F4V

FLV

Flash Player 9/ AIR1.0

 

OnCuePoint

   

OnMetaData

Flash Player 10

 

OnCuePoint

 

OnMetaData

OnMetaData

 

OnXMPData

OnXMPData

L’exemple suivant utilise une boucle for..in simple pour effectuer une itération sur chaque propriété du paramètre infoObject que reçoit la fonction onCuePoint(). Il appelle à fonction trace() pour afficher un message lors de la réception de données de point de repère :

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

Le résultat suivant apparaît :

parameters:  
name: point1 
time: 0.418 
type: navigation

Ce code utilise l’une des techniques disponibles pour définir l’objet pour lequel la méthode de rappel est exécutée. Vous pouvez utiliser d’autres techniques ; pour plus d’informations, voir Ecriture de méthodes de rappel pour les métadonnées et les points de repère.

Utilisation des métadonnées de la vidéo

Vous pouvez utiliser les fonctions OnMetaData() et OnXMPData() pour accéder à des informations sur les métadonnées dans votre fichier vidéo, y compris les points de repère.

Utilisation d’OnMetaData()

Ces métadonnées comprennent des informations sur le fichier vidéo (durée, largeur et hauteur d’image, cadence). Les informations de métadonnées ajoutées à votre fichier vidéo dépendent du logiciel que vous utilisez pour coder le fichier vidéo.

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

Le code précédent génère un résultat similaire à celui-ci :

width: 320 
audiodelay: 0.038 
canSeekToEnd: true 
height: 213 
cuePoints: ,, 
audiodatarate: 96 
duration: 16.334 
videodatarate: 400 
framerate: 15 
videocodecid: 4 
audiocodecid: 2
Si la vidéo ne contient pas de son, les informations de métadonnées associées à l’audio (telles que audiodatarate) renvoient undefined, car aucune information audio n’est ajoutée aux métadonnées pendant l’encodage.

Dans le code ci-dessus, les informations de point de repère n’étaient pas affichées. Pour afficher les informations de point de repère, utilisez la fonction suivante, qui affiche de façon récursive les éléments d’un objet :

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

L’utilisation du code ci-dessus pour suivre le paramètre infoObject de la méthode onMetaData() produit le résultat suivant :

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’exemple suivant affiche les métadonnées d’une vidéo MP4. Cet exemple suppose qu’il existe un objet TextArea appelé metaDataOut sur lequel il écrit les métadonnées.

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 fonction onMetaData() a produit le résultat suivant pour cette vidéo :

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

Utilisation de l’objet Information

Le tableau ci-dessous indique les valeurs possibles pour des métadonnées de vidéo qui sont transmises à la fonction de rappel onMetaData() dans l’objet qu’elles reçoivent :

Paramètre

Description

aacaot

Type d’objet audio AAC ; 0, 1 ou 2 pris en charge.

avclevel

Numéros de niveau AVC IDC, tels que 10, 11, 20, 21, et ainsi de suite.

avcprofile

Numéros de profil AVC, tel que 55, 77, 100, et ainsi de suite.

audiocodecid

Chaîne qui indique le codec audio (technique de codage/décodage) utilisé ; par exemple, « .Mp3 » ou « mp4a ».

audiodatarate

Nombre qui indique le taux d’encodage du son, en ko/s.

audiodelay

Nombre qui indique la valeur temporelle 0 du fichier FLV d’origine. Le contenu vidéo doit être légèrement retardé pour synchroniser correctement l’audio.

canSeekToEnd

Valeur booléenne définie sur true si le fichier FLV est codé avec une image-clé sur la dernière image, qui permet de rechercher jusqu’à la fin d’un fichier vidéo téléchargé progressivement. Elle est définie sur false si le fichier FLV n’est pas codé avec une image-clé sur la dernière image.

cuePoints

Tableau d’objets (un par point de repère intégré dans le fichier FLV). Cette valeur n’est pas définie si le fichier FLV ne contient pas de points de repère. Chaque objet possède les propriétés ci-dessous.

  • type : chaîne qui spécifie le type de point de repère : « navigation » ou « event ».

  • name : chaîne représentant le nom du point de repère.

  • time : nombre correspondant à l’heure du point de repère (en secondes) avec une précision de trois chiffres (millisecondes).

  • parameters : objet facultatif possédant des paires nom-valeur désignées par l’utilisateur au moment de la création des points de repère.

duration

Nombre indiquant la durée du fichier vidéo, en secondes.

framerate

Nombre indiquant la fréquence d’images du fichier FLV.

height

Nombre indiquant la hauteur du fichier FLV, en pixels.

seekpoints

Tableau qui répertorie les images-clés disponibles en tant que cachets d’horodatage, en millisecondes. Facultatif.

balises

Tableau de paires clé-valeur qui représente les informations dans l’atome « ilst » (l’équivalent des balises ID3 des fichiers MP4). iTunes utilise ces balises. Elles peuvent être utilisées pour afficher des illustrations, le cas échéant.

trackinfo

Objet qui fournit des informations sur toutes les pistes d’un fichier MP4, y compris sur l’ID de description de l’échantillonnage.

videocodecid

Chaîne indiquant la version codec utilisée pour coder la vidéo. Par exemple : « avc1 » ou « VP6F ».

videodatarate

Nombre indiquant la vitesse de transmission vidéo du fichier FLV.

videoframerate

Cadence de la vidéo MP4.

width

Nombre indiquant la largeur du fichier FLV, en pixels.

Le tableau suivant répertorie les valeurs possibles du paramètre videocodecid :

videocodecid

Nom du codec

2

Sorenson H.263

3

Screen video (SWF versions 7 et les versions ultérieures uniquement)

4

VP6 (SWF versions 8 et les versions ultérieures uniquement)

5

VP6 avec canal alpha (SWF versions 8 et les versions ultérieures uniquement)

Le tableau suivant répertorie les valeurs possibles du paramètre audiocodecid :

audiocodecid

Nom du codec

0

non compressé

1

ADPCM

2

Mp3

4

Nellymoser @ 16 kHz mono

5

Nellymoser, 8kHz mono

6

Nellymoser

10

AAC

11

Speex

Utilisation d’onXMPData()

La fonction de rappel onXMPData() reçoit des informations spécifiques à Adobe Extensible Metadata Platform (XMP) intégrée dans le fichier vidéo Adobe F4V ou FLV. Les métadonnées XMP contiennent des points de repère et d’autres métadonnées de vidéo. La prise en charge des métadonnées XMP a été intégrée à Flash Player 10 et Adobe AIR 1.5, et est assurée par les versions ultérieures.

L’exemple suivant traite les données de points de repère dans des métadonnées 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); 
        } 
    } 
}

Pour un fichier vidéo court appelé startrekintro.f4v, cet exemple produit les lignes de suivi ci-dessous. Les lignes montrent les données des points de repère pour les points de repère de navigation et d’événement dans les métadonnées 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
Remarque : dans les données XMP, le temps est stocké en unités DVA plutôt qu’en secondes Pour calculer le temps du point de repère, divisez l’heure de démarrage par la cadence. Par exemple, l’heure de démarrage de 7695905817600 divisé par une cadence de 254016000000 est égal à 30:30.

Pour voir les métadonnées XMP brutes au complet, qui contiennent la cadence, retirez les identificateurs de commentaires (//) qui précèdent les deuxièeme et troisième instructions trace() au début de la fonction onXMPData().

Utilisation des métadonnées de l’image

L’événement onImageData envoie les données d’image sous la forme d’un tableau d’octets par l’intermédiaire d’un canal de données AMF0. Les données peuvent être au format JPEG, PNG ou GIF. Définissez une méthode de rappel onImageData() pour traiter ces informations, de la même manière que vous définiriez des méthodes de rappel pour onCuePoint et onMetaData. L’exemple suivant accède aux données d’image et les affiche à l’aide d’une méthode de rappel 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); 
} 

Utilisation des métadonnées du texte

L’événement onTextData envoie des données de texte par le biais d’un canal de données AMF0. Les données de texte sont au format UTF-8 et contiennent des informations supplémentaires sur la mise en forme basées sur la spécification Timed Text 3GP. Cette spécification définit un format de sous-titrage normalisé. Définissez une méthode de rappel onTextData() pour traiter ces informations, de la même manière que vous définiriez des méthodes de rappel pour onCuePoint ou onMetaData. Dans l’exemple suivant, la méthode onTextData() affiche le numéro d’identification de la piste, ainsi que le texte correspondant à la piste.

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