Я пошел бы с опросом.
Сетевые проблемы заставляют FileSystemWatcher
быть ненадежными (перегружая ошибочное событие).
Самый надежный метод, если вы можете использовать Flash Player 10, - это использовать новое событие SampleDataEvent.SAMPLE_DATA.
В частности, вы сначала создаете экземпляр нужного звука, а затем используете новый метод извлечения для преобразования звука в необработанные данные PCM, закодированные в ByteArray. Затем вы можете создать новый объект Sound и настроить прослушивание его события SampleDataEvent.SAMPLE_DATA. Когда вызывается это событие, вы отправляете 2-8 КБ (меньшее количество снижает задержку, но увеличивает вероятность слышимых артефактов) данных из ByteArray. Вы просто убедитесь, что при выходе из конца ByteArray вы просто вернетесь в начало.
Этот метод гарантирует, что вы '
Вот как это сделал 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 нет задержки в начале / конце, но я предлагаю открыть его с смелостью и убедиться, что нет задержки.
Гэп-зацикливание mp3 не является тривиальным из-за того, как работает формат. Немного упростить; звук устанавливается на несколько кадров, это число не может быть выбрано произвольно, вместо этого требуется некоторая прокладка (с тишиной). Mp3 не имеет возможности сохранить количество добавленных отступов, поэтому эта информация теряется после кодирования файла.
Flash IDE обходит это, встраивая эти метаданные, и вы тоже можете. Вам просто нужно знать, сколько задержки добавляет кодировщик.
Андре Мишель объясняет это лучше, чем я могу в своем блоге.
По словам этого парня , вы должны импортировать музыкальный цикл как wav, а сама Flash IDE сжать в mp3. Использование Flash импортированных mp3-данных означает, что он не знает, как правильно их зациклить.