Uso de pontos de sinalização e metadados

Flash Player 9 e posterior, Adobe AIR 1.0 e posterior

Use os métodos de retorno de chamada NetStream para capturar e processar eventos de metadados e de ponto de sinalização durante a reprodução do vídeo.

Uso de pontos de sinalização

A tabela a seguir descreve os métodos de retorno de chamada que você pode usar para capturar pontos de sinalização F4V e FLV no Flash Player e no AIR.

Tempo de execução

F4V

FLV

Flash Player 9/AIR1.0

OnCuePoint

OnMetaData

Flash Player 10

OnCuePoint

OnMetaData

OnMetaData

OnXMPData

OnXMPData

O exemplo a seguir usa um loop for..in simples para se repetir em cada uma das propriedades do parâmetro infoObject que a função onCuePoint() recebe. Ele chama a função trace() para exibir uma mensagem quando recebe dados de ponto de sinalizaçã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 onCuePoint(infoObject:Object):void 
{ 
    var key:String; 
    for (key in infoObject) 
    { 
        trace(key + ": " + infoObject[key]); 
    } 
}

Aparece a seguinte saída:

parameters:  
name: point1 
time: 0.418 
type: navigation

Este código usa uma das várias técnicas para definir o objeto no qual é executado o método de retorno de chamada. Você pode usar outras técnicas; para obter mais informações, consulte Criação de métodos de retorno de chamada para metadados e pontos de sinalização .

Uso de metadados de vídeo

É possível usar as funções OnMetaData() e OnXMPData() para acessar as informações de metadados do arquivo de vídeo, inclusive pontos de sinalização.

Uso de OnMetaData()

Os metadados incluem informações sobre o arquivo de vídeo, como duração, largura, altura e taxa de quadros. As informações dos metadados que são adicionadas ao arquivo de vídeo dependem do software utilizado para codificar o arquivo.

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

O código anterior gera uma saída parecida com esta:

width: 320 
audiodelay: 0.038 
canSeekToEnd: true 
height: 213 
cuePoints: ,, 
audiodatarate: 96 
duration: 16.334 
videodatarate: 400 
framerate: 15 
videocodecid: 4 
audiocodecid: 2
Se o seu vídeo não tem áudio, as informações de metadados relacionadas a áudio (como audiodatarate ) retornam undefined , pois nenhuma informação de áudio é adicionada aos metadados durante a codificação.

No código anterior, as informações de ponto de sinalização não eram exibidas. Para exibir os metadados de ponto de sinalização, use esta função, que exibe os itens recursivamente em um Object:

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

O uso do snippet de código anterior para rastrear o parâmetro infoObject no método onMetaData() gera a seguinte saída:

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

O exemplo a seguir exibe os metadados de um vídeo MP4. Ele pressupõe que existe um objeto TextArea chamado metaDataOut , no qual grava os metadados.

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

A função onMetaData() gerou a seguinte saída para esse vídeo:

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

Uso do objeto de informação

A tabela a seguir mostra os possíveis valores para os metadados de vídeo que são passados à função de retorno de chamada onMetaData() no Object por eles recebido:

Parâmetro

Descrição

aacaot

Tipo de objeto de áudio AAC; são suportados os valores 0, 1 ou 2.

avclevel

Número de nível AVC IDC, como 10, 11, 20, 21 e assim por diante.

avcprofile

Número de perfil AVC, como 55, 77, 100 e assim por diante.

audiocodecid

String que indica o codec de áudio (técnica de codificação/decodificação) que foi usado; por exemplo “.Mp3” ou “mp4a”

audiodatarate

Número que indica a taxa de codificação de áudio, em KB por segundo.

audiodelay

Número que indica em que tempo do arquivo FLV está "time 0" do arquivo FLV original. O conteúdo do vídeo precisa ter um pequeno atraso para que o áudio seja sincronizado corretamente.

canSeekToEnd

Um valor booliano que é true se o arquivo FLV está codificado com um quadro-chave no último quadro, o que permite fazer a busca até o final de um arquivo de vídeo com download progressivo. É falso se o arquivo FLV não está codificado com um quadro-chave no último quadro.

cuePoints

