2010-01-21 3 views
2

Я пишу приложение для iPhone, которое, когда происходит определенная вещь, воспроизводится звук. Я пытаюсь использовать различные файлы WAV, MP3, M4A и периодически сталкиваться с проблемами. Нижеприведенный код отлично работает в симуляторе, но MP3 не воспроизводится на iPhone. (3GS, если это имеет значение). Есть идеи? Я изменил mp3-файл на wav, и он будет работать для одного, указанного ниже (knock_knock), но не другого. Возможно, способ кодирования?iPhone не воспроизводит mp3-звук, используя тип = @ "mp3"

Любая помощь приветствуется. Благодаря

Вот код:

SystemSoundID soundID; 
NSString *soundFile; 

if (something == somethingelse) { 
    soundFile = [[NSBundle mainBundle] pathForResource:@"knock_knock" ofType:@"wav"]; 
} 
else { 
    soundFile = [[NSBundle mainBundle] pathForResource:@"strike" ofType:@"mp3"]; 
} 
    AudioServicesCreateSystemSoundID((CFURLRef) 
           [NSURL fileURLWithPath:soundFile] 
           , &soundID); 
AudioServicesPlaySystemSound(soundID); 

ответ

2

Системные звуки должны быть распакованы. Я столкнулся с этим и изменил свой код на использование AVAudioSession и AVAudioPlayer. Из верхней части головы что-то вроде этого (требуется лучшая проверка ошибок)

-(void)load { 
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: [self path]]; 
    if (fileURL) { 

     AVAudioPlayer *newPlayer = 
     [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL 
               error: nil]; 
     [fileURL release]; 
     [self stop]; 
     self.player = newPlayer; 
     [newPlayer release]; 

     [self.player prepareToPlay]; 
    } 
} 

    -(void)play { 

    if (self.player == nil) 
     [self load]; 

    AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
    NSError *err = nil; 
    [audioSession setCategory: AVAudioSessionCategoryAmbient error:&err]; 
    if(err){ 
     NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]); 
     return; 
    } 
    [audioSession setActive:YES error:&err]; 

    self.player.currentTime = 0; 
    [self.player play]; 
} 
+0

Это именно то, что мне нужно ... спасибо огромное! – George