2010-11-27 17 views
6

Busqué aquí y probé todas las diferentes soluciones que se dieron, pero nada funcionó. Así que déjame preguntar:Aplicación para iPhone - Los archivos de sonido WAV no se reproducen

Estoy tratando de reproducir un sonido en una aplicación de iPhone cuando se presiona un botón. Me importado el marco de audio, conectado al botón con el método, tener el archivo de sonido WAV en el paquete, y utilizar el siguiente código para reproducir el sonido:

NSString *path = [NSString stringWithFormat:@"%@%@", [[NSBundle mainBundle] resourcePath], @"/filename.wav"]; 
SystemSoundID soundID; 
NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO]; 
AudioServicesCreateSystemSoundID((CFURLRef)filePath, &soundID); 
AudioServicesPlaySystemSound(soundID); 

Pero no reproduce sonido cuando pulso un botón. (Sí, mi sonido está activado)

¿Alguna idea de por qué esto podría ser y cómo puedo solucionarlo? Estaré encantado de proporcionar más información si ayuda.

Respuesta

17

En primer lugar, el formato de sonido preferido para iPhone es CAF con formato LE o mp3 para música. Puede convertir un WAV a CAF con el construido en la utilidad de terminal:

afconvert -f caff -d LEI16 crash.wav crash.caf 

A continuación, el más fácil de distancia para reproducir un sonido es utilizar el AVAudioPlayer ... esta función rápida puede ayudar a que cargue un recurso de sonido:

- (AVAudioPlayer *) soundNamed:(NSString *)name { 
    NSString * path; 
    AVAudioPlayer * snd; 
    NSError * err; 

    path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:name]; 

    if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { 
     NSURL * url = [NSURL fileURLWithPath:path]; 
     snd = [[[AVAudioPlayer alloc] initWithContentsOfURL:url 
                 error:&err] autorelease]; 
     if (! snd) { 
      NSLog(@"Sound named '%@' had error %@", name, [err localizedDescription]); 
     } else { 
      [snd prepareToPlay]; 
     } 
    } else { 
     NSLog(@"Sound file '%@' doesn't exist at '%@'", name, path); 
    } 

    return snd; 
} 
0

no sé si se ha resuelto el problema, pero para mí, en iOS 7, a veces el (__bridge CFURLRef) de fundición no va a funcionar, en cuyo caso, si imprime el resultado de (__bridge CFURLRef)[NSURL fileURLWithPath:path], será 0x0. Esto lleva a la falla de AudioServicesCreateSystemSoundID(). El valor de retorno de la función es del tipo OSStatus. Si falla, la función devolverá -50, lo que significa que uno o más parámetros no son válidos. (Si se ejecuta correctamente, devuelve 0.)

He resuelto mediante el uso de la función de estilo C obtener la ruta del archivo:

CFBundleRef mainBundle = CFBundleGetMainBundle(); 
    CFURLRef soundFileUrl; 

    soundFileUrl = CFBundleCopyResourceURL(mainBundle, CFSTR("fileName"), CFSTR("wav"), NULL); 
    AudioServicesCreateSystemSoundID(soundFileUrl, &soundID); 
Cuestiones relacionadas