Предпочтительный метод зацикливания звуковой вспышки as3 - PullRequest
7 голосов
/ 04 августа 2009

У меня есть некоторые проблемы с зацикливанием звука во флэш-памяти AS3, в том, что когда я говорю зацикливанию звука, я получаю небольшую задержку в конце / начале звука.

Звук корректно обрезается и будет воспроизводиться без паузы на гаражной полосе.

Я знаю, что есть проблемы со звуком в целом во флэш-памяти, ошибки с кодировками и неточности в событии SOUND_COMPLETE (и Adobe должна быть смущена обработкой этих проблем)

Я пытался использовать аргумент встроенного цикла в методе воспроизведения класса Sound, а также реагировал на событие SOUND_COMPLETE, но оба вызывают задержку.

Но кто-нибудь придумал технику зацикливания звука без заметного зазора?

Ответы [ 6 ]

7 голосов
/ 05 августа 2009

Самый надежный метод, если вы можете использовать Flash Player 10, это использовать новое событие SampleDataEvent.SAMPLE_DATA.

В частности, вы сначала создаете экземпляр нужного вам звука, а затем используете новый метод извлечения, чтобы преобразовать звук в необработанные данные PCM, закодированные в ByteArray. Затем вы можете создать новый объект Sound и настроить его на прослушивание события SampleDataEvent.SAMPLE_DATA. Когда вызывается это событие, вы отправляете 2-8k (меньшее значение уменьшает задержку, но увеличивает вероятность слышимых артефактов) данных из ByteArray. Вы просто убедитесь, что когда вы выйдете из конца ByteArray, вы просто вернетесь к началу.

Этот метод обеспечивает воспроизведение без пауз.

5 голосов
/ 11 мая 2010

Безрезультатное зацикливание mp3 не является тривиальным из-за того, как работает формат. Немного упростить; звук соответствует нескольким кадрам, это число не может быть выбрано произвольно, вместо этого требуется некоторое заполнение (без звука). Mp3 не может сохранить объем добавленного отступа, поэтому эта информация теряется при кодировании файла.

Flash IDE помогает обойти это путем встраивания этих метаданных, и вы тоже можете. Вам просто нужно знать, какая задержка добавляется кодером.

Андре Мишель объясняет это лучше, чем я, в своем блоге .

3 голосов
/ 11 мая 2010

По словам этого парня , вы должны импортировать музыкальный цикл в формате wav, а сама Flash IDE сжимать в mp3. Использование Flash импортированных данных mp3 означает, что он не будет знать, как правильно его зациклить.

1 голос
/ 20 августа 2013

Я использую этот замечательный инструмент: http://www.compuphase.com/mp3/mp3loop.zip

Вы даете ему файл WAV, и он возвращает файл MP3, который может быть идеально (и без зазоров!) Воспроизведен стандартным play методом Sound - например, :

var manyLoops:int = 1000*1000; // a Million is a lot :)
mySound.play(0, manyLoops); 

Вы также можете взять выходной MP3-файл и преобразовать его в WAV (например, с помощью AudioCity) - тогда у вас есть WAV без зазора (который может отлично работать внутри вашего FLA-файла)

Надеюсь, это поможет

1 голос
/ 04 августа 2009

Вот как id это сделал, без заметной задержки. Основное приложение:

