Получить общую длину сэмплов аудио во Flash - PullRequest
0 голосов
/ 28 марта 2012

У меня много проблем с получением полной длины сэмпла 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 Ответ

3 голосов
/ 28 марта 2012

Во-первых, «всего сэмплов»! = Sound.bytesLoaded! = Sound.length.Все они совершенно разные.

В приведенном ниже коде я включил несколько других слушателей событий, чтобы попытаться проиллюстрировать различия.Прослушивание «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" );
}

edit: как предложеноможно использовать as3swf ( bit.ly / HdhVcW ) - но только вы можете решить, стоит оно того или нет.Не представляю, что ты пытаешься построить, что потребовало бы всего этого ..

...