Каков наилучший способ быстрого воспроизведения звука при быстром нажатии кнопки Xcode? - PullRequest
6 голосов
/ 27 июня 2010

У меня есть деки это просто экран с 8 кнопками. каждая отдельная кнопка будет иметь свой собственный звук, который будет воспроизводиться при нажатии кнопки Есть несколько способов воспроизведения звука, например, использование SystemSound или AVAudioPlayer. Кажется, что системный звук имеет самое быстрое время отклика, avaudioplayer довольно медленный, он не выдерживает, если пользователь нажимает на кнопки очень быстро, я создал аудиоплеер для каждого звука, который был довольно грязным вот как я сейчас играю звуки .h файл

@interface MainScreenViewController : UIViewController <AVAudioPlayerDelegate, UITabBarControllerDelegate> {
 AVAudioPlayer *player;
 CFURLRef  keNURL;
 SystemSoundID    keNObject;
 //KE LOUD
 CFURLRef  keLURL;
 SystemSoundID    keLObject;
 //GE NORMAL
 CFURLRef  geNURL;
 SystemSoundID    geNObject;
 //GE LOUD
 CFURLRef  geLURL;
 SystemSoundID    geLObject;
 //NA NORMAL
 CFURLRef  naNURL;
 SystemSoundID    naNObject;
 //NA LOUD
 CFURLRef  naLURL;
 SystemSoundID    naLObject;
 //RA
 CFURLRef  raURL;
 SystemSoundID    raObject;
 //DAGGA CLICK
 CFURLRef  daCURL;
 SystemSoundID    daCObject;
 //TILLI CLICK
 CFURLRef  tiCURL;
 SystemSoundID    tiCObject;
}
@property (nonatomic, retain) AVAudioPlayer *player;
@property (readwrite)    CFURLRef        keNURL;
@property (readonly)    SystemSoundID    keNObject;
@property (readwrite)    CFURLRef        keLURL;
@property (readonly)    SystemSoundID    keLObject;
@property (readwrite)    CFURLRef        geNURL;
@property (readonly)    SystemSoundID    geNObject;
@property (readwrite)    CFURLRef        geLURL;
@property (readonly)    SystemSoundID    geLObject;
@property (readwrite)    CFURLRef        naNURL;
@property (readonly)    SystemSoundID    naNObject;
@property (readwrite)    CFURLRef        naLURL;
@property (readonly)    SystemSoundID    naLObject;
@property (readwrite)    CFURLRef        raURL;
@property (readonly)    SystemSoundID    raObject;
@property (readwrite)    CFURLRef        daCURL;
@property (readonly)    SystemSoundID    daCObject;
@property (readwrite)    CFURLRef        tiCURL;
@property (readonly)    SystemSoundID    tiCObject;
}

затем действия, которые воспроизводят отдельные звуки

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

-(IBAction)geSound{
 AudioServicesPlaySystemSound (self.geNObject);
}

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

Ответы [ 5 ]

8 голосов
/ 28 июня 2010

Исходя из опыта, AVAudioPlayer довольно хорошо работает при воспроизведении нескольких звуков одновременно или очень быстро один за другим. Лучший способ его использования - просто создать один метод, который вы вводите в NSString, чтобы воспроизвести какой-либо звук с именем, содержащимся в этом NSString ... таким образом, вы создадите новый проигрыватель для каждого звукового файла. что ты играешь. Будьте осторожны при освобождении выделенных игроков, если только вы не знаете, что с ними покончено.

Если у вас нет очень больших звуковых файлов, для буферизации которых может потребоваться короткая секунда (вам придется самостоятельно выяснить, можете ли вы жить с любой задержкой или нет), у меня никогда не возникало проблем с медленной , Если это медленно, вы, вероятно, делаете что-то против рекомендаций Apple относительно декодирования определенных файлов (то есть для нескольких звуков одновременно, Apple рекомендует формат CAF, так как он аппаратно декодируется, а не программно декодируется): http://developer.apple.com/iphone/library/documentation/AVFoundation/Reference/AVAudioPlayerClassReference/Reference/Reference.html

Обновление

Вот как я кодирую свои файлы с помощью сценария оболочки. Поместите это в файл с именем batchit.sh в своем собственном каталоге. Затем поместите в этот каталог любые файлы .WAV, которые вы хотите закодировать как файл .CAF. Откройте Terminal на вашем Mac, cd для этого каталога и введите sh batchit.sh и дайте ему это сделать. Пакетное преобразование всех файлов ... Вот код:

for f in *; do
if  [ "$f" != "batchit.sh" ]
then
    /usr/bin/afconvert -f caff -d ima4 $f 
    echo "$f converted"
fi
done

Обратите внимание, что я ничего не делал в методе audioPlayerDidFinishPlaying, который является методом делегата AVAudioPlayer. Вам нужно будет добавить код для правильного освобождения игроков после того, как каждый из них закончил играть (эй, я не могу сделать всю работу за вас :), чтобы вся память была распределена правильно. В противном случае вы в конечном итоге закончите, если будете бесконечно продолжать создавать игроков, не освобождая их. Поскольку кажется, что у вас тяжелый день ... см. Ниже большой совет.

Это вся помощь, которую я могу оказать. Ты должен учиться и зарабатывать остальное

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {

    // do something here if you want.. you know like maybe release the old players by uncommenting the line below :)

    //[player release];

}
2 голосов
/ 12 сентября 2010

22/03/2014 - Обновление: избавился от моего чрезмерно взволнованного поста (который был написан давно) и обновлен, чтобы изобразить более подходящий ответ.

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

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

Вот ресурсы, которые я использовал, которые помогли облегчить начинание внедрения OpenAL в первый раз:

  1. OpenAL на iPhone
  2. Именно из-за этой ссылки этого видеоурока я смог создать отличный звукменеджер синглтон.Это позволило мне воспроизводить все звуки, которые мне были нужны из любого класса, который я хотел, с небольшим управлением звуком, синглтон позаботился обо всем за меня.

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

1 голос
/ 05 мая 2012

Просто собираюсь добавить в пользу других, даже если это будет через 2 года после выпуска.

Я обнаружил, что если это короткие звуки, с вашей загрузкой приложения все будет в порядке. буферизовать все ваши треки, запустив экземпляр prepare для воспроизведения для каждого звука (в цикле for) (затем выпустить - достаточно, чтобы ваш процессор запомнил, где находится файл)

Это отнимает начальное время загрузки в следующий раз, когда вы приходите к нему, и позволяет звукам запускаться быстрее

0 голосов
/ 11 июля 2010

Вы пробовали воспроизводить каждый звук в отдельном потоке?Вы можете попробовать базовую NSOperation

0 голосов
/ 28 июня 2010

вы можете создать AVAudioPlayer для каждого звука, а затем просто приостановить / воспроизвести его.

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