如何在时间线上访问和获取MP3声音的幅度?

时间:2014-10-13 17:51:59

标签: actionscript-3 flash amplitude

我想要获得正在我的SWF中播放的mp3的振幅。问题是,它直接嵌入时间线。

有什么方法可以让我在时间线上播放的声音(通过ActionScript)?

Picture of the audio stream on the timeline

更新:为了更清晰,当声音被添加到舞台上时(字面上从图书馆拖到舞台上)它似乎成为画面的属性?

Picture of the Sound Frame Properties

1 个答案:

答案 0 :(得分:3)

可以在Library中访问任何导入的项目( ctrl + L ,或在顶部菜单栏中的Window下找到)..

Library中右键单击音频项目的当前名称(将Type: Sound) 并选择属性。在那里你应该看到链接部分,勾选导出ActionScript

在现有的框中,您现在可以添加自己的首选实例名称(no_spaces),并将基类保留为 flash.media.Sound (应该那样)

//assuming you have.. my_Audio ..as Linkage Class name
var mySound:Sound = new my_Audio();
var myChannel:SoundChannel = new SoundChannel();

myChannel = mySound.play();

addEventListener(Event.ENTER_FRAME, show_Amplitude);

function show_Amplitude(evt:Event)
{
  // where 200 is your own number for the maximum width or height of amplitude bars
  mc_ampLeft.width  = myChannel.leftPeak  * 200;
  mc_ampRight.width = myChannel.rightPeak * 200;
}


替代解决方案:通过computeSpectrum 获取振幅 对于上述解决方案不适用的任何情况,替代方案是仅使用ComputeSpectrum(它对所有音频全局工作,因为它与SoundMixer不仅仅是特定声音对象相关联。这是一个例子作为起点(调整或研究更好的公式)

var n_RMS   :Number = 0;
var n_FFT   :Number = 0;
var max_AMP :Number = 200; // max width or height of bar at full volume
var FFT_bytes:ByteArray = new ByteArray;

addEventListener(Event.ENTER_FRAME, compute_Amplitude);

function compute_Amplitude(evt:Event)
{
    SoundMixer.computeSpectrum( FFT_bytes, false, 0 );

    for (var i:int = 0; i < 256; i++) //GETS LEFT CHANNEL FFT
    {
        n_FFT = FFT_bytes.readFloat();
        n_RMS = 0.8 * Math.sqrt( Math.abs(n_FFT) ) / 0.434294481904;
    }
        mc_ampLeft.width = (n_RMS /2) * max_AMP; //update LEFT bar

    for (var j:int = 0; j < 256; j++) //GETS RIGHT CHANNEL FFT
    {
        n_FFT = FFT_bytes.readFloat();
        n_RMS = 0.8 * Math.sqrt( Math.abs(n_FFT) ) / 0.434294481904;
    }
        mc_ampRight.width = (n_RMS /2) * max_AMP; //update RIGHT bar
}