PDA

Просмотр полной версии : зацикливание звука sound.start


provigator
08.08.2010, 13:49
пишу на AS2.0
аттачу из библиотеки звук:
snd=new Sound()
snd.attachSound("s")
в нужное время проигрываю звук, зацикливая:
snd.start(0, 999)

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

подскажите как решить эту проблему

udaaff
08.08.2010, 13:51
Для оформления своего кода надо использовать теги (http://www.flasher.ru/forum/showthread.php?t=122539)

mooncar
08.08.2010, 14:08
Попробуйте
snd = new Sound();
snd.attachSound("s");
snd.onSoundComplete = function ()
{
snd.start();
};

snd.start();
Но идеальную склейку никогда не получится организовать.

Также советую использовать для экспериментов несжатый звук (wav).

Можно использовать два экземпляра одного и того же звука и за несколько миллисекунд до окончания одного стартовать другой, но даже в этом случае будут временные искажения просто в силу того, что на флеше точно работать со временем невозможно, по крайней мере на AS2 (Особенно измерять текущее положение проигрываемого звука).

В дополнение вот (http://www.flasher.ru/forum/showthread.php?t=130658) тема была. Посмотрите там второй пример ("Cклеиваем звук без шва.rar")

provigator
08.08.2010, 14:35
2 mooncar:
по твоему примеру такая же пауза

mooncar
08.08.2010, 14:45
Ты о примере с onSoundComplete ?
Ну да, я говорил, что это не идеальный вариант, он только удобнее - не надо указывать 999 как количество повтора.

Тогда смотри тему, которую я привел и второй пример там.
И учти, идеального решения нет.

rainbowrussia
08.08.2010, 14:58
таким образом невозможно получить непрерывный звук
Есть подозрение что у вас в звуке присутствует пауза в начале или в конце.

mooncar
08.08.2010, 15:02
rainbowrussia, пауза, пусть крохотная, но будет в любом случае...

provigator
08.08.2010, 15:29
2 mooncar:

помогла твоя идея:
Можно использовать два экземпляра одного и того же звука и за несколько миллисекунд до окончания одного стартовать другой.

snd1=new Sound()
snd1.attachSound("s")
snd2=new Sound()
snd2.attachSound("s")

n=1
t=0
snd1.start()

onEnterFrame=function() {
t++
if(n==1 and t==42) {
snd1.stop()
snd2.start(0.1,1)
t=0
n=2
}
if(n==2 and t==42) {
snd2.stop()
snd1.start(0.1,1)
t=0
n=1
}
}

cтартовать нада не с позиции 0 которая стоит по дефолту: sound.start() а с 0.1 и более секунды звука sound.start(0.1,1)
c десятыми долями секунды работать возможно ведь выставляемое fps это количество кадров в секунду
в моём примере я подбирал время проигрывания звука t с учётом fps=24 а также времени проигрывания звука

стыковка получилась идеальной
спс

mooncar
08.08.2010, 15:43
Ну вот и хорошо... код только оформите.

rainbowrussia
08.08.2010, 16:22
rainbowrussia, пауза, пусть крохотная, но будет в любом случае...

Не поленился, провел эксперимент. Сгенерировал синус без пауз вначале и в конце, приаттачил, воспроизвел. Если в свойствах экспорта ставить MP3 то слышен артефакт, видимо за счет выравнивания MP3 по какому-то значению в милисекундах/фреймах или за счет алгоритма кодирования начало получается "замятым". Если ставить ADPCM или RAW, то получается чистый бесшовный звук.


нада не с позиции 0 которая стоит по дефолту: sound.start() а с 0.1 и более секунды звука sound.start(0.1,1)
Что лишний раз доказывает наличие паузы вначале.

mooncar
08.08.2010, 16:34
rainbowrussia, если компрессию убрать совсем? (Disabled в свойствах проекта)

rainbowrussia
08.08.2010, 19:14
mooncar, я имел в виду Compression в свойствах объекта Sound, лежащего в библиотеке. Во вложении флешка с зацикленным звуком и типом сжатия Raw, то есть без изменений, если я верно понял.