PDA

Просмотр полной версии : Шорох при уменьшении громкости.


RedLizard
30.04.2013, 22:54
При нажатии на клавишу начинается проигрывание звука:

soundChannel = sound.play();

При отпускании клавиши в цикле запускается уменьшение громкости на 0.1 за шаг:

for(var cnt1:int = 10;cnt1 < 0;cnt1++)
{
soundChannel.soundTransform = new SoundTransform(cnt1/10);
}

В результате возникает непонятный баг, на звук накладывается шум и треск. Это похоже на тот эффект, когда на старой технике звук регулируется изношенным переменным резистором. Даже не знаю в какую сторону копать для лечения этой проблемы.

И вторая беда. При повторном нажатии на одну и ту же клавишу, старый звук останавливаю, новый проигрываю:

soundChannel.stop();
soundChannel = sound.play();

В результате если быстро нажимать на одну и ту же клавишу (т.е. быстро создавать/останавливать звук) появляются щелчки. Что тоже непонятно.

В живую попробовать проблему можно здесь http://www.pixorama.ru/demo/piano

Wolsh
30.04.2013, 23:36
Приведенный код ни разу не выполнится, так что непонятно что здесь обсуждать.
Не говоря уже о том, что совершенно непонятно, зачем тут вообще нужен цикл.

Партизан
30.04.2013, 23:41
Звук в цикле уменьшать без толку... Цикл мгновенно отработает. Что-бы сделать затухание нужно учесть время между шагами. Возможно из-за этого и щелчок.
Еще щелчок возможен из-за того, что вы в каждой итерации назначаете новый класс SoundTransform, хоть это и маловероятно но все же...

Добавлено через 2 минуты
Приведенный код ни разу не выполнится, так что непонятно что здесь обсуждать.
Не говоря уже о том, что совершенно непонятно, зачем тут вообще нужен цикл.
У, шайтан... :) Я даже не обратил внимания на условия цикла...

RedLizard
30.04.2013, 23:43
Приведенный код ни разу не выполнится, так что непонятно что здесь обсуждать.
Не говоря уже о том, что совершенно непонятно, зачем тут вообще нужен цикл.

Ну естественно это псевдокод. Да в цикле ошибку допустил -- должен быть. Это не принципиально. Вопрос в другом, код для большей наглядности приведен.

Добавлено через 2 минуты
Звук в цикле уменьшать без толку... Цикл мгновенно отработает. Что-бы сделать затухание нужно учесть время между шагами. Возможно из-за этого и щелчок.
Еще щелчок возможен из-за того, что вы в каждой итерации назначаете новый класс SoundTransform, хоть это и маловероятно но все же...

Добавлено через 2 минуты

У, шайтан... :) Я даже не обратил внимания на условия цикла...

Ну не важно, пусть не в цикле, пусть по таймеру с задержкой в 100 миллисекунд, у меня так и сделано, здесь просто для краткости так написал. Непонятно откуда берется шуршание.

Добавлено через 55 минут
Нагуглил кучу топиков с описанием подобной проблемы, и все без решения. Вот тут та же самая проблема, только звук уменьшается твинером http://stackoverflow.com/questions/11324341/crackle-appears-when-fading-sound-as3

Партизан
01.05.2013, 01:18
Ну может вам это поможет. У меня прекрасно работает, без щелчков.
package
{
import com.greensock.TweenMax;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundTransform;
import flash.net.URLRequest;


/**
* ...
* @author Mikhail Klabukov
*/
public class BackgroundSound
{
static public const SOUND_OFF:String = "soundOff";
static public const SOUND_ON:String = "soundOn";
private var sound:Sound;
private var channel:SoundChannel
private var played:Boolean = false;
private var _pos:Number;
private var st:SoundTransform;

public function BackgroundSound()
{
sound = new Sound(new URLRequest('**********soundUrl**********'));
sound.addEventListener(IOErrorEvent.IO_ERROR, errorSoundLoad)
channel = sound.play(0, 10000);
played = true;
MainControls.self.addEventListener(MainControls.SOUND_SWITCH, switchSound);
}

private function errorSoundLoad(e:IOErrorEvent):void
{
trace(e)
}

private function switchSound(e:Event):void
{
if (TweenMax.isTweening(st))
return;
st = channel.soundTransform;
if (played)
{
_pos = channel.position;
TweenMax.to(st, 2, {volume: 0, onUpdate: function():void
{
channel.soundTransform = st;
}, onComplete: function():void
{
channel.stop();
}});
played = false
MainControls.self.dispatchEvent(new Event(SOUND_OFF));
}
else
{
channel = sound.play(_pos, 10000);

TweenMax.to(st, 3, {volume: 1, onUpdate: function():void
{
channel.soundTransform = st;
}});
played = true;
MainControls.self.dispatchEvent(new Event(SOUND_ON));

}
}

}

}

RedLizard
01.05.2013, 14:57
Ну может вам это поможет. У меня прекрасно работает, без щелчков.


В том то и дело, что щелчки так же есть. Методом научного тыка удалось установить, что щелчки при быстром изменении громкости есть всегда во флеше. Просто на некоторых звуках это заметнее. Пример, берем тот же ютуб, ищем видео где играют на пианино. http://www.youtube.com/watch?v=x9a5u4JzkLg и ползунок громкости резко двигаем вверх-вниз. И получаем тоже самое шуршание что и в моем коде.

КорДум
01.05.2013, 15:05
У меня артефактов нет.
FP 11,7,700,169
Win8 x64

Помнится, когда раньше баловался с секвенсорами, у меня не хватало процессора на реалтаймовую обработку midi VST инструментами. Треск был всегда.

RedLizard
01.05.2013, 15:12
У меня артефактов нет.
FP 11,7,700,169
Win8 x64

Помнится, когда раньше баловался с секвенсорами, у меня не хватало процессора на реалтаймовую обработку midi VST инструментами. Треск был всегда.

В том то и дело, что щелчки так же есть. Методом научного тыка удалось установить, что щелчки при быстром изменении громкости есть всегда во флеше. Просто на некоторых звуках это заметнее. Пример, берем тот же ютуб, ищем видео где играют на пианино. http://www.youtube.com/watch?v=x9a5u4JzkLg и ползунок громкости резко двигаем вверх-вниз. И получаем тоже самое шуршание что и в моем коде.

Вот проделай то что я выше описал.

КорДум
01.05.2013, 15:18
Я на основе этого эксперимента и сказал.

iflamberg
07.05.2013, 15:12
У меня тоже нет никаких щелчков. Колонки/наушники/звукавая карта глючат?

AlexLucas
07.05.2013, 20:14
Есть шуршание, но это дефект самого видео (ваша ссылка), там даже если и не дёргать ползунок, всё равно оно слышно.
Никаких щелчков не заметил ни в одном браузере.