0

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

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

时间线上的音频流图片

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

声帧属性的图片

4

1 回答 1

3

任何导入的项目都可以在Libraryctrl+LWindow在顶部菜单栏中找到)中访问。.

Library只需右键单击您的音频项目的当前名称(将是Type: Sound)并选择Properties。在那里你应该看到Linkage部分所以勾选Export For 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
}
于 2014-10-15T08:16:46.827 回答