У меня есть несколько очень коротких аудиоклипов (длиной менее секунды) для воспроизведения при различных событиях (наведение курсора на кнопку, щелчок и т. д.). Однако обычно существует значительная задержка между действием и фактическим воспроизведением звука. Я пробовал как встраивать звук в .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: в ответ на первый ответ о самих звуковых файлах, я уже проверил, и звук начинается сразу в начале файла (даже вырезая все, кроме самой первой миллисекунды звука, я все еще слышу начало звук тика).
![[UX] Категории и настройки внешнего вида Flash-сообщений](https://i.imgur.com/5LZljB8b.jpeg)
Что ж, мой первый поверхностный ответ заключается в том, что когда я делаю такие вещи, обычно я обнаруживаю, что звуковые файлы имеют определенное время подготовки. Вы можете проверить в звуковом редакторе, но то, что я сделал в 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, и проблема исчезла.
У меня такая же проблема. Наткнулся на это. Очевидно, если вы держите звуковой проигрыватель "тихо" в фоновом режиме, ему не нужно "перезапускать" для слабых звуков. Еще не пробовал ...
Это сработало для меня - мне все равно нужна была атмосфера, поэтому я убил 2 зайцев одним выстрелом.
Обновлено: Ну, я думал, что это сработало для меня, но, может быть, нет ... Это действительно похоже на то, что ДОЛЖНО работать.
Одним из решений может быть использование библиотеки ActionScript, которая считывает звуковые файлы как двоичные данные.
Постоянная волна
https://github.com/maxl0rd/standingwave3
http://maxl0rd.github.com/standingwave3/
Кроме того, не забудьте проверить настройки звука в среде вокруг вашего SWF-файла. Я часами отлаживал свое приложение, пока не понял, что задержка исходит от подключения наушников Bluetooth.
Задержка или задержка связана с тем, как работает кодирование MP3. Однако flash может обойти это, если вы встраиваете звуки как WAV-файлы. (WAV-файлы не могут быть загружены из внешнего источника.) Если вас интересуют подробности, взгляните на Часть 2 здесь: compuphase.com/mp3/mp3loops.htm