iOS : Ejercicio 19. Reproducción .mp3 en XCode

Hola developers, continuamos con los ejercicios básicos en iOS con el numero 19.

Blog >Lista ejercicios >  Ejercicio 19




Ejercicio 19 : Reproducción audio en nuestro iPhone

Para reproducir sonidos el software de iOS nos proporciona el framework AVFoundation. Este software puede reproducir casi la mayoría de los formatos de audio, y aunque el principal es el .mp3, también puede reproducir .caf, .aiff o .wav . 

Clases del framework AVFoundation :

  • AVAudioMix : Clase que maneja los parámetros de entrada para mezclar distintas pistas de audio.
  • AVMutableAudioMix : Clase que gestiona los parámetros de entrada para mezclar el audio.
  • AVAsset : Clase abstracta que representa medios como videos o audios cronometrados.
  • AVCaptureDevice : Clase que representa un dispositivo físico de captura junto a sus propiedades asociadas.
  • AVPlayer : Clase para implementar controladores o interfaces para reproducir uno o varios sonidos.
  • AVPlayerLayer : Subclase de CALayer a la cual un objeto AVPlayer puede dirigir su salida visual.

Creamos un proyecto de la forma habitual: create new proyect - single view application 



Agregamos el framework necesario para hacer el objeto AVFoundation, así que sobre el proyecto hacemos click y en Build Phases, en la opción Link Binary With Libraries pulsando el + añadimos la libreria framework AVFoundation e importamos la libreria, seguidamente arrastramos .mp3 al proyecto.



Vamos a nuestro storyboard y agregamos 2 botones y 2 labels con sus conexiones pertinentes



Ahora tenemos que hacer una variable global de AVAudioPlayer para poder reproducir el sonido, añadimos una cancion al proyecto pulsando botón derecho sobre la carpeta del proyecto y pulsando sobre "Add files to "nombreproyecto"
 
Y este es el código para reproducir el sonido :

.h

#import 
#import 
@interface ViewController : UIViewController 
@property (nonatomic,strong) AVAudioPlayer *reproductor;
@property (weak, nonatomic) IBOutlet UILabel *nombre;
@property (weak, nonatomic) IBOutlet UILabel *duracion;
- (IBAction)play:(id)sender;
- (IBAction)Stop:(id)sender;
@end


.m

#import "ViewController.h"
@interface ViewController ()

@end

@implementation ViewController
@synthesize reproductor;
@synthesize duracion;
- (void)viewDidLoad
{
    [super viewDidLoad];
    NSError *error;
    //INSTANCIA DE LA CANCION
    NSString *ruta = [[NSBundle mainBundle] pathForResource:@"Enloquecer" ofType:@"mp3"];
    //NSLog(@"LA RUTA ES %@",ruta);
    //LO CONVERTIMOS EN URL
    NSURL *direccion = [[NSURL alloc] initFileURLWithPath:ruta];
    //Lo asociamos al reproductor
    self.reproductor = [[AVAudioPlayer alloc]initWithContentsOfURL:direccion error:&error];    
    //ES para darle balance
    //0 - Igual altavoz izquierdo que altavoz derecho
    //-1 - Solo izquierdo
    //1 - solo derecho
    self.reproductor.pan=0;
    self.reproductor.numberOfLoops=1; //NUMERO DE REPETICIONES : VALOR NEGATIVO INFINITAS VECES
    self.reproductor.volume=1;        //MANEJA VOLUMEN rango 0 - 1
    [self.reproductor prepareToPlay]; //Preparamos la reproducción
}
- (IBAction)play:(id)sender {
    [self.reproductor play];
}
- (IBAction)Stop:(id)sender {
    [self.reproductor stop];
}
@end


Bien, vamos a mostrar ahora el tiempo que queda para que acabe la canción, haremos un timer, lo que pasa que nos dará el resultado en segundos y milisegundos, además que queremos hacerlo regresivo, es decir desde el final a 0. Esto lo conseguimos restando el tiempo transcurrido al tiempo total de la canción, y aplicandole el formato correcto para que aparezcan minutos y segundos, ¿Como se hace? Así...

.m
#import "ViewController.h"

@interface ViewController ()
@end

@implementation ViewController
@synthesize reproductor;
@synthesize duracion;
NSTimer *timer ;
- (void)viewDidLoad
{
    [super viewDidLoad];
    NSError *error;
    //INSTANCIA DE LA CANCION
    NSString *ruta = [[NSBundle mainBundle] pathForResource:@"Enloquecer" ofType:@"mp3"];
    //NSLog(@"LA RUTA ES %@",ruta);
    //LO CONVERTIMOS EN URL
    NSURL *direccion = [[NSURL alloc] initFileURLWithPath:ruta];
    //Lo asociamos al reproductor
    self.reproductor = [[AVAudioPlayer alloc]initWithContentsOfURL:direccion error:&error];
    //ES para darle balance
    //0 - Igual altavoz izquierdo que altavoz derecho
    //-1 - Solo izquierdo
    //1 - solo derecho
    self.reproductor.pan=0;
    self.reproductor.numberOfLoops=1; //NUMERO DE REPETICIONES : VALOR NEGATIVO INFINITAS VECES
    self.reproductor.volume=1;        //MANEJA VOLUMEN rango 0 - 1
    [self.reproductor prepareToPlay]; //Preparamos la reproducción
    //CREAMOS TIMER PARA MOSTRAR EL TIEMPO TRANSCURRIDO
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0
                              target:self
                              selector:@selector(updateTime)
                              userInfo:nil
                              repeats:YES];
    //Texto label action
    self.nombre.text = [NSString stringWithFormat:@"Cargando..."];
}
//FUNCION TIMER
-(void)updateTime{
    //DURACION CANCION - DURACION TIEMPO TRANSCURRIDO
    NSTimeInterval timeLeft = self.reproductor.duration - self.reproductor.currentTime;
    //FORMATO MINUTOS
    div_t m = div(timeLeft, 60);
    int minutos =m.quot;
    //FORMATO SEGUNDOS
    int seconds =m.rem;
    //ACTUALIZAR TIEMPO CONSTANTEMENTE
    self.duracion.text=[NSString stringWithFormat:@"%d.%d",minutos,seconds];
}
- (IBAction)play:(id)sender {
    [self.reproductor play];
    self.nombre.text = [NSString stringWithFormat:@"Reproduciendo"];
}
- (IBAction)Stop:(id)sender {
    [self.reproductor pause];
    self.nombre.text = [NSString stringWithFormat:@"Pausado"];
}
@end


Y este es el resultado...







Compartir Compartir Compartir Compartir



Thebestandroide Indice Thebestandroide Ejercicio anterior Thebestandroide Siguiente ejercicio

0 comentarios:

Publicar un comentario