【问题标题】:How to Trace Placement of Audio Files on Timeline in Flash如何在 Flash 中跟踪音频文件在时间线上的位置
【发布时间】:2011-07-07 15:15:52
【问题描述】:

我正在做一个动画项目。我不是程序员。我正在使用 Flash CS3。我制作了一个动画,我需要输出我的音轨的位置以供后期制作人员使用。录音结束后,我的音响师给了我一个大文件,里面有我所有的音频。对于我想要的每个剪辑,我必须将其擦到音轨上的正确位置。

现在我的动画已经完成,我的音频已经全部到位,但我需要记录它在 Flash 时间轴中的位置,以便我可以将其提供给我的后期声音人员,以便他可以重建它在他的声音编辑软件中。

我想知道是否有一种方法可以运行跟踪或生成一些文本文件来执行以下操作:

  1. 主时间轴上音频剪辑开始的位置(关键帧)列表(返回从电影时间轴开始的绝对帧号)
  2. 剪辑播放时长(帧数)
  3. 关键帧上的任何注释
  4. 符号名称/音频剪辑文件名
  5. 在该选择中播放的音频剪辑文件中的位置。

大约 4 年前,我参加了 Actionscript 3.0 速成课程,但这只是我的经验范围,所以请善待。

【问题讨论】:

  • 现在,我对 PHP 和 JQuery 类型编程有点精通,如果有人愿意和我一起走一遍,我也许能弄清楚这一点。我知道我可以在给定的帧上运行codetrace(this)code,它将返回 [object MainTimeline],但我如何开始从时间轴中提取信息。同样,我在 AS3 方面相当缺乏经验。
  • 感谢 Scriptocalype 在下面的回答,我发现以下教程可以让我快速掌握 jsfl:active.tutsplus.com/tutorials/workflow/…,但仍在努力寻找解决方案。
  • 所以我想出了如何通过 .jsfl 选择其中包含音频的帧。现在我有最后一个问题,也许是这个请求中最重要的部分。这是我上面列表中的#5:如何从音频剪辑中定位开始位置。我认为这是 Scriptocalypse 所指的黑匣子,因为我找不到任何可以指示如何访问它的东西。我有一个大的音频文件(15 分钟),其中有大约一百个不同的片段,我已经完成并选择了每个片段应该从哪里开始。手动执行此操作非常繁琐。有什么想法吗?

标签: flash actionscript-3 animation audio jsfl


【解决方案1】:

JSFL 可能是最好的方法。

您可以使用 File > New...> Flash JavaScript File 创建一个新的 JSFL 文件。

然后您可以使用脚本编辑器中的播放按钮运行脚本。

This help 页面显示配置目录的常用位置,如果您想将脚本保存为命令。

我还整理了一系列可能有用的教程:

这是一个示例脚本,它将在当前文档的当前时间轴中输出音频的位置:

fl.outputPanel.clear();
var dom = fl.getDocumentDOM();
fl.trace('Timeline sound for ' + dom.name);
fl.trace('-------------------');
var divider = ' \t\t ';
var tl = dom.getTimeline();
for(var i=0; i < tl.layerCount; i++){
    var tLayer = tl.layers[i];
    for(var j=0; j < tLayer.frameCount; j++){
        var tFrame = tLayer.frames[j];
        if(tFrame == undefined) {
            break;
        }
        if(tFrame.startFrame == j) { //only run on keyframes
            if(tFrame.soundLibraryItem != null && tFrame.soundName.length > 0) {
                var seconds = j * dom.frameRate;
                //output info
                fl.trace('layer: ' + tLayer.name + divider + 'start (frame): ' + j + 1 + divider + ' start (sec): ' + seconds + divider + 'sound file: ' + tFrame.soundName);
            }
        } else { //skip to next keyframe
            j = tFrame.startFrame + tFrame.duration - 1;
            continue;
        }
    }
}
fl.trace('-------------------');
fl.trace('Output complete.');

输出将如下所示:

Timeline sound for testAudio2.fla
-------------------
layer: audio 2   start (frame): 31    start (sec): 36    sound file: BUMMER.WAV
layer: audio 2   start (frame): 131       start (sec): 156   sound file: COOL_F.WAV
layer: audio 2   start (frame): 411       start (sec): 492   sound file: preparetodie.wav
layer: audio 2   start (frame): 2721      start (sec): 3264      sound file: mcc_hello.mp3
layer: audio 2   start (frame): 2971      start (sec): 3564      sound file: mcc_seriously.mp3
layer: audio 2   start (frame): 3301      start (sec): 3960      sound file: point.wav
layer: audio 2   start (frame): 4321      start (sec): 5184      sound file: happy5.wav
-------------------
Output complete.

根据您的需要进行自定义。例如,如果要搜索所有时间线或多个文档,则需要对其进行修改。

