Reproducir un sonido corto en iOS

Creo que podría usar AVAudioPlayer para reproducir un sonido, sin embargo, lo que necesito es reproducir un sonido corto y no necesito ningún bucle ni un control preciso del volumen, etc.

¿Hay una forma fácil de hacer esto?

Cada una de las otras respuestas pierde memoria (a menos que ARC esté habilitado para una de las respuestas) … curiosamente, la respuesta originalmente marcada como correcta tiene una llamada a retainCount sin motivo aparente.

Si alloc/init algo, necesita ser liberado (a menos que esté usando ARC).

Si llama a AudioServicesCreateSystemSoundID() , debe deshacerse del sonido resultante.

Vea el ejemplo de Audio UI Sounds .

Básicamente:

 @interface MyClass:UI*ViewController // fixed { SystemSoundID mySound; } @implementation MyClass - (void) viewDidLoad { [super viewDidLoad]; AudioServicesCreateSystemSoundID(.... URL ...., &mySound); } - (void) playMySoundLikeRightNowReally { AudioServicesPlaySystemSound(mySound); } - (void) dealloc { AudioServicesDisposeSystemSoundID(mySound); [super dealloc]; // only in manual retain/release, delete for ARC } @end 

Por completitud:
agregar AudioToolbox.framework
#import

Para clips de sonido cortos (menos de 30 segundos), hay una biblioteca de SystemSounds que es realmente agradable.

Pros: no necesita administrar la configuración de volumen por separado. El sonido se reproduce en una secuencia separada y la carga y reproducción del clip de audio es v rápida. En resumen, trata este clip como otro sonido del sistema.

Contras: no puede proporcionar una configuración de control de audio por separado. Está relacionado con la configuración de los sonidos del sistema. No puedes jugar más de 30 segundos. Probablemente no pueda aplicar ningún filtro de sonido para mejorar el efecto de audio.

Ciertamente hay más pros y contras, pero estos son algunos de los que podría pensar, fuera de mi cabeza.

use esta importación: Agregue AudioToolbox Framework y luego llame al método siguiente como [self PlaySound], donde quiera que quiera reproducir el clip.

 -(void) playSound { NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"changeTrack" ofType:@"aif"]; SystemSoundID soundID; AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath: soundPath], &soundID); AudioServicesPlaySystemSound (soundID); [soundPath release]; } 

Rápido

Las otras respuestas aquí usan Objective-C, así que estoy proporcionando una versión de Swift aquí. Swift utiliza el conteo automático de referencias (ARC), por lo que no estoy al tanto de ningún problema de pérdida de memoria con esta respuesta (como se advirtió en la respuesta aceptada).

Usando AudioToolbox

Puede utilizar el marco AudioToolbox para reproducir sonidos cortos cuando no necesita mucho control sobre cómo se reproducen.

Así es como lo configuraría:

 import UIKit import AudioToolbox class PlaySoundViewController: UIViewController { var soundURL: NSURL? var soundID: SystemSoundID = 0 @IBAction func playSoundButtonTapped(sender: AnyObject) { let filePath = NSBundle.mainBundle().pathForResource("yourAudioFileName", ofType: "mp3") soundURL = NSURL(fileURLWithPath: filePath!) if let url = soundURL { AudioServicesCreateSystemSoundID(url, &soundID) AudioServicesPlaySystemSound(soundID) } } } 

Notas:

  • Este ejemplo está adaptado de Cómo reproducir un clip de sonido corto con AudioToolbox en Swift .
  • Recuerde agregar yourAudioFileName.mp3 (o .wav , etc.) a su proyecto.
  • Recuerde import AudioToolbox
  • Esta respuesta pone el código en un botón IBAction, pero podría ser fácilmente puesto en otra función, por supuesto.

Usando AVAudioPlayer

Al importar el marco AVFoundation , puede usar AVAudioPlayer . Funciona tanto para clips de audio cortos como para canciones largas. También tiene más control sobre la reproducción que con el método de AudioToolbox.

