PDA

Просмотр полной версии : "ровное" звучание Метронома


Evgan
05.05.2010, 18:01
Приветствую всех

Нужна помощь с Метрономом:
заказчик уже всю плеш проел с тем, что звучание не равномерное, мол некие сбои в переодичности воспроизведения звука счелчка
звук у меня - это коротенький wav файл который переодично запускается по средствам переодичной функции setInterval
носом в кучу примеров где всё "ровно" тикает, а мне от этого не легче+)
Если кто сталкивался с разработкой таких вещей, подскажите выход из сложившецся ситуации, может каким то другим способом звук выводить переодично или что то ещё, чего я по неопотности не знаю
Благодарю

amesqit
05.05.2010, 19:35
возможно у вас малькое значение fps, setInterval стремится выполняться с частотой fps, поэтому при маленьких значениях fps вызовы функции могут пропадать.

Evgan
06.05.2010, 01:30
Увы но нет, ставил даже максимальный fps (120), не помогло, сама функция setInterval не идеальа, когда периуд повторения равна, например, 230 мс, то на самом деле функция повторяется через 230 ... 238 мс, проверка делалась по средством setTimer().

samana
06.05.2010, 18:21
Что бы от FPS не "зависило" можно в конце функции дописать
updateAfterEvent()

Psycho Tiger
06.05.2010, 18:53
Это погрешности флеш плеера, их никак не избежать.
По поводу того, что setInterval стремится к FPS - это всё ложь и провокация, он асинхронен.

И да, используйте Timer.

udaaff
06.05.2010, 21:16
Timer — это не тут :)

Psycho Tiger
06.05.2010, 22:50
Ой, разделом ошибся =)

megapup
07.05.2010, 02:01
getTimer() возвращает количество миллисекунд с момента запуска флешки
если с умом сделать, будет тикать точно

Evgan
07.05.2010, 02:17
что вы предлагаете? чделать переодичную функцию которая бы проверяла сколько времени прошло после начала проигрывания ролика и сопоставлять некие промежуточные значения?

VVall
07.05.2010, 02:38
getTimer имеет точно такую-же низкую точность, как и setInterval и все таймеры во Flash.

rainbowrussia
07.05.2010, 06:08
Метроном фиксированный? Если да, то можно попробовать дополнить файл тишиной до нужной длины и сделать:

mySound = new Sound();
mySound.attachSound("chpok");
mySound.start(0, 200);

На такое воспроизведение, вроде бы, не влияет почти ничего, в отличает от интервалов, таймера, кадров.

Ну а если интервал метронома произволен, то видел в сети программые генераторы звука на флеше, то есть паузу можно программно выставить и запустить звук.

А у вас ко звуку метронома изображение разве никакое не привязано?

UPD. Ну и в догонку еще один вариант - отсчитывать интервалы на javascript (setTimeout) и запускать функцию во флеше, проигрывающую звук (вроде так можно). Как тут будет с точностью не знаю - не проверил.

etc
07.05.2010, 08:06
Как тут будет с точностью не знаю - не проверил.
Ещё хуже.

wvxvw
07.05.2010, 18:16
Ок... вобщем, ситуация примерно следующая. Когда вы начинаете во флеше воспроизводить звук, флешу нужно получить систему. На то, чтобы ее получить уходит время. Это время может быть разным т.как. никакая ось вам прям сразу напрямую доступ к девайсу не даст.
Точность таймера и всяких интервалов во флеше колеблется в пределах 10 миллисекунд, на то, чтобы получить систему, на разных осях может уйти и до 100 миллисекунд... Это значит, что вариант с таймерами отпадает в принципе.
Но, если флеш будет постоянно играть PCM звук (для MP3 у него особая схема синхронизации), то система у него будет постоянно. Если звук встроенный, то можно добится вполне сносного результата... Вы никогда не сможете добится, чтобы воспроизведение началось именно по клику на кнопке, например, но добится того, чтобы интервалы впоследствии были ровными в принципе можно.
Я бы наверное все-таки попробовал это делать на AS3 под десятый плеер с использованием SampleDataEvent, не то, чтобы оно было так уж сильно лучше, но все же... Еще есть вариант - в 10.1 добавили возможность подгружать байты NetStream'у, я это еще не пробовал, и не знаю как там с синхронизацией, но смысл попробовать думаю есть.

VVall
07.05.2010, 19:33
С SampleDataEvent всё будет очень ровно.

wvxvw
07.05.2010, 21:12
Если нужно только один звук играть - то да, а если нужно несколько синхронизировать - то нет. Т.как не извесно, и не возможно рассчитать время которое пройдет между play() и тем, когда действительно начнется воспроизведение.

VVall
07.05.2010, 22:06
Несколько можно смешать программно, играя через один поток. Это медленно.