Использование ключевых точек и метаданных

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

Используйте методы обратного вызова NetStream для захвата и обработки событий ключевых точек и метаданных в процессе воспроизведения видео.

Использование ключевых точек

В следующей таблице описаны методы обратного вызова, которые можно использовать для захвата ключевых точек F4V- и FLV-файлов в Flash Player и AIR.

Среда выполнения

F4V

FLV

Flash Player 9/ AIR1.0

OnCuePoint

OnMetaData

Flash Player 10

OnCuePoint

OnMetaData

OnMetaData

OnXMPData

OnXMPData

В следующем примере используется простой цикл for..in , повторяемый для каждого свойства в параметре infoObject , который получает функция onCuePoint() . При получении данных ключевой точки вызывается функция trace() для отображения сообщения.

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

На экран выводится следующее:

parameters:  
name: point1 
time: 0.418 
type: navigation

Этот код использует один из нескольких приемов для назначения объекта, для которого выполняется метод обратного вызова. Можно использовать и другие приемы. Дополнительные сведения см. в разделе « Написание методов обратного вызова для метаданных и ключевых точек ».

Использование метаданных видео

Функции OnMetaData() и OnXMPData() можно использовать для доступа к метаданным в видеофайле, включая ключевые точки.

Использование метода OnMetaData()

Метаданные содержат информацию о видеофайле, такую как продолжительность, ширину, высоту и частоту кадров. Метаданные, добавляемые в видеофайл, зависят то программного обеспечения, используемого для его кодирования.

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

Предыдущий код генерирует следующий вывод:

width: 320 
audiodelay: 0.038 
canSeekToEnd: true 
height: 213 
cuePoints: ,, 
audiodatarate: 96 
duration: 16.334 
videodatarate: 400 
framerate: 15 
videocodecid: 4 
audiocodecid: 2
Если видео не содержит аудиоданных, то метаданные, связанные со звуком (например, audiodatarate ) возвращают значение undefined , так как во время кодировки в метаданные не были добавлены сведения о звуке.

В предыдущем коде не отображается информация о ключевых точках. Чтобы показать метаданные о ключевых точках, можно использовать следующую функцию, которая рекурсивно отображает элементы в экземпляре 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); 
        } 
    } 
}

Если применить предыдущий код для отслеживания параметра infoObject в методе onMetaData() , мы получим следующий вывод:

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

Следующий код отображает метаданные для видео в формате MP4. Для выполнения этого примера требуется объект TextArea с именем metaDataOut , в который будут записываться метаданные

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

Функция onMetaData() возвращает следующий вывод для данного аудиофайла:

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

Использование информационного объекта

В следующей таблице приводятся возможные значения для метаданных видеофайла, которые передаются функции обратного вызова onMetaData() в экземпляре Object, который они получают.

Параметр

Описание

aacaot

Тип аудиообъекта AAC; поддерживаются значения 0, 1 или 2.

avclevel

Номер уровня AVC IDC, например 10, 11, 20, 21 и т. д.

avcprofile

Номер профиля AVC, например 55, 77, 100 и т. д.

audiocodecid

Строка, обозначающая использованный аудиокодек (прием кодирования/декодирования), например «Mp3» или «mp4a».

audiodatarate

Число, обозначающие частоту, с которой был закодирован звук (килобайты в секунду).

audiodelay

Число, обозначающее время, которое соответствует времени «time 0» исходного FLV-файла. Для правильной синхронизации со звуком воспроизведение видео должно начинаться с задержкой.

canSeekToEnd

Логический параметр принимает значение true , если FLV-файл закодирован с ключевым кадром в последнем кадре, позволяющий перемещаться в конец последовательно загружаемого видеофайла. Значение параметра false , если FLV-файл не имеет ключевого кадра в последнем кадре.

cuePoints

