2011-10-15 2 views
1

아래 전화에서 내 앱에서 네 가지 사운드에 대한 AVAudioPlayer를 준비 중입니다. 이 작업을 수행하지 않으면 응용 프로그램이 약 1.5 초 지연됩니다. 단지 듣고 싶은 부분에서만 수행합니다. 그래서이 코드를 더보기 좋게 만들거나 더 효율적으로 작업 할 수있는 방법이 있습니까? 지금은 App-Delegate에서이 사운드를 준비하고 있기 때문에 조금 늦어집니다. 그래서 여기 코드는 더 나은 다음이 코드를 만들 수있는 방법이 있다면 알려주세요 : 초기화 시간이 귀하의 유일한 관심사 경우효율적인 코드? (AVAudioPlayer)

- (void)readySounds { 
     NSString *path = [[NSBundle mainBundle] pathForResource:@"TrackUno" ofType:@"mp3"]; 
     NSURL *file = [[NSURL alloc] initFileURLWithPath:path]; 
     AVAudioPlayer *one = [[AVAudioPlayer alloc] initWithContentsOfURL:file error:nil]; 
     [file release]; 
     self.tr1 = one; 
     [one release]; 
     [tr1 prepareToPlay]; 
     [tr1 setDelegate:self]; 

     NSString *path2 = [[NSBundle mainBundle] pathForResource:@"TrackDos" ofType:@"mp3"]; 
     NSURL *file2 = [[NSURL alloc] initFileURLWithPath:path2]; 
     AVAudioPlayer *two = [[AVAudioPlayer alloc] initWithContentsOfURL:file2 error:nil]; 
     [file2 release]; 
     self.tr2 = two; 
     [two release]; 
     [tr2 prepareToPlay]; 
     [tr2 setDelegate:self]; 

     NSString *path3 = [[NSBundle mainBundle] pathForResource:@"Click" ofType:@"mp3"]; 
     NSURL *file3 = [[NSURL alloc] initFileURLWithPath:path3]; 
     AVAudioPlayer *three = [[AVAudioPlayer alloc] initWithContentsOfURL:file3 error:nil]; 
     [file3 release]; 
     self.clk = three; 
     [three release]; 
     [clk prepareToPlay]; 
     [clk setDelegate:self]; 

     NSString *path4 = [[NSBundle mainBundle] pathForResource:@"HSSound" ofType:@"mp3"]; 
     NSURL *file4 = [[NSURL alloc] initFileURLWithPath:path4]; 
     AVAudioPlayer *four = [[AVAudioPlayer alloc] initWithContentsOfURL:file4 error:nil]; 
     [file4 release]; 
     self.hs = four; 
     [four release]; 
     [hs prepareToPlay]; 
     [hs setDelegate:self]; 
    } 

답변

2

, 당신은 아마도 * 보조 스레드에서이를 만들고을 향상시킬 수를 감지 시간은입니다. 그런 다음 스트림과 디코더를 초기화하고 보조 스레드에서 디스크의 오디오 파일을 엽니 다.

재생, 스트림 수, 메모리 사용량, CPU,로드 시간, 디코딩, 필터링, 리샘플링 등이 여전히 중요한 요소 인 경우 : 가장 높은 수준의 API를 사용하고 있으며 몇 가지 수준을 내리고 모든 제어 권한을 가질 수 있습니다 당신은 이러한 측면의 모든 하나 이상을 원합니다.

리팩터링을 통해 더보기 좋게 만들 수 있습니다.이 방법은 비슷한 순서를 4 번 반복합니다. 난 단지 낮은 수준의 API를 사용하고 있기 때문에 AVAudioPlayer가 제약 실을 경우


* 은 '아마도', 나도 몰라. 추가 오류 검사와 리팩토링


예 :

하지 컴파일,하지만 당신은 아이디어를 얻을 :

- (AVAudioPlayer *)newAudioPlayerForFile:(NSString *)fileName extension:(NSString *)extension inBundle:(NSBundle *)bundle 
{ 
    assert(fileName && extension && bundle); 
    NSURL * url = [bundle URLForResource:fileName ofType:extension]; 
    if (nil == url) { 
    assert(0 && "could not locate resource"); 
    return nil; 
    } 

    NSError * error = 0; 
    AVAudioPlayer * spieler = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; 
    assert(spieler); 

    if (nil != error) { 
    NSLog(@"Error encountered creating audio player for file (%@): %@", fileName, error); 
    [spieler release], spieler = nil; 
    return nil; 
    } 

    [spieler prepareToPlay]; 
    [spieler setDelegate:self]; 

    return spieler; 
} 

- (void)readySounds 
{ 
    NSAutoreleasePool * pool = [NSAutoreleasePool new]; 
    NSBundle * mainBundle = [NSBundle mainBundle]; 
    self.tr1 = [[self newAudioPlayerForFile:@"TrackUno" extension:@"mp3" inBundle:mainBundle] autorelease]; 
    self.tr2 = [[self newAudioPlayerForFile:@"TrackDos" extension:@"mp3" inBundle:mainBundle] autorelease]; 
    self.clk = [[self newAudioPlayerForFile:@"Click" extension:@"mp3" inBundle:mainBundle] autorelease]; 
    self.hs = [[self newAudioPlayerForFile:@"HSSound" extension:@"mp3" inBundle:mainBundle] autorelease]; 
    [pool release], pool = nil; 
} 
+0

어떻게하면 리팩터링하여 더보기 좋게 만들 수 있습니까? –

+0

@MyApps 업데이트 – justin

+2

Ohhh nice, btw이 줄은 다음과 같습니다. NSURL * url = [bundle URLForResource : fileName withExtension : extension]; 또한 보조 스레드에서 이것이 가장 효율적 일 수 있습니까? 편집 : 축하해 12K에! –

1

나는 배경이 문제였다에서 솔루션이로드 발견을 ... 작동하고 나서 30 번 째 주 사운드의 사운드를 사용하면 모든 사운드가 작동하지 않습니다. 일어날 수있는 몇 가지가 있습니다 - 내 자신의 autorelease 풀을 만들어야 만했고 배경 스레드가 객체를 junking 할 수있었습니다.

그것에 대해 생각하면 짧은 사운드 효과 만 있습니다. 첫 번째 AVAudioPlayer를 만드는 속도는 느리지 만 그 다음 사운드는 좋았습니다. 그래서 그것을 해결하기 위해 나는 작은 자동 WAV 파일을 생성하고 그것을로드 할 첫 번째 파일로 사용했습니다. 나는 대담성을 사용하여 파일을 만들고 Tracks> Add New> 오디오 트랙을 만든 다음 .01s와 같은 작은 간격을 선택한 다음 Sound> Export'ed라는 소리를 내고 파일을 Xcode에 추가했습니다.

나는 작은 무성한 wav 파일을 viewDidLoad에서로드하도록 강제하고 그로 인해 지연이 단축됩니다.

호프는 이와 비슷한 문제가있는 사람에게 유용합니다.