1

大家好,任何人!

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

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

videoPlay 被引导到带有嵌入式事件提示点的流式 FLV。提示点按从 narration1 到 narration16 的顺序编号。

我建立了一个监听器对象:

     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 的名称、标签等。没有骰子。

我审查过的任何帖子(很多很多帖子)中的任何建议都没有提供答案。

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

任何建议或帮助将不胜感激。

感谢您的时间!

4

2 回答 2

1

好久没碰AS2了。我做了一个基本的测试,findNearestCuePoint 工作。您正在使用 FLVPlayback 组件,对吗?这是我尝试过的:

videoPlayer.autoPlay = false;
onEnterFrame = function():Void{
    videoPlayer.seekPercent(_xmouse/Stage.width * 100);
    videoPlayer.play();
    trace(videoPlayer.findNearestCuePoint(videoPlayer.playheadTime).name);
}

推荐的方法是在播放头更改其值后触发的播放头更新处理程序中找到最近的提示点。(例如 1. 告诉播放头移动,2. 播放头实际更改值,3. 调用 playheadUpdate)

这是一个更基本的方法:

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

在我的测试中,我添加了 4 个提示点。都试过了:actionscript/event/navigation。奇怪的是,当我尝试通过 videoPlayer 或通过 videoPlayer.metadata 访问 cuePoints 属性时,我得到了一个包含 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;
}

高温高压

于 2011-08-11T07:37:09.047 回答
0

乔治,

我相信我发现了这个问题,并且我认为这是您在上一篇文章中介绍的内容,但我无意中掩盖了它。

我使用的 F4V 使用 Adob​​e Media Encoder 嵌入了提示点……这就是整个问题。

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

Presto,令人惊讶的是,我毫无问题地找到了提示点,追踪它们,并将它们用于任何目的。

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

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

于 2011-08-18T11:59:41.013 回答