Posted By

Nekak on 02/01/12


Tagged


Versions (?)

Reproductor de audio iOS


 / Published in: Objective C
 

URL: http://nekakkinich.tumblr.com/post/16829509474/reproductor-personalizado-de-audio-ios

Reproductor de audio creado para iOS que puede ser personalizado.

  1. //Reproductor.h
  2. // Created by J. Ramses Rodríguez G. on 31/01/12.
  3.  
  4. #import <UIKit/UIKit.h>
  5. #import <AVFoundation/AVFoundation.h>
  6.  
  7. @interface Reproductor : UIView<AVAudioPlayerDelegate>{
  8. AVAudioPlayer* _reproductor;
  9. UISlider* _volumen;
  10. UISlider* _avance;
  11. NSTimer* _tiempo;
  12. UILabel* _positivo;
  13. UILabel* _negativo;
  14. }
  15.  
  16. @property (nonatomic,retain) AVAudioPlayer* reproductor;
  17. @property (nonatomic,retain) UISlider* volumen;
  18. @property (nonatomic,retain) UISlider* avance;
  19. @property (nonatomic,retain) NSTimer* tiempo;
  20. @property (nonatomic,retain) UILabel* positivo;
  21. @property (nonatomic,retain) UILabel* negativo;
  22.  
  23. -(void)inicializarReproductorConAudio:(NSString*)nombre;
  24. -(void)reproducir;
  25. -(void)detener;
  26. -(void)ajustarVolumen;
  27. -(void)ajustarReproduccion;
  28. -(void)ajustarTiempo;
  29. -(float)redondear:(float)cifra;
  30.  
  31. @end
  32.  
  33. //Reproductor.m
  34. // Created by J. Ramses Rodríguez G. on 31/01/12.
  35.  
  36. #import "Reproductor.h"
  37.  
  38. @implementation Reproductor
  39.  
  40. @synthesize reproductor=_reproductor;
  41. @synthesize volumen=_volumen;
  42. @synthesize avance=_avance;
  43. @synthesize tiempo=_tiempo;
  44. @synthesize positivo=_positivo;
  45. @synthesize negativo=_negativo;
  46.  
  47. -(id)initWithFrame:(CGRect)frame{
  48. if (self=[super initWithFrame:frame]){
  49. //Label de fondo para localizar el espacio del reproductor
  50. UILabel* fondo=[[UILabel alloc] initWithFrame:CGRectMake(0, 546, 1024, 202)];
  51. fondo.backgroundColor=[UIColor grayColor];
  52. fondo.userInteractionEnabled=YES;
  53.  
  54. //Botón para reproducir el audio
  55. UIButton* botonRep=[[UIButton alloc] initWithFrame:CGRectMake(160, 45, 20, 17)];
  56. [botonRep setTitle:@"R" forState:UIControlStateNormal];
  57. botonRep.backgroundColor=[UIColor redColor];
  58.  
  59. //Botón para pausar la reproducción del audio
  60. UIButton* botonDet=[[UIButton alloc] initWithFrame:CGRectMake(120, 45, 17, 17)];
  61. [botonDet setTitle:@"D" forState:UIControlStateNormal];
  62. botonDet.backgroundColor=[UIColor blueColor];
  63.  
  64. //Métodos que se activarán cuando ocurra el evento de toque sobre alguno de los botones
  65. [botonRep addTarget:self action:@selector(reproducir) forControlEvents:UIControlEventTouchUpInside];
  66. [botonDet addTarget:self action:@selector(detener) forControlEvents:UIControlEventTouchUpInside];
  67.  
  68. //UILabel que muestra que tanto tiempo se lleva de reproducción
  69. _positivo=[[UILabel alloc] initWithFrame:CGRectMake(195, 45, 50, 20)];
  70. _positivo.textColor=[UIColor whiteColor];
  71. _positivo.backgroundColor=[UIColor clearColor];
  72.  
  73. //UILabel que muestra el tiempo restante en la reproducción
  74. _negativo=[[UILabel alloc] initWithFrame:CGRectMake(830, 45, 50, 20)];
  75. _negativo.textColor=[UIColor whiteColor];
  76. _negativo.backgroundColor=[UIColor clearColor];
  77.  
  78. //Control del volumen
  79. _volumen=[[UISlider alloc] initWithFrame:CGRectMake(850, 100, 100, 40)];
  80. //Solo se podrá tener el doble del volumen
  81. _volumen.maximumValue=2;
  82. //Valor en 0 es igual a mudo
  83. _volumen.minimumValue=0;
  84. //Volumen real del audio
  85. _volumen.value=1;
  86. //Cada que cambie el valor del slider se ajustará el volumen
  87. [_volumen addTarget:self action:@selector(ajustarVolumen) forControlEvents:UIControlEventValueChanged];
  88. _volumen.minimumTrackTintColor=[UIColor blackColor];
  89. _volumen.maximumTrackTintColor=[UIColor colorWithRed:1 green:1 blue:1 alpha:.5];
  90.  
  91. //Control del tiempo de reproducción
  92. _avance=[[UISlider alloc] initWithFrame:CGRectMake(230, 35, 600, 40)];
  93. //Cada que cambie el valor del slider se ajustará el tiempo de reproducción
  94. [_avance addTarget:self action:@selector(ajustarReproduccion) forControlEvents:UIControlEventValueChanged];
  95. _avance.minimumTrackTintColor=[UIColor blackColor];
  96. _avance.maximumTrackTintColor=[UIColor colorWithRed:1 green:1 blue:1 alpha:.5];
  97.  
  98. [fondo addSubview:botonRep];
  99. [fondo addSubview:botonDet];
  100. [fondo addSubview:_volumen];
  101. [fondo addSubview:_avance];
  102. [fondo addSubview:_positivo];
  103. [fondo addSubview:_negativo];
  104.  
  105. [self addSubview:fondo];
  106.  
  107. [fondo release];
  108. [botonRep release];
  109. [botonDet release];
  110. }
  111. return self;
  112. }
  113.  
  114. /*
  115. // Only override drawRect: if you perform custom drawing.
  116. // An empty implementation adversely affects performance during animation.
  117. - (void)drawRect:(CGRect)rect
  118. {
  119.   // Drawing code
  120. }
  121. */
  122.  
  123. //Se establece el nombre del archivo a reproducir y se crea el reproductor
  124. -(void)inicializarReproductorConAudio:(NSString *)nombre{
  125. NSError* error;
  126. //Buscamos el archivo con extensión .mp3
  127. //NOTA: para otro tipo de archivo solo hay que cambiar la extensión
  128. NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@",nombre] ofType:@"mp3"]];
  129.  
  130. //Creamos el reproductor
  131. _reproductor=[[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
  132.  
  133. //Checamos si hubo algún error al crear el reproductor, en caso de que no sea así
  134. //preparamos el reproductor.
  135. if(error){
  136. NSLog(@"Ocurrió un error: %@",[error localizedDescription]);
  137. }else{
  138. _reproductor.delegate=self;
  139. [_reproductor prepareToPlay];
  140. }
  141. }
  142.  
  143. //Comienza la reproducción del audio
  144. -(void)reproducir{
  145. //Checamos que exista el reproductor
  146. if(_reproductor!=nil){
  147. //Creamos un reloj para actualizar el tiempo en el que se está reproduciendo el audio
  148. if (_tiempo==nil) {
  149. _tiempo=[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(ajustarTiempo) userInfo:nil repeats:YES];
  150. }
  151. _avance.maximumValue=_reproductor.duration;
  152. _avance.minimumValue=0;
  153. [_reproductor play];
  154. }
  155. }
  156.  
  157. //Se pausa la reproducción
  158. -(void)detener{
  159. if(_reproductor!=nil){
  160. [_reproductor stop];
  161. }
  162. }
  163.  
  164. //Establecemos el volumen de la reproducción
  165. -(void)ajustarVolumen{
  166. if(_reproductor!=nil){
  167. _reproductor.volume=_volumen.value;
  168. }
  169. }
  170.  
  171. //Establecemos el tiempo de la reproducción
  172. -(void)ajustarReproduccion{
  173. if(_reproductor!=nil){
  174. _reproductor.currentTime=_avance.value;
  175. }
  176. }
  177.  
  178. //Cambiamos el tiempo mostrado en los labels y el slider.
  179. -(void)ajustarTiempo{
  180. //Obtenemos la duración total del audio
  181. float duracion=_reproductor.duration;
  182. //Obtenemos el tiempo de reproducción actual
  183. float actual=_reproductor.currentTime;
  184.  
  185. //Calculamos los minutos que lleva la reproducción
  186. float minutos=floor(actual/60);
  187. //Calculamos los segundos que lleva la reproducción actual
  188. float segundos=actual-(minutos*60);
  189.  
  190. //Establecemos el valor del slider del tiempo de reproducción
  191. _avance.value=actual;
  192.  
  193. //Mostramos el tiempo transcurrido
  194. _positivo.text=[NSString stringWithFormat:@"%0.0f:%0.0f",minutos,segundos];
  195.  
  196. //Calculamos los minutos restantes
  197. float restaMinutos=floor((duracion-actual)/60);
  198. //Calculamos los segundos restantes
  199. float restaSegundos=duracion-actual;
  200. restaSegundos=[self redondear:restaSegundos];
  201.  
  202. //Mostramos el tiempo restante
  203. _negativo.text=[NSString stringWithFormat:@"- %0.0f:%0.0f",restaMinutos,restaSegundos];
  204.  
  205. //Checamos si terminó la reproducción, de ser así, regresamos al principio el tiempo de reproducción
  206. if (actual==duracion) {
  207. [_tiempo invalidate];
  208. _tiempo=nil;
  209. _avance.value=0;
  210. }
  211. }
  212.  
  213. //Función que hace magia XD
  214. -(float)redondear:(float)cifra{
  215. float aux;
  216. if (cifra>60.0) {
  217. aux=fmodf(cifra, 60);
  218. }else{
  219. aux=cifra;
  220. }
  221. if (aux==60.0) {
  222. aux=0;
  223. }
  224. return aux;
  225. }
  226.  
  227. -(void)dealloc{
  228. [_reproductor release];
  229. [_volumen release];
  230. [_avance release];
  231. [_tiempo invalidate];
  232. _tiempo=nil;
  233. [_positivo release];
  234. [_negativo release];
  235. [super dealloc];
  236. }
  237.  
  238. #pragma mark - AVAudioPlayerDelegate
  239. //Necesaria en caso de que se interrumpa por algún otro evento como una llamada o algo así
  240. -(void)audioPlayerBeginInterruption:(AVAudioPlayer *)player{
  241. [player stop];
  242. }
  243.  
  244. @end
  245.  
  246. //ReproductorViewController.m
  247. // Created by J. Ramses Rodríguez G. on 31/01/12.
  248. Reproductor* audio=[[Reproductor alloc] initWithFrame:CGRectMake(0, 0, 1024, 748)];
  249. [audio inicializarReproductorConAudio:@"Nombre archivo"];
  250. [self.view addSubview:audio];
  251. [audio release];

Report this snippet  

You need to login to post a comment.