获取Flash中音频样本的总长度

时间:2012-03-28 14:10:10

标签: actionscript-3 flash flex audio bytearray

我在获取mp3的总样本长度方面遇到了很多麻烦。

另外,当我加载mp3时,它不会一直播放。它占据了大约一半的长度。

我正在测试的mp3可以在这里找到,http://bit.ly/GYSOYj

我用来播放声音的代码是:

[Embed(source='assets/ffmangun_loop_79393.mp3')]
private var _snd_class:Class;
private var sound:Sound = new _snd_class as Sound;


protected function application1_creationCompleteHandler(event:FlexEvent):void {

    sound.length; // 600;
    sound.bytesTotal;// 44652

    soundChannel = sound.play();
    soundChannel.addEventListener(Event.SOUND_COMPLETE, soundComplete);
}

更新
有人建议我加载MP3而不是嵌入它。结果是MP3播放全长,长度和字节总数现在是不同的数字。

//嵌入值
字节总数= 44652
声音长度= 600.8163265306122

//加载动态值
字节总数= 44678
声音长度= 1776.3265306122448

更新
这需要在运行时确定。

1 个答案:

答案 0 :(得分:3)

首先,“总样本”!= sound.bytesLoaded!= sound.length。他们都完全不同。

在下面的代码中,我已经包含了一些其他的事件监听器来试图说明差异。听“Event.SOUND_COMPLETE”不会告诉你太多,首先是因为它只会在声音停止播放时触发,其次因为它被证明是非常不可靠的。使用Event.OPEN也没有告诉你太多,因为文件尚未开始加载,并且无法检索或计算任何信息。

您可以使用ProgressEvent或EnterFrame事件来监控Sound的加载并读取length属性,但要确定总样本,您还需要知道用于创建MP3的采样率以及是否它是立体声或单声道。一旦你知道了这些事情,就可以通过将长度乘以采样率来轻松获得文件的样本长度。

希望这个用法示例有帮助 -

import flash.net.URLRequest;
import flash.events.Event;
import flash.media.Sound;
import flash.media.SoundChannel;

var sound:Sound;
var soundChannel:SoundChannel;
var sampleRate:Number = 44.1;
var totalSamples:int;

init();
function init( ):void  {
    sound = new Sound();
    sound.load( new URLRequest( "http://bit.ly/GYSOYj") );
    sound.addEventListener( Event.OPEN, soundOpen );
    sound.addEventListener( Event.COMPLETE, soundComplete );

    soundChannel = sound.play();
    soundChannel.addEventListener(Event.SOUND_COMPLETE, scComplete);
}
function soundOpen( e:Event ):void{
    trace( "OPEN:", sound.length );
}

function soundComplete( e:Event ):void{
    trace( "COMPLETE:", sound.length );

    totalSamples = sound.length * sampleRate;
    trace( "SAMPLES", totalSamples);
}

function scComplete( e:Event):void{
    trace( "sound is complete" );
}

编辑:根据建议,可以使用as3swf(bit.ly/HdhVcW) - 但只有你可以决定它是否值得。无法想象你想要建造的东西需要所有这些......