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

У меня есть звуковая карта, это - просто экран приблизительно с 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);
}

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

6
задан Cœur 7 June 2019 в 16:51
поделиться

3 ответа

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

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

Обновление

Вот как я кодирую свои файлы с помощью сценария оболочки. Поместите это в файл с именем batchit.sh в его собственном каталоге. Затем поместите в этот каталог все файлы .WAV, которые вы хотите закодировать как файл .CAF. Откройте Терминал на вашем 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];

}
8
ответ дан 9 December 2019 в 22:28
поделиться

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

0
ответ дан 9 December 2019 в 22:28
поделиться

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

0
ответ дан 9 December 2019 в 22:28
поделиться