Как получить доступ и получить амплитуду звука MP3 на временной шкале?

Я хочу получить амплитуду mp3, воспроизводимого в моем SWF. Проблема в том, что он встроен прямо на шкалу времени.

Есть ли способ получить звук (через ActionScript), который воспроизводится, когда он находится на временной шкале?

Изображение аудиопотока на временной шкале

Обновление: для большей ясности, когда звук добавляется на сцену (буквально перетаскивается из библиотеки на сцену), кажется, что он становится свойством кадра?

Изображение свойств звукового кадра


person onekidney    schedule 13.10.2014    source источник
comment
Я много работал со звуком в Flash Frames и никогда не встречал способа получить доступ к такой информации для звука, встроенного в кадр. Если вам нужно получить амплитуду, я думаю, что лучший способ - использовать класс Sound. Ссылка: leebrimelow.com/actionscript-3-quicktip-3-sound -амплитуда   -  person Anil Natha    schedule 14.10.2014
comment
@SlyRaskal - вот в чем проблема, я не могу использовать звук - mp3 был импортирован и добавлен на сцену во время разработки. :( Спасибо!   -  person onekidney    schedule 15.10.2014
comment
Если он импортирован, вам просто нужно сделать привязку к нему как к классу, а затем его можно будет использовать, как и любой загруженный MP3. См. Это руководство: перейдите к Воспроизведение внутреннего звука   -  person VC.One    schedule 15.10.2014
comment
Если вы не имеете в виду, что ваш звук находится внутри еще одного SWF, который был добавлен в ваш текущий Flash-проект? В таком случае попробуйте изменить в свойствах базовый класс на flash.media.Sound и следуйте моему руководству ниже или ссылке выше   -  person VC.One    schedule 15.10.2014
comment
Нет, звук находится внутри одного swf, но нет кадра, в котором я явно вызываю sound.play (). Поскольку это звук в кадре, он просто начинает воспроизводиться. Ссылка, которую вы предоставили, воспроизводит его как встроенный актив, но звук на самом деле находится прямо на шкале времени, так что объект не создается, так сказать. Звук буквально вытаскивают из библиотеки на сцену и кладут на саму рамку. Как будто сама рамка имеет звуковое свойство ...   -  person onekidney    schedule 16.10.2014
comment
Ты прав. Визуализация кажется всего лишь помощником аниматора, но звук действительно существует в фоновом режиме и недоступен. См. Еще один мой комментарий ниже о предварительной обработке звука вне Flash перед импортом в библиотеку.   -  person VC.One    schedule 18.10.2014


Ответы (1)


Любой импортированный элемент доступен в 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
}
person VC.One    schedule 15.10.2014
comment
Ух ты - спасибо за исчерпывающий ответ! К сожалению, это не работает (или, может быть, я что-то делаю неправильно?) Все работает, ЕСЛИ я использую sound.play (), но проблема в том, что я никогда не создаю экземпляр объекта. Чтобы воспроизвести звук, его перетаскивают из библиотеки на сцену, а манипулирование им осуществляется из окна свойств фрейма (я обновлю вопрос, сделав снимок экрана с этим). Даже использование примера SoundMixer не работает с воспроизведение звука с использованием этого метода (однако он работает фантастически при воспроизведении звука, который я создал ...) - person onekidney; 16.10.2014
comment
Я видел редактирование и понял вашу точку зрения. Проблема в том, что у Flash есть 2 типа пользователей: аниматоры и кодировщики. Так что, если это на временной шкале, это как сказать, что мне просто нужен визуальный звук для синхронизации губ моего персонажа или чего-то еще, и вы никогда не сможете задействовать код (для обработки / анализа звука они предполагают, что это то, что будет интересно только кодерам). Так что не повезло, и у меня там нет идей (не могу победить систему, лол) - person VC.One; 17.10.2014
comment
Если вы используете только фоновый звук, то стоит сделать это как версию объекта класса, но если вам нужны эффекты, такие как постепенное появление / исчезновение, вам придется выполнить предварительную обработку перед импортом во Flash. Вы можете попробовать бесплатный Audacity Audio Editor. Если вы этого не знаете, то на Youtube есть множество руководств по этому поводу. - person VC.One; 17.10.2014
comment
Это круто - я очень ценю все время, которое вы вложили в этот ответ! Спасибо за всю твою помощь! - person onekidney; 19.10.2014