package {

import flash.display.MovieClip; 
import flash.events.*;
import flash.utils.*;

public class MainApp extends MovieClip {
  private var player:Player;
  ..........

  public function MainApp() {
      .......
      player = new Player();
      player.addEventListener(Player.EVENT_SOUND_COMPLETED, handleSoundCompleted);
      ......
  }

  private function handleSoundCompleted(event:Event):void {
      player.setPosition(0);
      player.play();
  }

  .................

Класс игрока:

package {

import flash.events.*;
import flash.media.*;
import flash.net.*;

public class Player extends EventDispatcher {

    private var sound:Sound;
    private var channel:SoundChannel;
    private var position:Number;

    static const SOUND_VOLUME:Number = 0.75;
    static const EVENT_SOUND_COMPLETED:String = "SOUND_COMPLETED";

    public function Player() {

        // init
        sound = new ThemeSong();
        position = 0;

        // listeners
        sound.addEventListener(IOErrorEvent.IO_ERROR, function(event:Event){trace(event)});

        trace("Player initialized...");
    }

    public function play():void {
        channel = sound.play(position);
        channel.soundTransform = new SoundTransform(SOUND_VOLUME);
        channel.addEventListener(Event.SOUND_COMPLETE, function(event:Event){dispatchEvent(new Event(EVENT_SOUND_COMPLETED));});
        trace("Player playing..");
    }

    public function pause():void {
        if (channel != null) {
            channel.stop();
            position = channel.position;
        }
        trace("Player paused..");
    }

    public function setPosition(pos:Number):void {
        position = pos;
    }

    public function getPosition():Number {
        if (channel == null) {
            return 0;
        } else {
            return channel.position;
        }
    }
}
}

Вы сказали, что файл mp3 не имеет задержки в начале / конце, но я предлагаю открыть его с помощью audacity и убедиться, что задержки нет.

0 голосов
/ 03 февраля 2015

Я хотел создать библиотеку для зацикливания звука, которая не полагалась на события COMPLETE. Я решил создать свою собственную библиотеку дополнений постоянных сообщений . Посмотрите оригинальный проект постоянная волна3 от MaxL0rd . Моя работа в процессе, и она выполняет свою работу, на этом уровне байтов (без таймеров цикла или чего-то еще). Он работает, беря звук с начальной и конечной точками цикла. Затем он клонирует выборку цикла несколько раз в зависимости от времени, указанного в секундах. Это должно быть прямо в использовании. Это код для класса Main.as в Файл «looping» в папке «examples»:

package
{

    // Imports.
    import com.greensock.events.LoaderEvent;
    import com.greensock.loading.LoaderMax;
    import com.greensock.loading.MP3Loader;
    import flash.display.Sprite;
    import flash.events.Event;
    import com.greensock.TweenMax;
    import com.SW3.gadget.LoopGadget;
    import flash.media.Sound;


    // Class.
    public class Main extends Sprite
    {

        // Vars.
        private var loader:LoaderMax;// Using LoaderMax for ease of use.


        // Constructor.
        public function Main()
        {

            trace("Main");

            loader = new LoaderMax( { name:"audio", onComplete:onSoundsLoaded } );
            loader.append( new MP3Loader( "assets/Beat.mp3", { autoPlay:false } ) );
            loader.append( new MP3Loader( "assets/Clap.mp3", { autoPlay:false } ) );
            loader.append( new MP3Loader( "assets/Boom.mp3", { autoPlay:false } ) );
            loader.load();

        }


        private function onSoundsLoaded(e:LoaderEvent):void
        {

            trace("onSoundsLoaded");
            var looping:LoopGadget = new LoopGadget;
            looping.addLoopSound( "Beat", e.currentTarget.content[ 0 ] as Sound, 0, 10 );
            looping.addLoopSound( "Clap", e.currentTarget.content[ 1 ] as Sound, 0, 10 );
            //looping.addLoopSound( "Boom", e.currentTarget.content[ 2 ] as Sound, 0, 10 ); // Commented out to test possible error.

            looping.playLoop( "Beat" );// Play the "Beat" loop.
            looping.playLoop( "Clap" );// Play the "Clap" loop.
            looping.stopLoop( "Beat" );// Stop the "Beat" loop.
            looping.playLoop( "Beat" );// Play the "Beat" loop.
            looping.playLoop( "Beat" );// Play the "Beat" loop again to test if it would error out..

            looping.stopAllLoops();// Stop all the loops.
            looping.playLoops( [ "Beat", "Clap", "Boom" ] );// Play all the loops. Test to see if "Boom" will error out.

        }

    }

}

Проверьте исходные файлы здесь: https://github.com/charlesclements/standingwave3-addons

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...