Массив объектов, один для каждой ключевой точки, встроенный в FLV-файл. Значение не определено, если FLV-файл не имеет ключевых точек. Каждый объект имеет следующие свойства:

  • type : строка, определяющая тип ключевой точки: «navigation» (ключевая точка навигации) или «event» (ключевая точка события).

  • name : строка, являющаяся именем ключевой точки.

  • time : число, являющееся временем ключевой точки в секундах с точностью до третьего десятичного знака (миллисекунды).

  • parameters : необязательный параметр, имеющий пары «имя-значение», назначаемые пользователем при создании ключевых точек.

duration

Число, определяющее продолжительность видеофайла (в секундах).

framerate

Частота кадров FLV-файла.

height

Число, указывающее высоту видео в FLV-файле, в пикселах.

seekpoints

Массив, в котором перечислены доступные ключевые кадры в виде меток времени, в миллисекундах. Необязательно.

tags

Массив пар «ключ-значение», которые представляют сведения в атоме «ilst», эквивалентные тегам ID3 для MP4-файлов. Эти теги использует iTunes. Если они имеются, их можно использовать для отображения графических объектов.

trackinfo

Объект, предоставляющий информацию обо всех треках в MP4-файле, включая образец идентификатора описания.

videocodecid

Строка, указывающая версию кодека, который использовался для кодирования видео, например «avc1» или «VP6F».

videodatarate

Скорость передачи видеоданных FLV-файла.

videoframerate

Частота кадров видео в формате MP4.

width

Число, указывающее ширину видео в FLV-файле, в пикселах.

В следующей таблице приводятся возможные значения для параметра videocodecid .

videocodecid

Имя кодека

2

Sorenson H.263

3

Screen video (только для SWF версии 7 и более поздних)

4

VP6 (только для SWF версии 8 и более поздних)

5

VP6-видео с альфа-каналом (только для SWF версии 8 и более поздних)

В следующей таблице приводятся возможные значения для параметра audiocodecid .

audiocodecid

Имя кодека

0

несжатый

1

ADPCM

2

Mp3

4

Nellymoser, 16 кГц, моно

5

Nellymoser, 8 кГц, моно

6

Nellymoser

10

AAC

11

Speex

Использование метода onXMPData()

Функция обратного вызова onXMPData() получает информацию о расширяемой платформе метаданных Adobe Extensible Metadata Platform (XMP), встроенной в видеофайл Adobe F4V или FLV. Метаданные XMP включают ключевые точки и другие метаданные о видеофайле. Поддержка метаданных XMP впервые реализована в приложениях Flash Player 10 и Adobe AIR 1.5 и закреплена в последующих версиях.

Следующий пример обрабатывает сведения о ключевых точках в метаданных 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); 
        } 
    } 
}

В коротком видеофайле с именем startrekintro.f4v этот пример выводит следующие строки отслеживания: Эти строки отображают данные о ключевых точках навигации и событий в метаданных 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
Примечание. В метаданных XMP время сохраняется не в секундах, а в тактах DVA. Чтобы вычислить время ключевой точки, необходимо разделить время начала на частоту кадров. Например, время 7695905817600, разделенное на частоту кадров 254016000000 равно 30:30.

Чтобы полностью просмотреть необработанные данные XMP, включая частоту кадров, уберите идентификаторы комментариев (косые черты «//») перед вторым и третьим выражением trace() в начале функции onXMPData() .

Дополнительные сведения о метаданных XMP см. в разделах:

Использование графических метаданных

Событие onImageData отправляет графические данные в виде байтового массива по каналу данных AMF0. Данные могут иметь формат JPEG, PNG или GIF. Определите метод обратного вызова onImageData() для обработки этой информации так же, как методы обратного вызова для событий onCuePoint и onMetaData . В следующем примере используется метод 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); 
} 

Использование текстовых метаданных

Событие onTextData отправляет текстовые данные по каналу данных AMF0. Текстовые данные представлены в формате UTF-8 и содержат дополнительную информацию о форматировании на основе спецификации синхронизированного текста 3GP. Эта спецификация определяет стандартизированный формат субтитров. Определите метод обратного вызова onTextData() для обработки этой информации так же, как методы обратного вызова для событий onCuePoint и onMetaData . В следующем примере метод onTextData() отображает идентификационный номер трека и соответствующий текст.

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