iOS : Ejercicio 20. Reproduciendo video en nuestro iPhone

Blog >Lista ejercicios >  Ejercicio 20

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




Ejercicio 20 : Reproducción video en iPhone :
iOS soporta la mayoria de los codecs de video, el más común es .mp4 (sistema H263, H264)

En este ejercicio primero lo haremos insertando el vídeo en el proyecto, además del framework necesario: MediaPlayer por medio de una vista. 

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




Después añadimos el framework necesario para hacer el objeto MPMoviePlayer, 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 MediaPlayer.framework.




Ahora hacemos la instancia global MPMoviePlayerController, que va a ser donde se va a reproducir nuestro vídeo, lo hacemos en el archivo .h; añadimos video al proyecto, no olvidemos importar la librería. 

Clickamos en el botón derecho en la carpeta del proyecto y seleccionando Add Files to "nombreProyecto", seleccionamos el archivo y lo añadimos :

.H

//  ViewController.h
//  Reproductor_video
//  Copyright (c) 2014 ___FULLUSERNAME___. All rights reserved.
//
#import 
#import 
@interface ViewController : UIViewController
@property (nonatomic,strong) MPMoviePlayerController *Reproductor;
@end


Por último ponemos en el código .M ponemos el código necesario para reproducir el vídeo que anteriormente hemos importado al proyecto

.M

//  ViewController.m
//  Reproductor_video
//
//  Created by makone moreno on 12/09/14.
//  Copyright (c) 2014 ___FULLUSERNAME___. All rights reserved.
//
#import "ViewController.h"

@interface ViewController ()
@end

@implementation ViewController
@synthesize Reproductor;
- (void)viewDidLoad
{
    [super viewDidLoad];
    //INSTANCIAMOS EL VIDEO
    NSString *video= [[NSBundle mainBundle]pathForResource:@"shark" ofType:@"mp4"];
    //RUTA DEL VIDEO
    NSURL *direccion= [[NSURL alloc]initFileURLWithPath:video];
    //INICIALIZAMOS
    Reproductor=[[MPMoviePlayerController alloc] initWithContentURL:direccion];
    //CONFIGURAMOS LA PROPIEDAD VIEW DEL REPRODUCTOR PARA ASIGNARLE UN TAMAÑO
    Reproductor.view.frame=CGRectMake(30, 30, 200, 200);
    //Y AHORA SU VISTA LA AÑADIMOS A LA VISTA PRINCIPAL
    [self.view addSubview:Reproductor.view];
    [Reproductor play];
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}
@end


Ejecutamos el proyecto para probarlo.

También podemos usar MPMoviePlayerController para reproducir videos en streaming.

Los vídeos suelen ser ficheros grandes que pueden tardar en cargarse un tiempo determinado.Para todo aquel que no sepa que significa "in Streaming", se hace referencia al video que se graba en modo "online" es decir, en directo.

Subimos un video a dropbox, de la misma manera que se explica como subir una imagen aquí.
Si queremos saber cuando ha terminado la carga del vídeo podemos insertarlo a la notificación MPMoviePlayerContentPreloadDidFinishNotification así:

.M

//  ViewController.m
//  Reproductor_video
//
//  Created by makone moreno on 12/09/14.
//  Copyright (c) 2014 ___FULLUSERNAME___. All rights reserved.
//
#import "ViewController.h"

@interface ViewController ()
@end

@implementation ViewController
@synthesize Reproductor;
- (void)viewDidLoad
{
    [super viewDidLoad];
    NSURL *url = [NSURL URLWithString:@"https://dl.dropbox.com/s/kgxftmkehugywzm/shark.mp4?dl=0"];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(moviePlaybackDidFinish:)
                                                 name:MPMoviePlayerPlaybackDidFinishNotification
                                               object:Reproductor];
    //INICIALIZAMOS
    Reproductor=[[MPMoviePlayerController alloc] initWithContentURL:url];
    //CONFIGURAMOS LA PROPIEDAD VIEW DEL REPRODUCTOR PARA ASIGNARLE UN TAMAÑO
    Reproductor.view.frame=CGRectMake(30, 30, 200, 200);
    //Y AHORA SU VISTA LA AÑADIMOS A LA VISTA PRINCIPAL
    [self.view addSubview:Reproductor.view];
    [Reproductor play];

}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}
@end


Y bien este es el resultado, como podeis observar se crean los controles de forma automática sin necesidad de insertar código :






Compartir Compartir Compartir Compartir


Thebestandroide Indice Thebestandroide Ejercicio anterior Thebestandroide Siguiente ejercicio

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

iOS : Ejercicio 18. Haciendo transición entre vistas

Blog >Lista ejercicios >  Ejercicio 18


Hola developers, continuamos con el tutorial de ejercicios básicos de iOS, esta vez vamos a hacer una transición entre vistas mediante Core Animation.




Ejercico 18 : Transición entre vistas mediante Core Animation 

Creamos un proyecto de la forma habitual : create new Proyect - Single View Application.



Vamos a nuestro storyboard, y ahi insertamos una View y un label, a esa View la cambiamos el color : 



Repetimos el mismo proceso, solo que ahora en el label pondremos Vista 2 y un botón :



Ahora realizamos las conexiones pertinentes :



