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

Events 动作脚本2:事件提示点:findNearestCuePoint,events,actionscript-2,flvplayback,Events,Actionscript 2,Flvplayback,大家好,大家好 好的。。。几个星期以来,我一直在为这个问题绞尽脑汁,但我仍然找不到成功解决这个问题的答案 我创建了一个FLA,并在舞台上放置了一个实例名为videoPlay的FLV组件 视频播放通过嵌入事件提示点的流媒体FLV进行。提示点从叙述1到叙述16依次编号 我建立了一个侦听器对象: var videoPlayCuePointListener:Object = new Object(); 提示点的事件侦听器: videoPlayCuePointListener.cuePo

大家好,大家好

好的。。。几个星期以来,我一直在为这个问题绞尽脑汁,但我仍然找不到成功解决这个问题的答案

我创建了一个FLA,并在舞台上放置了一个实例名为videoPlay的FLV组件

视频播放通过嵌入事件提示点的流媒体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的名称、标签等。无骰子

在我评论过的任何帖子(很多很多帖子)中都没有给出答案

这似乎是最容易完成的事情,但我一次也没有成功过

如有任何建议或协助,将不胜感激


谢谢你抽出时间

很久没有接触过AS2了。我做了一个基本的测试,发现nearestcuepoint有效。您正在使用FLVPlayback组件,对吗? 以下是我尝试过的:

videoPlayer.autoPlay = false;
onEnterFrame = function():Void{
    videoPlayer.seekPercent(_xmouse/Stage.width * 100);
    videoPlayer.play();
    trace(videoPlayer.findNearestCuePoint(videoPlayer.playheadTime).name);
}
建议的方法是在处理程序中找到最近的提示点,该提示点在播放头更改其值后触发。(例如,1.告诉playhead移动,2.playhead实际更改值,3.调用playheadUpdate)

这里有一个更基本的方法:

onEnterFrame = function():Void{
    if(videoPlayer.metadata) trace(videoPlayer.findNearestCuePoint(_xmouse/Stage.width * videoPlayer.metadata.duration).name);
}
在我的测试中,我增加了4个提示点。都试过了:actionscript/event/navigation。 奇怪的是,当我试图通过视频播放器访问cuePoints属性时 或者通过videoPlayer.metadata,我得到了一个包含8个未定义对象的数组,当我跟踪它时,数组的长度是4。不知道问题是什么,可能是编码/编解码器和as2兼容性,不确定

不管怎样……只要你有了提示点数组,你就可以手动找到最近的一个,方法是循环所有提示点,并获得每个提示点时间和当前时间之间的最小绝对差:

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;
}
函数getClosestCuePoint(cuePoints:Array,time:Number):对象{
var numCuePoints:Number=cuePoints.length;
var minDist:Number=100000000,结果:Object;
对于(变量i:Number=0;i
下面是一个模型示例:让我们假设屏幕上的一些框是提示点,而_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;
}
//假提示点
变量numCuePoints:Number=5;
var-cuePoints=[];
对于(变量i:Number=0;i

HTH已经很久没有接触AS2了。我做了一个基本的测试,发现nearestcuepoint有效。您正在使用FLVPlayback组件,对吗? 以下是我尝试过的:

videoPlayer.autoPlay = false;
onEnterFrame = function():Void{
    videoPlayer.seekPercent(_xmouse/Stage.width * 100);
    videoPlayer.play();
    trace(videoPlayer.findNearestCuePoint(videoPlayer.playheadTime).name);
}
建议的方法是在处理程序中找到最近的提示点,该提示点在播放头更改其值后触发。(例如,1.告诉playhead移动,2.playhead实际更改值,3.调用playheadUpdate)

这里有一个更基本的方法:

onEnterFrame = function():Void{
    if(videoPlayer.metadata) trace(videoPlayer.findNearestCuePoint(_xmouse/Stage.width * videoPlayer.metadata.duration).name);
}
在我的测试中,我增加了4个提示点。都试过了:actionscript/event/navigation。 奇怪的是,当我试图通过视频播放器访问cuePoints属性时 或者通过videoPlayer.metadata,我得到了一个包含8个未定义对象的数组,当我跟踪它时,数组的长度是4。不知道是什么问题,可能是编码问题/