buscar - Reproducir un sonido corto en iOS
find my iphone (13)
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 agregaryourAudioFileName.mp3
a su proyecto.
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?
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)
}
}
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 ...
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 <AudioToolbox/AudioToolbox.h>
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.
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);
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);
}
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 declaración @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]
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: <AudioToolbox/AudioToolbox.h>
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];
}
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);
}
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 <AudioToolbox/AudioServices.h>
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.