Bien es hora de llevar a cabo el cambio de vista mediante la programación, crearemos una variable booleana, que es la que nos va a decir que vista hay puesta, y después usaremos el método UIView transitionFromView para realizar el cambio. Bien, ahora ejecutamos el proyecto :



Y al pulsar el botón : 



Pero si volvemos a pulsar el botón : 



Vemos que se ha ocultado, por ahí dicen las malas lenguas que este error se produce porque las vistas no estan cuadradas una con la otra... así que a cuadrarlo hasta que funcione (tarde 40 minutos... es lo que tiene) 



Compartir Compartir Compartir Compartir


Thebestandroide Indice Thebestandroide Ejercicio anterior Thebestandroide Siguiente ejercicio

Cursos universitarios gratuitos

Hola amiguetes developers!!

He recibido la notificación de esta tanda de cursos universitarios de origen anglosajon y español que imparten varias universidades, son online y gratuitos, van desde Phyton a desarrollo de app´s android, e incluso OpenGL. Espero que le sirva a más de uno :

Cursos universitarios online gratuitos




http://nr.news-republic.com/Web/ArticleWeb.aspx?regionid=7&articleid=28582572&m=d





Compartir Compartir Compartir Compartir




iOS : Ejercicio 17. Cargar imagen en UIImageView desde internet

Blog >Lista ejercicios >  Ejercicio 17


Hola desarrolladores,vamos con el tutorial de ejercicios completando la parte de multihilos de iOS.




Ejercicio 17: Conectarse a la red y cargar una imagen desde internet

Creamos un proyecto de la forma habitual,create new proyect - single view application. Ahí crearemos en el storyboard 2 objetos con sus correspondientes conexiones : una ImageView y un Button :



Vamos a utilizar una variable de tipo NSData :

NSData es un objeto genérico para empaquetar buffers de datos, se usa para transmitir o guardar datos en estado puro.


Pero antes de eso, vamos a subir una imagen a un servidor para poder utilizarla, yo personalmente y entre otros uso dropbox, es gratuito, así que sino teneis no se que haceis con vuestra vida pero deberiais, se hace muy rapido, te registras y te bajas el cliente desde aquí. 




Ahora subimos esta imagen o la que elijamos (que friquis somos los informáticos) :




Y una vez la imágen ha sido subida a arriba botón derecho - copiar enlace publico. Bien por la política de dropbox para que sea público tenemos 2 opciones, o moverla a la carpeta que nos crea por defecto dropbox llamada "Public" o cambiamos las tres www por dl de tal manera que nos queda el enlace así :

https://dl.dropbox.com/s/oulaen0jeknx718/img.jpg?dl=0




Volvamos a XCode y en el .m donde la función de acción del botón, creamos el archivo NSData junto a otra variable NSUrl donde esta la url de nuestra imagen :


@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIImageView *Img;
- (IBAction)botonAccionImg:(id)sender;
@end
- (IBAction)botonAccionImg:(id)sender {
    //URL IMAGEN
    NSURL *url= [NSURL URLWithString:@"https://dl.dropbox.com/s/oulaen0jeknx718/image.jpg?dl=0"];
    //NSDATA CON URL
    NSData *dato=[NSData dataWithContentsOfURL:url];
    //LO CARGAMOS EN LA IMAGEN
    [self.Img setImage=[UIImage imageWithData:dato]];
}


Ejecutamos el proyecto y al pulsar el boton de "Cargar Imagen" se carga nuestra imagen perfectamente, sólo que hay una pega, desde que se pulsa el botón, hasta que se carga la imagen, no podemos hacer nada es decir, en este proyecto sólo hay un boton con el que interactuar, pero si hubiera más elementos con los que interactuar, no podríamos tocarlos.

(Podeis probar insertando un tab-bar y pulsando sobre las opciones, ya vereis que no os deja)


Para que esto no ocurra, ya que de cara al usuario no queda bien que mientras se ande cargando algo se quede el teléfono como colgado,ya que tecnicamente no es así, pero da esa impresión, hay que meter este proceso en un hilo, y eso lo hacemos de la siguiente manera :


 @implementation ViewController

- (void)viewDidLoad

{
    [super viewDidLoad];
}

- (IBAction)botonAccionImg:(id)sender {
    //GESTOR DE HILOS (COLA)
    NSOperationQueue *cola=[NSOperationQueue new];
    //OPERACION A LANZAR
    //initwITHtARGET:self (sobre esta clase)
    //selector:metodo a ejecutar en el hilo que estamos creando
    //object: objeto a mandar a ese metodo
    NSInvocationOperation *operacion = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(cargarImagen) object:nil];
    //añadimos la operacion a la cola
    [cola addOperation:operacion];
}

-(void) cargarImagen{
    //URL IMAGEN
    NSURL *url= [NSURL URLWithString:@"https://dl.dropbox.com/s/oulaen0jeknx718/image.jpg?dl=0"];
    //NSDATA CON URL
    NSData *dato=[NSData dataWithContentsOfURL:url];
    //LO CARGAMOS EN UN OBJETO IMAGE
    UIImage *Img = [UIImage imageWithData:dato];
    //Volvemos al hilo principal
    [self.Img performSelectorOnMainThread:@selector(setImage:) withObject:Img waitUntilDone:YES];
}
@end 










Compartir Compartir Compartir Compartir




Thebestandroide Indice Thebestandroide Ejercicio anterior Thebestandroide Siguiente ejercicio