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

Actionscript 3 获取Flash中音频样本的总长度,actionscript-3,flash,apache-flex,audio,bytearray,Actionscript 3,Flash,Apache Flex,Audio,Bytearray,我很难得到mp3的总样本长度 此外,当我加载mp3时,它不会一直播放。它播放大约一半的长度 我正在测试的mp3可以在这里找到 我用来播放声音的代码是: [Embed(source='assets/ffmangun_loop_79393.mp3')] private var _snd_class:Class; private var sound:Sound = new _snd_class as Sound; protected function application1_creationCo

我很难得到mp3的总样本长度

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

我正在测试的mp3可以在这里找到

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

[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

更新
这需要在运行时确定

首先,“总样本”!=sound.bytesLoaded!=声音。长度。他们都很不一样

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

您可以使用ProgressEvent或EnterFrame事件来监视声音的加载并读取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()——但只有您可以决定它是否值得。无法想象你正在尝试构建什么需要所有这些

首先,“总样本”!=sound.bytesLoaded!=声音。长度。他们都很不一样

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

您可以使用ProgressEvent或EnterFrame事件来监视声音的加载并读取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()——但只有您可以决定它是否值得。无法想象你正在尝试构建什么需要所有这些

您似乎正在覆盖相同的变量“sampleDuration”,除非在未来的文档中允许这样做?如果您不嵌入但加载文件,是否也会发生这种情况?@Neil-这是一个输入错误。“我已经把它移走了。”这张表——这似乎很重要。我已经添加了上面的详细信息。您似乎正在覆盖相同的变量“sampleDuration”,除非在未来的文档中允许这样做?如果您不嵌入但加载文件,是否也会发生这种情况?@Neil-这是一个输入错误。“我已经把它移走了。”这张表——这似乎很重要。我已经添加了上面的细节。谢谢-你说,“你还需要知道创建MP3时使用了什么样的采样率,以及是立体声还是单声道。”。我猜这些信息在运行时不可用。不,当然不可用。当ByteArray播放时,您可以随时对其进行比较,总有办法获得您需要的信息。:)好啊你会认为Flash会有这些信息。哦,好吧。我在线查看,发现了一种使用as3swf获取这些值的间接方法。如果您在回复中添加此页面的链接,我会将您的回复标记为答案。谢谢-您说过,“您还需要知道创建MP3时使用了什么样的采样率,以及是立体声还是单声道”。我猜这些信息在运行时不可用。不,当然不可用。当ByteArray播放时,您可以随时对其进行比较,总有办法获得您需要的信息。:)好啊你会认为Flash会有这些信息。哦,好吧。我在线查看,发现了一种使用as3swf获取这些值的间接方法。如果你在回复中添加此页面的链接,我会将你的回复标记为答案。