Давно не трогал AS2. Я сделал базовый тест и нашел, что Ближайшая точка сработала. Вы используете компонент FLVPlayback, верно?
Вот что я попробовал:
videoPlayer.autoPlay = false;
onEnterFrame = function():Void{
videoPlayer.seekPercent(_xmouse/Stage.width * 100);
videoPlayer.play();
trace(videoPlayer.findNearestCuePoint(videoPlayer.playheadTime).name);
}
Рекомендованным способом было бы найти ближайшую ключевую точку в обработчике playheadUpdate , который срабатывает после того, как точка воспроизведения меняет свое значение. (например, 1. дать указание игровой головке двигаться, 2. игровая головка фактически меняет значение, 3. вызывается playheadUpdate)
Вот более простой подход:
onEnterFrame = function():Void{
if(videoPlayer.metadata) trace(videoPlayer.findNearestCuePoint(_xmouse/Stage.width * videoPlayer.metadata.duration).name);
}
В моем тесте я добавил 4 ключевых пункта. Перепробовал их все: Actionscript / Event / Navigation.
Странная вещь была, когда я пытался получить доступ к свойству cuePoints через videoPlayer
или через videoPlayer.metadata я получил массив из 8 неопределенных объектов, и длина массива составляла 4, когда я его отслеживал. Не знаю, в чем проблема, может быть, совместимость с кодировкой / кодеком и as2, не уверен.
В любом случае ... если у вас есть массив cuePoints, вы можете вручную найти ближайший из них, выполнив циклическое выполнение всех из них и получив наименьшую абсолютную разницу между каждым временем ключевой точки и текущим временем:
function getClosestCuePoint(cuePoints:Array,time:Number):Object{
var numCuePoints:Number = cuePoints.length;
var minDist:Number = 100000000,result:Object;
for(var i:Number = 0 ; i < numCuePoints ; i++){
if(Math.abs(cuePoints[i].time - time) < minDist){
minDist = Math.abs(cuePoints[i].time - time);
result = cuePoints[i];
}
}
return result;
}
Вот пример макета: давайте представим, что некоторые прямоугольники на экране - это ключевые точки, а позиция _xmouse будет временем воспроизведения. Попробуйте это в новом документе:
//fake cue points
var numCuePoints:Number = 5;
var cuePoints = [];
for(var i:Number = 0 ; i < numCuePoints ; i++) cuePoints[i] = {name:'narration ' + (i+1),time: 10 + (80 + Math.random() * 20) * i}
//visual hint - separated from the cue points
for(var i:Number = 0 ; i < numCuePoints ; i++) drawBox(this,0x009900,10,15,cuePoints[i].time,Stage.width * .5);
var playhead:TextField = drawText(this,'playhead');
//playhead update
onEnterFrame = function():Void{
playhead._x = _xmouse;
playhead.setTextFormat(new TextFormat('Verdana',11));
playhead.text = 'time: ' + _xmouse+' / cue ' + getClosestCuePoint(cuePoints,_xmouse).name;
}
//find the shortest marker within the shortest distance from the current value
function getClosestCuePoint(cuePoints:Array,time:Number):Object{
var numCuePoints:Number = cuePoints.length;
var minDist:Number = 100000000,result:Object;
for(var i:Number = 0 ; i < numCuePoints ; i++){
if(Math.abs(cuePoints[i].time - time) < minDist){
minDist = Math.abs(cuePoints[i].time - time);
result = cuePoints[i];
}
}
return result;
}
//utils
function drawBox(target:MovieClip,color:Number,width:Number,height:Number,x:Number,y:Number):Void{
target.lineStyle(3,color);
target.moveTo(x,y);
target.lineTo(x+width,y);
target.lineTo(x+width,y+height);
target.lineTo(x,y+height);
target.lineTo(x,y);
}
function drawText(target:MovieClip,name:String):TextField{
var result:TextField = target.createTextField(name,target.getNextHighestDepth(),0,Stage.width * .5-20,100,20);
result.autoSize = 'left';
result.border = true;
result.selectable = false;
return result;
}
НТН