Uma matriz de objetos, uma para cada ponto de sinalização incorporado no arquivo FLV. O valor é indefinido se o arquivo FLV não contiver pontos de sinalização. Cada objeto tem as seguintes propriedades:

  • type : string que especifica o tipo do ponto de sinalização como "navegação" ou "evento".

  • name : string que é o nome do ponto de sinalização.

  • time : número que é a hora do ponto de sinalização em segundos, com uma precisão de três casas decimais (milésimos de segundo).

  • parameters : objeto opcional que tem pares de nome/valor que o usuário designa ao criar os pontos de sinalização.

duration

Um número que representa a duração do arquivo de vídeo em segundos.

framerate

Um número que representa a taxa de quadros do arquivo FLV.

height

Um número que representa a altura do arquivo FLV em pixels.

seekpoints

Uma matriz que lista os quadros-chave disponíveis como carimbos de data/hora em milésimos de segundo. Opcional.

tags

Uma matriz de pares chave/valor que representam as informações no núcleo “ilst”, que é o equivalente de tags ID3 para arquivos MP4. O iTunes usa essas tags. Pode ser usado para exibir arte-final, se disponível.

trackinfo

Objeto que fornece informações sobre todas as faixas do arquivo MP4, inclusive o ID de descrição da amostra.

videocodecid

Uma string que representa a versão de codec que foi usada para codificar o vídeo. - por exemplo, “avc1” ou “VP6F”

videodatarate

Um número que representa a taxa de dados do vídeo do arquivo FLV.

videoframerate

Taxa de quadros do vídeo MP4.

width

Um número que representa a largura do arquivo FLV em pixels.

A tabela a seguir mostra os valores possíveis para o parâmetro videocodecid :

videocodecid

Nome do codec

2

Sorenson H.263

3

Vídeo de tela (somente SWF versão 7 e posteriores)

4

VP6 (somente SWF versão 8 e posteriores)

5

Vídeo VP6 com canal alfa (somente SWF versão 8 e posteriores)

A tabela a seguir mostra os valores possíveis para o parâmetro audiocodecid :

audiocodecid

Nome do codec

0

não compactado

1

ADPCM

2

Mp3

4

Nellymoser @ 16 kHz mono

5

Nellymoser, 8 kHz mono

6

Nellymoser

10

AAC

11

Speex

Uso de onXMPData()

A função de retorno de chamada onXMPData() recebe informações específicas da plataforma XMP (Extensible Metadata Platform) da Adobe que são incorporadas ao arquivo de vídeo Adobe F4V ou FLV. Os metadados XMP incluem pontos de sinalização e outros metadados de vídeo. O suporte para metadados XMP foi introduzido com o Flash Player 10 e o Adobe AIR 1.5 e é suportado pelas versões subsequentes.

Este exemplo processa dados de ponto de sinalização nos metadados 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); 
        } 
    } 
}

No caso de um arquivo de vídeo curto chamado startrekintro.f4v, este exemplo produz as linhas de rastreamento a seguir. As linhas mostram os dados de ponto de sinalização referentes a pontos de sinalização de navegação e de eventos nos metadados 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: Nos dados XMP, o tempo é armazenado como Tiques DVA e não como segundos. Para calcular o tempo do ponto de sinalização, divida a hora inicial pela taxa de quadros. Por exemplo, a hora inicial de 7695905817600 dividida por uma taxa de quadros de 254016000000 é igual a 30:30.

Para ver os metadados XMP brutos completos, que incluem a taxa de quadros, remova os identificadores de comentário (//’s) que precedem a segunda e a terceira instruções trace() no início da função onXMPData() .

Uso de metadados de imagem

O evento onImageData envia dados de imagem como uma matriz de bytes por um canal de dados AMF0. Os dados podem estar nos formatos JPEG, PNG ou GIF. Defina um método de retorno de chamada onImageData() para processar essas informações, da mesma forma que você definiria métodos de retorno de chamada para onCuePoint e onMetaData . Este exemplo acessa e exibe dados de imagem usando um método de retorno de chamada 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 de metadados de texto

O evento onTextData envia dados de texto por meio de um canal de dados AMF0. Os dados de texto estão no formato UTF-8 e contêm informações adicionais sobre formatação com base na especificação de texto com tempo 3GP. Essa especificação define um formato de legenda padronizado. Defina um método de retorno de chamada onTextData() para processar essas informações, da mesma forma que você definiria métodos de retorno de chamada para onCuePoint ou onMetaData . No próximo exemplo, o método onTextData() exibe o número de identificação da faixa e o texto da faixa correspondente.

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