Задержка воспроизведения коротких звуков во Flash 9, ActionScript 3

У меня есть несколько очень коротких аудиоклипов (длиной менее секунды) для воспроизведения при различных событиях (наведение курсора на кнопку, щелчок и т. д.). Однако обычно существует значительная задержка между действием и фактическим воспроизведением звука. Я пробовал как встраивать звук в .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: в ответ на первый ответ о самих звуковых файлах, я уже проверил, и звук начинается сразу в начале файла (даже вырезая все, кроме самой первой миллисекунды звука, я все еще слышу начало звук тика).

Задержка или задержка связана с тем, как работает кодирование MP3. Однако flash может обойти это, если вы встраиваете звуки как WAV-файлы. (WAV-файлы не могут быть загружены из внешнего источника.) Если вас интересуют подробности, взгляните на Часть 2 здесь: compuphase.com/mp3/mp3loops.htm

nikc.org 25.08.2009 17:24
[UX] Категории и настройки внешнего вида Flash-сообщений
[UX] Категории и настройки внешнего вида Flash-сообщений
Flash-сообщение - это обычный веб-элемент, используемый для отправки короткого сообщения пользователю. Например, на странице входа в систему может...
6
1
7 878
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

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

Ответ принят как подходящий

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

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();
    }
}

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

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

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

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

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

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

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

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

Это сработало для меня - мне все равно нужна была атмосфера, поэтому я убил 2 зайцев одним выстрелом.

Danny Staple 05.05.2012 16:40

Обновлено: Ну, я думал, что это сработало для меня, но, может быть, нет ... Это действительно похоже на то, что ДОЛЖНО работать.

player_03 05.10.2012 05:26

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

Постоянная волна https://github.com/maxl0rd/standingwave3
http://maxl0rd.github.com/standingwave3/

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

Другие вопросы по теме