У меня есть звуковая карта, это - просто экран приблизительно с 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 путем вперед, чтобы я создал звуковую карту. спасибо особенно, когда пользователь коснется на плате, действительно быстро чередующейся между ударами.. если не, что лучший способ состоит в том, чтобы играть звук, который отвечает действительно хорошо?
Исходя из опыта, 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];
}
Вы можете создать AVAudioPlayer для каждого звука и затем просто ставить его на паузу/воспроизводить.
Пробовали ли вы воспроизводить каждый звук в отдельном потоке? Вы можете попробовать базовую NSOperation