动作脚本2:事件提示点:findNearestCuePoint

时间:2011-08-10 15:16:39

标签: events actionscript-2 flvplayback

大家和任何人都好!

好的......几个星期以来,我一直在用这个问题撞墙,但我仍然找不到能够成功解决问题的答案。

我创建了一个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添加一个监听器,用于创建一个对象(nearestCue),并为nearestCue提供videoPlay.findNearestCuePoint(videoPlay.playheadTime)的值,然后读出nearestCue的名称,标签等。没有骰子。

我所评论的任何帖子(很多很多帖子)都没有提供任何答案。

这似乎是最简单的事情,但我一次都没有成功。

非常感谢任何建议或协助。

感谢您的时间!

2 个答案:

答案 0 :(得分:1)

长时间没有触及AS2。我做了一个基本测试,findNearestCuePoint工作。你正在使用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。播放playUpdate被调用)

这是一个更基本的方法:

onEnterFrame = function():Void{
    if(videoPlayer.metadata) trace(videoPlayer.findNearestCuePoint(_xmouse/Stage.width * videoPlayer.metadata.duration).name);
}

在我的测试中,我添加了4个提示点。尝试了所有:actionscript / event / navigation。 奇怪的是当我试图通过videoPlayer访问cuePoints属性时 或者通过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;
}

HTH

答案 1 :(得分:0)

乔治,

我相信我发现了这个问题,我认为这是你在上一篇文章中所涉及的内容,但我偶然掩饰了它。

我正在使用的F4V使用Adobe Media Encoder嵌入了提示点......这就是整个问题。

我回去并将提示点导出为XML,然后将它们从F4V中剥离出来并在没有它们的情况下重新编码。然后,我编辑了XML,将所有事件提示点更改为actionscript,并使用FLV组件属性对话框将它们导入FLA文件。

Presto,令人惊讶的是,我没有找到提示点,追踪它们以及将它们用于任何目的的问题。

所以在将来,我只需要记住在属性对话框中设置提示点并将它们设置为actionscript,我应该是金色的。到目前为止,自从进行更改以来,它与所有F4V文件完美配合。

非常感谢您的详细回复和您的跟进!