我想获得在我的 SWF 中播放的 mp3 的幅度。问题是,它直接嵌入到时间线上。
有什么方法可以让我获得时间线上正在播放的声音(通过 ActionScript)?
更新:为了更清楚,当声音被添加到舞台(从字面上从图书馆拖到舞台)时,它似乎成为框架的属性?
我想获得在我的 SWF 中播放的 mp3 的幅度。问题是,它直接嵌入到时间线上。
有什么方法可以让我获得时间线上正在播放的声音(通过 ActionScript)?
更新:为了更清楚,当声音被添加到舞台(从字面上从图书馆拖到舞台)时,它似乎成为框架的属性?
任何导入的项目都可以在Library
(ctrl+L或Window
在顶部菜单栏中找到)中访问。.
在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
}