Как вы зацикливаете звук во флеш AS3, когда он заканчивается? - PullRequest
9 голосов
/ 26 марта 2011

Какой код AS3 используется для зацикливания звука с использованием AS3?

Ответы [ 8 ]

27 голосов
/ 26 марта 2011

Это не даст вам идеального воспроизведения без пауз, но приведет к петле звука.

var sound:Sound = new Sound();
var soundChannel:SoundChannel;

sound.addEventListener(Event.COMPLETE, onSoundLoadComplete);

sound.load("yourmp3.mp3");


// we wait until the sound finishes loading and then play it, storing the
// soundchannel so that we can hear when it "completes".
function onSoundLoadComplete(e:Event):void{
    sound.removeEventListener(Event.COMPLETE, onSoundLoadComplete);
    soundChannel = sound.play();
    soundChannel.addEventListener(Event.SOUND_COMPLETE, onSoundChannelSoundComplete);
}

//  this is called when the sound channel completes.
function onSoundChannelSoundComplete(e:Event):void{
    e.currentTarget.removeEventListener(Event.SOUND_COMPLETE, onSoundChannelSoundComplete);
    soundChannel = sound.play();
}

Если вы хотите, чтобы звук воспроизводился многократно с безупречным воспроизведением без пауз, вы можете позвонить

sound.play(0, 9999); // 9999 means to loop 9999 times

Но вы все же должны были бы настроить слушателя со звуком, если вы хотите бесконечное воспроизведение после 9999-го воспроизведения. Проблема этого способа заключается в том, что вам нужно приостановить / перезапустить звук. Это создаст soundChannel, продолжительность которого в 9999 раз больше, чем фактическая длительность звукового файла, и вызов play (duration), когда продолжительность больше, чем длина звука, вызывает ужасный сбой.

10 голосов
/ 26 марта 2011
var sound:Sound = whateverSoundYouNeedToPlay;
function playSound():void
{
    var channel:SoundChannel = sound.play();
    channel.addEventListener(Event.SOUND_COMPLETE, onComplete);
}

function onComplete(event:Event):void
{
    SoundChannel(event.target).removeEventListener(event.type, onComplete);
    playSound();
}
4 голосов
/ 09 апреля 2013
import flash.media.Sound;
import flash.media.SoundChannel;

var mySound:Sound = new Bgm(); //Bgm() is the class of the internal sound which can be done in the library panel. 

playSound();

function playSound():void
{
    var channel:SoundChannel = mySound.play();
    channel.addEventListener(Event.SOUND_COMPLETE, onComplete);
}

function onComplete(event:Event):void
{
    SoundChannel(event.target).removeEventListener(event.type, onComplete);
    playSound();
}

Это прекрасно работает.

3 голосов
/ 16 октября 2012

Чтобы немного расширить непрерывное воспроизведение @ scriptocalypse:

Проблема отсутствия надлежащего воспроизведения без пропусков возникает из-за mp3, включая информацию о файле в заголовке или хвосте файла (теги id3 и т. Д.)отсюда и небольшая пауза при попытке зацикливания.В зависимости от вашей ситуации вы можете сделать несколько вещей:

  1. Игнорируйте это, просто играйте как обычно, с небольшой паузой в конце каждого файла.Вы также можете попробовать замаскировать его другим звуком (падающим ударом лет) или постепенно исчезать и исчезать.
  2. Если ваши звуки встроены, а не потоковые, создайте файл fla и перетащите mp3 втам, и установите их для экспорта (так же, как вы добавите имя ссылки для мувиклипа и т. д.).Кажется, что при экспорте звуков, подобных этому, Flash учитывает задержку или удаляет ее при создании объекта Sound.В любом случае, вы можете просто сделать play() прохождение циклов, которые вы хотите для воспроизведения без пауз (я обнаружил, что использование параметра loops лучше, чем ожидание события SOUND_COMPLETE и его повторное воспроизведение).
  3. Вы можете попробовать некоторые библиотеки ogg использовать файлы .ogg вместо .mp3.Простой поиск в Google "as3 ogg lib" найдет то, что вам нужно.Лично мне было неудобно их использовать, и я не мог позволить себе добавить накладные расходы (в отличие от декодирования mp3, которое выполняется в проигрывателе).
  4. Если ваши mp3-файлы передаются в потоковом режиме, тоЕдинственный способ получить непрерывное воспроизведение - это наложить их на слои.Определите промежуток (в зависимости от того, что вы использовали для их кодирования, он будет отличаться - у моих файлов будет промежуток около 330 мс), и когда вы достигнете его, начните воспроизведение оверлея.Это настоящая боль, если вы делаете затухание, но когда это работает, это работает довольно хорошо.В худшем случае вы получите ситуацию (1)
2 голосов
/ 10 мая 2014

Я думаю, это то, что вы ищете, если голосовой / музыкальный файл находится в библиотеке:

var mysound:my_sound = new my_sound();
mysound.play(0,2); // this will repeat the sound 2 times.
1 голос
/ 14 февраля 2015

Мне кажется, это сработало:

var nowTime:Number = (new Date()).time;
var timeElapsed:Number = nowTime - _lastTime;

_lastTime = nowTime;
_musicTimeElapsed+=timeElapsed;

if(_musicTimeElapsed >= _musicA.length - GAP_LENGTH)
{
   _musicTimeElapsed = 0;
   _musicA.play(0);
}
0 голосов
/ 24 июня 2019

эта работа для меня:

import flash.media.Sound;
import flash.media.SoundChannel;

var soundUrl:String ="music.mp3";
var soundChannel:SoundChannel = new SoundChannel();
var sound:Sound = new Sound();

sound.load(new URLRequest(soundUrl));
soundChannel = sound.play();
soundChannel.addEventListener(Event.SOUND_COMPLETE,onComplete);

function onComplete(e:Event):void{
    sound = new Sound();
    sound.load(new URLRequest(soundUrl));
    soundChannel = sound.play();
    soundChannel.addEventListener(Event.SOUND_COMPLETE,onComplete);
}
0 голосов
/ 11 сентября 2012

Другие ответы хороши, однако, если вы не хотите использовать код (по какой-либо причине), вы можете поместить звук в мувиклип, установить для свойства звука значение «Поток», а затем добавить столько кадров, сколько вам нужно. например, клип, чтобы он полностью воспроизводился.

Это, конечно, менее предпочтительный способ, но для аниматоров я уверен, что он может быть предпочтительным в некоторых ситуациях (например, при синхронизации с анимацией рта, которую аниматор хочет зациклить).

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