Использование ключевых точек и метаданныхFlash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий Используйте методы обратного вызова NetStream для захвата и обработки событий ключевых точек и метаданных в процессе воспроизведения видео. Использование ключевых точекВ следующей таблице описаны методы обратного вызова, которые можно использовать для захвата ключевых точек F4V- и FLV-файлов в Flash Player и AIR.
В следующем примере используется простой цикл 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, который они получают.
В следующей таблице приводятся возможные значения для параметра videocodecid.
В следующей таблице приводятся возможные значения для параметра audiocodecid.
Использование метода 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);
}
|
|