【问题标题】:Timer flash to show something at the right time定时器闪烁以在正确的时间显示某些内容
【发布时间】:2015-08-14 12:43:20
【问题描述】:

我想制作一个计时器,它会在特定时间在我的 panelText(动态文本框)上显示文本,实际上我有一个想要有字幕的视频,并且我想使用计时器,我的视频是 3 分钟和37 秒长,我有我想在某个时间显示的脚本,例如在 1 分钟 0 秒它会在我的 panelText 中显示文本“你好,这是我学习太阳系的视频”,在 2 分钟我想要显示文本“我们的太阳系中有 8 颗行星”,类似这样的内容。有关信息,我正在使用 flvPlayback 播放视频并加载外部视频。

我的代码中的一个例子:

var myTimer:Timer = new Timer(217000);
var time = 0;
myTimer.start()
myTimer.addEventListener(TimerEvent.TIMER,timerHandle);

function timerHandle(event:TimerEvent){
    if(myTimer == 120000)
    {
        panelText.text="There's 8 planets in our solar system";
    }                                                                              

我收到错误 1176:比较静态类型 flash.utils:Timer 和可能不相关的 int 类型的值。有人可以帮助我吗?我很抱歉我的英语不好

【问题讨论】:

    标签: actionscript-3 flash video timer


    【解决方案1】:

    您应该使用FLVPlaybackaddASCuePoint() 函数在播放您的FLVPlayback fideo 时进行精确操作。您可以使用此功能设置要显示自定义字幕的任何点,可以有任意数量的这些点,然后在 FLVPlayback 实例上侦听 MetadataEvent.CUE_POINT 事件,并处理提示点以便显示相关的字幕。但请注意,您必须单独解析字幕过期时间,或分配一个提示点以在显示提示点几秒钟后删除显示的字幕。虽然如果您能够直接在视频上添加字幕会更好,这样在您的视频中搜索就不需要处理未对齐的字幕。尽管如此,它仍然可以使用纯 AS3 代码,如果您还要监听 VideoEvent.FAST_FORWARDVideoEvent.REWIND 事件来处理用户与播放的交互,并通过调用 findNearestCuePoint() 来找到最近的启用字幕的提示点来显示相应的字幕。

    添加提示点的示例:

    flv.addASCuePoint(0.1,"1",{text:"Subtitle one"});
    flv.addASCuePoint(6.8,"2",{text:"Subtitle two"});
    flv.addASCuePoint(11.8,"2 hide",{text:""}); // remove old subtitle
    flv.addASCuePoint(120.0,"3",{text:"There are 8 planets in our solar system"});
    

    请注意,每次调用都会返回一个Object,每当调度MetadataEvent.CUE_POINT 事件时也会返回该MetadataEvent.CUE_POINT。这有一个 parameters 子对象,您已将其作为第三个参数传递给 addASCuePoint,然后您可以根据其中的内容对其进行解析并采取措施。在这里,我在每个参数对象中放置了一个字段“文本”,它应该是显示为字幕的文本。所以,然后你监听提示点事件并采取行动,如下所示:

    flv.addEventListener(MetadataEvent.CUE_POINT,cueHandler); 
    // do this only once, a listener does not need to be added per cue point
    function cueHandler(e:MetadataEvent):void {
        var cuepoint:Object=e.info;
        if (cuepoint.parameters) {
            panelText.text=cuepoint.parameters.text;
        } else {
            // DEBUG here
        }
    }
    

    在搜索的情况下,您侦听 FF 并使用将调用 findNearestCuePoint() 的函数倒回事件,检索其 parameters.text 并将该文本放入您的文本字段中。

    【讨论】:

    • 现在,我正在尝试你的方式 Vesper,但我真的不知道如何使用 MetadataEvent.CUE_POINT,我已经将我的代码放入 addASCuePoint(),但我真的不知道知道如何使用该代码,因为我还是个新手,这是我的代码,myVideo.addASCuePoint(0.1, panelText.text="tryA"); myVideo.addASCuePoint(6.8,panelText.text="tryB"); myVideo.addASCuePoint(12.9, panelText.text="tryC");
    • 据说你在addASCuePoint中放了一个Object而不是代码,你也错过了一个name参数。
    • 次要评论,您能否将英文文档链接到 addAsCuePoint?目前您正在链接到俄语文档。
    • @DodgerThud 哎呀。修复了链接。
    【解决方案2】:

    您误解了Timer 类的用法。

    var myTimer:Timer = new Timer(n) 表示计时器将始终以指定的时间间隔n“滴答”,在您的情况下,每 217000 毫秒(217 秒)。

    这可能不是最佳解决方案,但它会向您展示如何将计时器类用于您的场景。

    var myTimer:Timer = new Timer(1000); //a timer that will tick every second
    myTimer.addEventListener(TimerEvent.TIMER, timerHandler);
    myTimer.start(); //you should set up your listener before you start the timer
    
    function timerHandler(event:TimerEvent):void{
        //myTimer.currentCount will tell you how many times your Timer has ticked
        //every tick, in this scenario, represents exactly one second, because we initialized the Timer with 1000 milliseconds
        //so, if you want to show some text 86 seconds after the video has started, you could do:
    
        if(myTimer.currentCount == 86){
             panelText.text = "We're 86 seconds into the video";
        }else if(myTimer.currentCount == 217){
             //after reading your code it seems like you intended to let the timer only run 217 seconds, because that's the length of your video
             //my proposed solution could also handle this, in this else if clause
    
             myTimer.stop();
             myTimer.removeEventListener(TimerEvent.TIMER, timerHandler);
             myTimer = null;
        }
    }
    

    【讨论】:

    • 一个小问题:如果 FLVPlayback 暂停会发生什么?
    • @Vesper 当然,没有考虑过这种情况。但是暂停视频时暂停计时器应该不会太难。感谢您的捕获,快速而肮脏的解决方案并不总是最好的:D
    • 我认为它对我不起作用,我试图使用您的代码但不起作用,我不知道为什么,我的 panelText 没有变成我想要的文本显示,它只是不能改变,我试图在我的 panelText 中手动输入来验证代码,但是当代码运行时,它不起作用,我的 panelText 没有改变
    • @japjay 这很奇怪,你能告诉我你是如何实现我的代码的吗? (请编辑您的问题。)
    • @japjay “没用”不是编程领域的正确表达方式。您应该将跟踪添加到代码的任何部分以检查它们是否已经到达,如果没有,您必须报告比这更好的东西。请先自己调试代码,不要盲目地复制和粘贴代码,期望它会按照您的意愿“工作”。
    【解决方案3】:

    错误是正确的。您正在将计时器与数字进行比较!!。 修复部分代码:

    if(myTimer.currentCount==120000){
      panelText.text="There's 8 planets in our solar system";
    }
    

    你的定时器构造函数是错误的!第一个参数是延迟,下一个是重复计数。 固定代码:

    var myTimer:Timer = new Timer(100,2170);
    var time = 0;
    myTimer.start()
    myTimer.addEventListener(TimerEvent.TIMER,timerHandle);
    
    function timerHandle(event:TimerEvent){
      if(myTimer.currentCount == 1200)
      {
        panelText.text="There's 8 planets in our solar system";
    }        
    

    在这段代码中,我们的计时器每 0.1 秒(100 毫秒)计时一次,计时 2170 次。所以,要设置你的文本,你必须在你想要的第二个之后放一个零。

    希望这会有所帮助:)

    【讨论】:

    • 反之亦然,每2170ms打勾,重复100次。 According to the Documentation
    • 仍然没有工作,计时器工作,但我的 panelText 没有改变
    • 对我有用。可能是因为 Timer 类不准确。它有延迟。你在达到 120 后是否等待大约 10 秒?为了更快,将 120 设置为减少等待测试的时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 2012-05-04
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    相关资源
    最近更新 更多