我想要获得正在我的SWF中播放的mp3的振幅。问题是,它直接嵌入时间线。
有什么方法可以让我在时间线上播放的声音(通过ActionScript)?
更新:为了更清晰,当声音被添加到舞台上时(字面上从图书馆拖到舞台上)它似乎成为画面的属性?
答案 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
}