2012-10-24 4 views
1

나는 사용자가 테스트를하고있을 때 소리를내는 iPhone 앱을 가지고있다. 지연이있을 때 사운드가 처음 재생되는 것을 제외하고는 훌륭하게 작동합니다. 사운드를 메모리에로드하는 것으로 가정합니다. 어떻게 사운드를 프리로드 할 수 있습니까?어떻게 사운드를 프리로드 할 수 있습니까?

- (void)doBuzz:(id)sender { 
SystemSoundID buzzsoundID; 
NSString *buzzsoundFile = [[NSBundle mainBundle] 
          pathForResource:@"buzz" ofType:@"caf"]; 

AudioServicesCreateSystemSoundID((CFURLRef) 
           [NSURL fileURLWithPath:buzzsoundFile] 
           , &buzzsoundID); 
AudioServicesPlaySystemSound(buzzsoundID); 

}

답변

1

SystemSoundID에 대한 선언을 UIViewController의 .h 파일로 이동 한 다음 NSString을 설정하고 ViewDidLoad에서 AudioServicesCreateSystemSoundID를 호출하여 사운드 지연 문제를 해결했습니다. 그런 다음 doBuzz 메서드를 호출하는 대신 소리를 내고 싶을 때 간단히 AudioServicesPlaySystemSound로 바꿨습니다.

-1

예압 performSelectorInBackground:@selector(<SELECTOR>)를 사용하여 사운드 다음은 사운드에 대한 내 코드입니다.

응용 프로그램 시작시 또는 이전에 어딘가에 파일을로드 할 수 있지만 실제로는 터치하지 않습니다.

+0

응용 프로그램 시작시 확실히로드하고 싶습니다. 귀하의 정보를 가져 주셔서 감사합니다. 그러나, 나의 무지를 용서하십시오, 그러나 나는 당신의 대답을 이해하지 못합니다. SELECTOR는 무엇입니까? – Rick

1

AVAudioPlayer을보고 설정하고 다시 사용할 수 있습니다. 그러나 더 중요한 것은, 그것을 설정할 때 사운드를 미리 메모리에로드하는 "연주 준비"라고 말할 수 있습니다. 따라서 실제로 플레이어에게 재생할 것을 말하면 즉시 재생됩니다. 나는 편리 최근에 생성 뭔가에 대해이 방법을 쓴하고 AVAudioPlayer 객체 반환 어딘가에 앱에서

 
+(AVAudioPlayer *)playerForFile:(NSString *)fileName 
{ 
    NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"caf"]; 
    NSURL *url = [NSURL fileURLWithPath:filePath]; 
    NSData *soundData = [NSData dataWithContentsOfURL:url]; 
    NSError *error = nil; 
    AVAudioPlayer *player = [[[AVAudioPlayer alloc] initWithData:soundData error:&error] autorelease]; 
    if (error) 
     NSLog(@"error creating player for %@: %@", fileName, [error localizedDescription]); 

    return (error ? nil : player); 
} 

당신 수도 설정과 같이 선수 개체 : 재생하려는

AVAudioPlayer *buzzSoundPlayer = [MyClass playerForFile:@"buzz"]; 
if (buzzSoundPlayer) { 
    [buzzsoundPlayer prepareToPlay]; 
} 

소리 :

[buzzSoundPlayer setCurrentTime:0]; 
[buzzSoundPlayer play]; 

당신은 사운드 파일의 시작 부분, 즉 0으로 현재 시간을 설정해야합니다, 당신은 때 사운드가 완료 괞 찮아 때문에 그것을 재생할 때마다 ying, "현재 시간"이 끝에 있습니다. 따라서 후속 재생 요청은 재생되지 않습니다. 그래서 우리는 현재 시간을 처음으로 되돌립니다.

플레이어에 대해서도 delegate을 설정할 수 있으며 사운드 재생이 완료되면 대리인 메서드를 통해 알림을받을 수 있습니다. 현재 시간을 0으로 재설정 할 수 있습니다.

Apple 설명서에서 AVAudioPlayerAVFoundation에 관한 모든 내용을 읽을 수 있습니다.

관련 문제