Así es como lo configuraría:

 import UIKit import AVFoundation class PlaySoundViewController: UIViewController { var mySound: AVAudioPlayer? // a button that plays a sound @IBAction func playSoundButtonTapped(sender: AnyObject) { mySound?.play() // ignored if nil } override func viewDidLoad() { super.viewDidLoad() // initialize the sound if let sound = self.setupAudioPlayerWithFile("yourAudioFileName", type: "mp3") { self.mySound = sound } } func setupAudioPlayerWithFile(file: NSString, type: NSString) -> AVAudioPlayer? { let path = NSBundle.mainBundle().pathForResource(file as String, ofType: type as String) let url = NSURL.fileURLWithPath(path!) var audioPlayer: AVAudioPlayer? do { try audioPlayer = AVAudioPlayer(contentsOfURL: url) } catch { print("Player not available") } return audioPlayer } } 

Notas:

  • Este ejemplo está adaptado de las aplicaciones de Learn to Code para iOS con Swift Tutorial 5: Making it Beautiful (Adding Sound)
  • Recuerde import AVFoundtation y agregar yourAudioFileName.mp3 a su proyecto.

Recientemente, utilicé este código para reproducir audio mp3 corto que funcionó bien: –

Declara esto debajo de @implementation

 NSString *path; NSURL *url; //where you are about to add sound path =[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"quotes_%d",soundTags] ofType:@"mp3"]; url = [NSURL fileURLWithPath:path]; player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:NULL]; [player setVolume:1.0]; [player play]; //just add AVFoundation framework 

Usé este código para reproducir un breve sonido aiff en iOS

 #import  SystemSoundID completeSound; NSURL *audioPath = [[NSBundle mainBundle] URLForResource:@"downloadCompleted" withExtension:@"aiff"]; AudioServicesCreateSystemSoundID((CFURLRef)audioPath, &completeSound); AudioServicesPlaySystemSound (completeSound); 

Espero que esto ayude.

VERSIÓN SIMPLE CLEAN SWIFT 3

Me gusta más control sobre mis sonidos, así que estoy usando AVFoundation.

 import AVFoundation class TodayViewController: UIViewController { var clink: AVAudioPlayer? var shatter: AVAudioPlayer? override func viewDidLoad() { super.viewDidLoad() // initialize the sound shatter = setupAudioPlayer(withFile: "shatter", type: "wav") clink = setupAudioPlayer(withFile: "clink", type: "wav") } func setupAudioPlayer(withFile file: String, type: String) -> AVAudioPlayer? { let path = Bundle.main.path(forResource: file, ofType: type) let url = NSURL.fileURL(withPath: path!) return try? AVAudioPlayer(contentsOf: url) } func onClick() { clink?.play() } } 

Asegúrese de que el archivo de sonido se haya agregado a su proyecto e importe AVFoundation.

Mi respuesta es la respuesta de Bill, pero la uso sin init o dealloc y lanzo el sonido después de su reproducción:

 - (void)playSound:(NSURL *)url SystemSoundID ssID = 0; AudioServicesCreateSystemSoundID((CFURLRef)url, &ssID); AudioServicesAddSystemSoundCompletion(ssID, NULL, NULL, (AudioServicesSystemSoundCompletionProc)MyAudioServicesSystemSoundCompletionProc, NULL); AudioServicesPlaySystemSound(ssID); //AudioServicesDisposeSystemSoundID(ssID); } void MyAudioServicesSystemSoundCompletionProc (SystemSoundID ssID, void *clientData) { AudioServicesDisposeSystemSoundID(ssID); } 

Aquí hay un método de limpieza rápida que puedes copiar y usar en tu aplicación:

 -(BOOL) playSoundFXnamed: (NSString*) vSFXName Loop: (BOOL) vLoop { NSError *error; NSBundle* bundle = [NSBundle mainBundle]; NSString* bundleDirectory = (NSString*)[bundle bundlePath]; NSURL *url = [NSURL fileURLWithPath:[bundleDirectory stringByAppendingPathComponent:vSFXName]]; AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; if(vLoop) audioPlayer.numberOfLoops = -1; else audioPlayer.numberOfLoops = 0; BOOL success = YES; if (audioPlayer == nil) { success = NO; } else { success = [audioPlayer play]; } return success; } 

Entonces para usar solo:

 [self playSoundFXnamed:@"someAudio.mp3" Loop: NO]; 

Si vas a realizar bucles, entonces debes sacar tu AVAudioPlayer *audioPlayer a tu clase para poder detener el sonido … Lo cual no ocurre si solo quieres un sonido corto.

Use ARC … y nunca hice nada con NSError, así que úselo si le gusta …

Muchas respuestas son confusas y algunas utilizan el marco de AVAudioFoundation , diferente del marco de AVAudioFoundation … esto es lo que hice. En el archivo .h , puse este código en:

@property (nonatomic, retain) AVAudioPlayer *player;

Este código declara un reproductor de audio llamado “jugador”. En el archivo .m , debajo de su statement @implementation , agregue @synthesize player . Esto sintetiza la propiedad del player .

En cualquier función que desee, vincule su sonido al reproductor agregando esta línea de código, donde yourSound es el nombre del archivo de sonido y aif es su extensión de archivo:

player = [[AVAudioPlayer alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"yourSound" withExtension:@"aif"] error:nil]

Sé que la Documentación de Apple dice que declare una cadena y un NSURL, pero si los combina en una sola línea, no tendrá que deshacerse de ella después. Además, como esta es una propiedad en su archivo ViewController.m , entonces no tendrá que seguir configurando ese objeto de player para que se vincule con su sonido.

Otras respuestas también incluyeron el uso de SystemSoundID , pero eso también impone restricciones como, “el archivo no puede durar más de 30 segundos”, “tiene que estar en un formato específico” y las obras. Con eso, puede reproducir varios sonidos a la vez (en caso de que esté desarrollando una caja de resonancia), y es más fácil crear los sonidos.

Para reproducir tu sonido, inserta esta línea (y sí, es realmente así de fácil):

[player play]

Si usa ARC, no puede deshacerse del reproductor manualmente, ya que el sistema lo hará por usted. Si es nuevo en el desarrollo y está utilizando la última versión de Xcode, entonces tiene ARC habilitado. Si, por alguna extraña razón, no lo hace, entonces el código para deshacerse de los recursos que utiliza el player es:

[player release]

Usando Swift 4

 import AudioToolbox func playSoundEasy(note : String) { var soundURL: NSURL? var soundID: SystemSoundID = 0 let filePath = Bundle.main.path(forResource: note, ofType: "wav") soundURL = NSURL(fileURLWithPath: filePath!) if let url = soundURL { AudioServicesCreateSystemSoundID(url, &soundID) AudioServicesPlaySystemSound(soundID) } 

}

Desde Sound solo funciona en el dispositivo pero no en el simulador

Nick creó una biblioteca que puede usarse para reproducir sonidos en iOS y Mac Apps.

Ver nicklockwood / SoundManager

Por favor, consulte la reproducción de audio de iOS simple

 - (void)playSound { SystemSoundID soundId; // NSURL *soundURL = [[NSBundle mainBundle] URLForResource:@"sample" // withExtension:@"caf"]; // AudioServicesCreateSystemSoundID((__bridge CFURLRef)soundURL, &soundId); NSString *path = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"mp3"]; AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:path], &soundId); AudioServicesAddSystemSoundCompletion(soundId, NULL, NULL, systemAudioCallback, NULL); AudioServicesPlaySystemSound(soundId); //AudioServicesPlayAlertSound(soundId); } - (void) systemAudioCallback(SystemSoundID soundId, void *clientData) { AudioServicesRemoveSystemSoundCompletion(soundId); AudioServicesDisposeSystemSoundID(soundId); } 

Echa un vistazo a systemsound para reproducir un archivo de audio corto

incluir el marco audiotoolbox

y crear

objeto systemsoundid

 NSString *soundPath = [[NSBundle mainBundle] pathForResource:file ofType:@"aiff"]; AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath: soundPath], &soundID); AudioServicesPlaySystemSound (soundID);