Используйте методы обратного вызова 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);
}
|
|
|