【讨论】:

    【解决方案2】:

    很难确切地说出你是如何设置这一切的,但根据你所说的,我会尝试这样的事情。将以下代码放在动画时间轴的第一帧:

    var movieFrameRate:Number = 20;  //frame rate of your movie
    var totalFramesOfMovie:Number = this.totalFrames;
    
    var startingFrameOfSoundClip:Number;
    var endingFrameOfSoundClip:Number;
    
    var startingMilSecsOfSoundClip:Number;
    var endingMilSecsOfSoundClip:Number;
    
    var currentClipName:String;
    
    function findMilSecsFromStart(startingFrameOfSoundClip:Number):Number
    {
        var MilSecs:Number = (startingFrameOfSoundClip / movieFrameRate) * 1000;
    
        return MilSecs;
    }
    
    function findFramesFromStart(startingFrameOfSoundClip:Number):Number
    {
        var frames:Number = startingFrameOfSoundClip;
    
        return frames;
    }
    
    function durationInFrames(startingFrame, endingFrame):Number
    {
        var durationInFrames:Number = endingFrame - startingFrame;
    
        return durationInFrames;
    }
    
    function durationInMilliseconds(startingFrame, endingFrame):Number
    {
        var durationInMilSecs:Number = ((endingFrame - startingFrame) / movieFrameRate) * 1000;
    
        return durationInMilSecs;
    }
    
    
    function collectInitialInfo():void
    {
        trace("Clip Name: " + currentClipName);
        trace("Number of frames from beginning: " + findFramesFromStart(startingFrameOfSoundClip));
        trace("Time from beginning in MilSecs: " + findMilSecsFromStart(startingFrameOfSoundClip));
    }
    
    function collectFinalInfo():void
    {
        trace("Duration of sound clip in frames: " + durationInFrames(startingFrameOfSoundClip, endingFrameOfSoundClip));
        trace("Duration of sound clip in milSecs: " + durationInMilliseconds(startingFrameOfSoundClip, endingFrameOfSoundClip));
        trace("----------------------------------------------------------");
    } 
    

    然后在声音剪辑开始的每一帧上放置以下内容,其中 mySoundClip_1 始终是从那里开始的声音剪辑的实例名称:

    currentClipName = 'mySoundClip_1';
    startingFrameOfSoundClip = this.currentFrame;
    collectInitialInfo();
    

    然后在声音结束的每一帧上,放置以下代码:

    endingFrameOfSoundClip = this.currentFrame;
    
    collectFinalInfo();
    

    我制作了一个时间线,其中包含一个正方形的简单影片剪辑的多个实例,以模仿您所描述的声音剪辑的位置,实例名称为 mySoundClip_1、mySoundClip_2 等。

    我已经对其进行了测试,它会在输出窗口中生成以下跟踪:

    Clip Name: mySoundClip_1
    Number of frames from beginning: 4
    Time from beginning in MilSecs: 200
    Duration of sound clip in frames: 35
    Duration of sound clip in milSecs: 1750
    ----------------------------------------------------------
    Clip Name: mySoundClip_2
    Number of frames from beginning: 75
    Time from beginning in MilSecs: 3750
    Duration of sound clip in frames: 55
    Duration of sound clip in milSecs: 2750
    ----------------------------------------------------------
    Clip Name: mySoundClip_3
    Number of frames from beginning: 179
    Time from beginning in MilSecs: 8950
    Duration of sound clip in frames: 18
    Duration of sound clip in milSecs: 900
    ----------------------------------------------------------
    Clip Name: mySoundClip_4
    Number of frames from beginning: 219
    Time from beginning in MilSecs: 10950
    Duration of sound clip in frames: 56
    Duration of sound clip in milSecs: 2800
    ----------------------------------------------------------
    Clip Name: mySoundClip_5
    Number of frames from beginning: 289
    Time from beginning in MilSecs: 14450
    Duration of sound clip in frames: 32
    Duration of sound clip in milSecs: 1600
    ----------------------------------------------------------
    

    【讨论】:

    • 哇,Ribs 感谢您努力完成这一切。我整个晚上都在玩一个 .jsfl 文件,我想知道如何计算同样的东西。不过谢谢。我还可以试试这个。
    • 哈哈,我什至没有考虑过 JSFL。提出更好的解决方案。我对这个想法很感兴趣,想尝试一下,所以不用担心! :)
    【解决方案3】:

    不是来自 ActionScript,不是。时间线上的声音是一个臭名昭著的黑匣子,里面充满了令人讨厌的陷阱,其中包括你真的无法知道时间线声音在运行时“生活”在哪里。不过,这可能是您可以使用 JSFL 脚本执行的操作。 JSFL 是一种“Javascript”,可让您操作和检查 .fla 内容,以及将消息输出到跟踪窗口。

    需要明确的是,JSFL 是您在“创作时间”期间针对 Flash 创作工具本身执行的东西。它不是一种运行时语言。它确实适用于 swf 文件。

    这是关于 JSFL 的文档。

    http://help.adobe.com/en_US/Flash/10.0_ExtendingFlash/WS5b3ccc516d4fbf351e63e3d118a9024f3f-7fe8.html

    【讨论】:

    • 好的,这是一个很好的线索。谢谢你。因此,我找到了以下页面:(livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/js/html/…),然后我将其深入到“扩展闪存 > 对象 > 框架对象”,该页面具有大量似乎返回有用信息的函数。我需要进一步研究,但这是一个很好的开始。谢谢。
    • 当然可以。如果我更像是一个 JSFL 人,我可以为此敲出一些东西,但这是我总是需要查阅文档的东西。
    • 有没有更精通jsfl的人可以推荐?如果不是太多,我也许可以支付帮助。当我正在研究这个问题时,这似乎是答案,但我假设没有太多的 Javascript Flash 专家只是一般地阅读论坛......
    • 我不能说我认识任何可以向您推荐的专家。这是一种许多人不太了解的黑魔法(但完全可以学习),因此找到 JSFL 大师是罕见的。因此,当与 JSFL 相关的问题需要解决方案时,我往往不得不每隔几个月回顾一下文档。
    • 是的,我正在慢慢解决这个问题。我想我应该能够让它从这里做我需要做的事情。再次感谢您的领导。
    猜你喜欢
    • 2016-06-19
    • 1970-01-01
    • 2023-04-06
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    相关资源
    最近更新 更多