我在获取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
更新
这需要在运行时确定。
答案 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) - 但只有你可以决定它是否值得。无法想象你想要建造的东西需要所有这些......