Actionscript 2: Ключевые точки события: findNearestCuePoint - PullRequest
1 голос
/ 10 августа 2011

Привет всем и всем!

Хорошо ... Я бился головой об стену с этой проблемой буквально несколько недель, но я все еще не могу найти ответ, который успешно разрешил проблему.

Я создал FLA и поместил компонент FLV с именем экземпляра videoPlay на сцену.

videoPlay подключается к потоковому FLV со встроенными точками событий. Контрольные точки нумеруются последовательно от повествования1 к повествованию16.

Я установил объект слушателя:

     var videoPlayCuePointListener:Object = new Object();

Прослушиватель событий для ключевых точек:

   videoPlayCuePointListener.cuePoint = function(eventObject:Object):Void{
   if(eventObject.info.name == "narration1"){_root.cc_box.cc_txt.htmlText = cueTxt1);}
   else if(eventObject.info.name == "narration2"){_root.cc_box.cc_txt.htmlText = cueTxt2);}
   etc, through narration16 }

и так далее в повествовании16.

Затем я подключил слушатель событий к компоненту FLV на сцене:

   videoPlay.addEventListener("cuePoint", videoPlayCuePointListener);

Все это работает очень хорошо. Во время воспроизведения FLV каждая ключевая точка события запускает правильный текст в динамическое текстовое поле cc_txt.

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

Я исследовал это так тщательно, как только мог, прежде чем, наконец, решил опубликовать проблему, но хотя документация и различные публикации, касающиеся findNearestCuePoint, обнаруженные в Интернете, предоставили множество примеров, ни один из них не был успешным.

Я попытался добавить прослушиватель для videoPlay, который создает объект (nearCue) и присваивает nearCue значение videoPlay.findNearestCuePoint (videoPlay.playheadTime), а затем считывает имя, метку и другие значения nearCue.

Ничто не предложено в сообщениях, которые я просмотрел (много, много сообщений), не дало ответа.

Кажется, что это будет проще всего сделать, но я ни разу не добился успеха.

Буду очень признателен за любые предложения или помощь.

Спасибо, что уделили время!

Ответы [ 2 ]

1 голос
/ 11 августа 2011

Давно не трогал 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;
}

НТН

0 голосов
/ 18 августа 2011

Джордж,

Мне кажется, я обнаружил эту проблему, и я думаю, что это было то, о чем вы рассказывали в своем предыдущем посте, но я случайно обдумал ее.

F4V, с которым я работал, имел встроенные ключевые точки, используя Adobe Media Encoder ... и это было всей проблемой.

Я вернулся и экспортировал ключевые точки в XML, затем удалил их из F4V и перекодировал без них. Затем я отредактировал XML, чтобы изменить все ключевые точки события на ActionScript, и импортировал их в FLA-файл, используя диалог свойств компонента FLV.

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

Так что в будущем мне просто нужно помнить, чтобы установить ключевые точки в диалоге свойств и установить их для actionScript, и я должен быть золотым. До сих пор он работал безупречно со всеми файлами F4V с момента внесения изменений.

Большое спасибо за подробный ответ и последующие действия!

...