Задержка воспроизведения коротких звуков во Flash 9, Actionscript 3 - PullRequest
6 голосов
/ 23 октября 2008

У меня есть несколько очень коротких аудиоклипов (длиной менее секунды) для воспроизведения на различных событиях (при наведении курсора, нажатии и т. Д.). Тем не менее, обычно существует значительный разрыв между действием и фактическим воспроизведением звука. Я пробовал как встраивать звук в .swf, так и загружать его внешне при запуске, но оба приводят к одним и тем же результатам. Точно так же я пробовал с сжатым и несжатым аудио.

То, на что похоже похоже, заключается в том, что звуковые буферы намного длиннее, чем мне нужно, например, возможно, Flash оптимизирован для воспроизведения более длинных звуков без заикания за счет немного большего задержка в стартовых звуках. Может ли это быть так? Есть ли способ их поменять? Поскольку то, над чем я работаю, никогда не будет проигрывать звуки дольше секунды или дольше и всегда будет загружаться полностью в начале, не мешало бы иметь действительно короткие буферы.

Еще одна возможная вещь, которая может быть причиной: если я использую файлы .wav при использовании loadSound () ... я не могу заставить его воспроизводить звуки. Там нет ошибок, и все возвращается, как и должно быть, но реальный звук не воспроизводится, поэтому у меня они сейчас в формате .mp3. Возможно, при использовании аудио .mp3 (или любого сжатого аудио), будет просто отставание в его декодировании? Причина, по которой я до сих пор сомневаюсь в этом, заключается в том, что при встраивании их в файлы .swf как файлы .wav (путем импорта их в библиотеку) они по-прежнему имеют одинаковую задержку при воспроизведении.

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

var soundArray:Array = new Array();
loadSound( "click", "sounds/buttondroop4.mp3" );
loadSound( "hover", "sounds/Dink-Public_D-146.mp3" );

function loadSound( name:String, url:String ):void
{
   var req:URLRequest = new URLRequest( url );
   soundArray[ name ] = new Sound( req );
   soundArray[ name ].addEventListener( Event.COMPLETE, soundLoaded );
}
function soundLoaded( event:Event ):void
{
   for( var name:String in soundArray )
   {
      if( event.target == soundArray[name] )
      {
         trace( "Loaded sound [" + name + "]" );
         return;
      }
   }
}
function playSound( name:String ):void
{
   for( var nameSrc:String in soundArray )
   {
      if( name == nameSrc )
      {
         var channel:SoundChannel = soundArray[ name ].play();
         return;
      }
   }
}

// Sometime later, well after soundLoaded() callback is triggered...
playSound( "click" );
playSound( "hover" );

И альтернативный способ - встраивать их в библиотеку как классы и идти оттуда:

var sClick:soundClick = new soundClick();
var sHover:soundHover = new soundHover();
sClick.play();
sHover.play();

Звуковые файлы крошечные, обычно менее 10 КБ. Задержка достаточно очевидна, и одна из первых жалоб, которую кто-то испытывал, глядя на нее, заключалась в том, что звуковые эффекты при наведении на кнопки казались отсроченными, так что не только я привередничал. Я чувствую, что просто делаю что-то не так; есть слишком много флеш-вещей, которые имеют быстрые звуковые эффекты, и нет нигде подобного лага.

edit: В ответ на первый ответ о самих звуковых файлах я уже проверил, и звук начинается сразу в начале файла (даже обрывая все, кроме самой первой миллисекунды звука, я все еще слышу начало «тикового» шума, которое он издает).

Ответы [ 6 ]

6 голосов
/ 26 октября 2008

Это мелочь, но:

function playSound( name:String ):void
{
   for( var nameSrc:String in soundArray )
   {
      if( name == nameSrc )
      {
         var channel:SoundChannel = soundArray[ name ].play();
         return;
      }
   }
}

Должно быть:

function playSound(name:String):void
{
    if(soundArray[name])
    {
        soundArray[name].play();
    }
}

Нет необходимости в циклическом поиске, поскольку именно для этого предназначена хеш-таблица. Кроме того, вы не должны использовать Array вообще для этого, так как Array - это упорядоченный набор, который индексируется с использованием целых чисел. В этом случае вы хотите использовать объект (или словарь) и назовите его soundMap (поскольку он отображает имена звуков на звуковые объекты).

Что касается задержек звука - их не должно быть. Я сделал довольно много звука во Flash (включая тонны однократного звука при опрокидывании и выкатывании), и это никогда не было проблемой. Однако Flash Player 10 имеет новый API низкого уровня звука , который описан одним из инженеров Adobe в этой статье. Решение, включающее это, похоже на кувалду, но, возможно, вам нужна точность в миллисекундах.

Совет Fenomas дает мудрый совет: проверьте mp3-файл на наличие мертвого пространства в начале и в конце и обрежьте его как можно ближе. Кроме того - каков путь от обработчика события к вашей инструкции play? Там есть какие-нибудь возможные блоки? Какой формат mp3? Flash лучше всего работает с определенными кодировками (44,1 ГГц и 128 бит).

4 голосов
/ 15 декабря 2008

У меня была точно такая же проблема ... пока я не заметил, что проблема возникала только при предварительном просмотре во Flash. Попробуйте запустить исполняемый SWF (у меня это сработало).

4 голосов
/ 23 октября 2008

Итак, мой первый ответ: когда я делаю что-то подобное, обычно я нахожу, что в звуковые файлы встроено определенное время. Вы можете проверить звуковой редактор, но В прошлом мы импортировали звук в Flash IDE, сделали пустой фрагмент ролика и поместили звук в первый кадр клипа. Затем, но редактируя звук кадра, вы получаете симпатичный маленький интерфейс для перетаскивания начальной / конечной точек воспроизведения звука. Затем я либо прикреплял / удалял клип, чтобы воспроизвести звук, либо оставлял его где-нибудь и использовал кадрирующие команды.

Если вы уже уверены, что время выполнения указывается во вспышке, а не в звуке, у меня нет никаких подсказок или хитростей, кроме достаточно очевидных вещей, таких как воспроизведение звуков щелчка по клавише вниз, а не вверх ...

3 голосов
/ 25 августа 2009

У меня такая же проблема. Наткнулся на это. По-видимому, если вы продолжаете «проигрывать» звуковой проигрыватель в фоновом режиме, он не должен «перезагружаться» для небольших звуков. Еще не пробовал ...

http://www.ghostwire.com/blog/archives/as3-fixing-the-lag-that-arises-when-playing-a-short-sound-effect/

2 голосов
/ 31 августа 2011

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

StandingWave
https://github.com/maxl0rd/standingwave3
http://maxl0rd.github.com/standingwave3/

Кроме того, не забудьте проверить настройки звука среды вокруг вашего SWF. Я часами отлаживал свое приложение, пока не понял, что задержка пришла из-за подключения наушников через Bluetooth.

1 голос
/ 19 июля 2009

У меня был плохой звук (около 1 полной секунды) с Flash Player 10.0.2.x. Lantency было то же самое при остановке звукового канала.

Я только что обновился до 10.0.22.x и проблема исчезла.

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