Задержка между различными звуками в приложении iPhone - PullRequest
3 голосов
/ 01 июня 2011

Я пытаюсь создать небольшое приложение для iPhone с несколькими кнопками для воспроизведения звуков WAV. У меня кнопки работают, но у меня небольшая задержка (~ 0,5 сек).

Это мой файл .m:

#import "buttonSoundViewController.h"

@implementation buttonSoundViewController
//@synthesize player;

-(IBAction) playSoundA:(id)sender{
    NSString *path = [[NSBundle mainBundle] pathForResource:@"a" ofType:@"wav"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];
}

-(IBAction) playSoundB:(id)sender{
    NSString *path = [[NSBundle mainBundle] pathForResource:@"b" ofType:@"wav"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
    [player release];
}

-(void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error {
}

-(void)audioPlayerBeginInterruption:(AVAudioPlayer *)player {
}

-(void)audioPlayerEndInterruption:(AVAudioPlayer *)player {
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload {
}

- (void)dealloc {
    [audioPlayer release];
    [super dealloc];
}   

@end

Как я могу избежать этой задержки между воспроизведением разных звуков?

Ответы [ 5 ]

6 голосов
/ 01 июня 2011

Использование AudioServices действительно намного быстрее для небольших звуков (менее 30 секунд).Требуемый код тоже не очень длинный (но требует некоторого старого доброго C).

#import <AudioToolbox/AudioServices.h>

SystemSoundID soundID = 0;
NSString* str =  [[NSBundle mainBundle] pathForResource:fileName ofType:nil];
CFURLRef soundFileURL = (CFURLRef)[NSURL URLWithString:str ];
OSStatus errorCode = AudioServicesCreateSystemSoundID(soundFileURL, &soundID);
if (errorCode != 0) {
    // Handle failure here
}
else
    AudioServicesPlaySystemSound(soundID);

Также вы можете оптимизировать свои звуки (уменьшить их размер) с помощью следующей команды терминала:

afconvert mysound.caf mysoundcompressed.caf -d ima4 -f caff
2 голосов
/ 01 июня 2011

Вы можете упростить вещи, используя системные звуки.Посмотрите: AudioServicesCreateSystemSoundID в документации.Существует также «Справочный документ по системным звуковым сервисам», в котором говорится об этой и других связанных функциях.Это простой и эффективный способ воспроизводить короткие звуки.Не уверен, что это решит ваши проблемы с задержкой, но это хорошее начало.Вы также можете попробовать использовать несколько разных типов звуковых файлов.Возможно, есть проблема с тем, как она была или не была сжата.

1 голос
/ 18 марта 2012

Из Apple Docs возьмите класс SoundEffect в проекте BubbleLevel

SoundEffect - это простая оболочка Objective-C для Audio Services функции, позволяющие загружать и воспроизводить звуковые файлы.

Классы / SoundEffect.m

это сделает воспроизведение файлов таким же легким, как

  SoundEffect *soundEffect = [SoundEffect soundEffectWithContentsOfFile:@""]
  [soundEffect play];

он также будет обрабатывать освобождение памяти. AudioServicesDisposeSystemSoundID (soundID);

1 голос
/ 02 сентября 2011

Может быть, вы могли бы взглянуть на AppSoundEngine .Он устраняет задержку и значительно упрощает использование System Sound Services, поскольку является оболочкой target-c для SystemSoundID и связанных функций C.

Невозможно получить приемлемую задержку (<10 мс) от AVAudioPlayer.System Sound Services - это путь. </p>

0 голосов
/ 01 июня 2011

Одним простым исправлением было бы просто назначить AVAudioPlayer для двух звуков в методе init вашего buttonSoundViewController. Тогда эти 2 аудиопроигрывателя уже будут готовы играть на ваших кнопочных делегатах.

Самый быстрый способ воспроизведения звуков - это использование аудиоустройства RemoteIO, но это гораздо более сложный и API-интерфейс.

...