iphone objective-c avaudioplayer uislider

iphone - UISlider para controlar AVAudioPlayer



objective-c (3)

Estoy tratando de implementar una pequeña función en mi aplicación. Actualmente estoy reproduciendo sonidos como reproductores AVAudio y eso funciona bien. Lo que me gustaría agregar es controlar la posición del sonido (currentTime) con un UISlider: ¿hay una manera simple de hacerlo?

Miré un proyecto de Apple pero estaba bastante desordenado ... ¿tienes muestras o sugerencias?

Gracias a todos por adelantado


Necesitaba adaptar un poco la respuesta anterior para que funcionara. El problema es que usar

slider.maximumValue = [player duration]; slider.value = player.currentTime; player.currentTime = slider.value;

No trabaje porque el control deslizante espera un flotador y el jugador currentTime y dration devuelven CMTime. Para hacer estos trabajos, los adapté para leer:

slider.maximumValue = CMTimeGetSeconds([player duration]); slider.value = CMTimeGetSeconds(player.currentTime); player.currentTime = CMTimeMakeWithSeconds((int)slider.value,1);


No debería ser un problema: simplemente establece el control deslizante en continuo y establece el valor máximo en la duración de tu reproductor después de cargar tu archivo de sonido.

Editar

Acabo de hacer esto y funciona para mí ...

- (IBAction)slide { player.currentTime = slider.value; } - (void)updateTime:(NSTimer *)timer { slider.value = player.currentTime; } - (IBAction)play:(id)sender { NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"sound.caf" ofType:nil]]; NSError *error; player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; if (!player) NSLog(@"Error: %@", error); [player prepareToPlay]; slider.maximumValue = [player duration]; slider.value = 0.0; [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES]; [player play]; }

El control deslizante está configurado en IB, al igual que un botón para comenzar a jugar.

Actualización Swift 3.0:

var player: AVAudioPlayer! var sliderr: UISlider! @IBAction func play(_ sender: Any) { var url = URL(fileURLWithPath: Bundle.main.path(forResource: "sound.caf", ofType: nil)!) var error: Error? do { player = try AVAudioPlayer(contentsOf: url) } catch let error { } if player == nil { print("Error: /(error)") } player.prepareToPlay() sliderr.maximumValue = Float(player.duration) sliderr.value = 0.0 Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(self.updateTime), userInfo: nil, repeats: true) player.play() } func updateTime(_ timer: Timer) { sliderr.value = Float(player.currentTime) } @IBAction func slide(_ slider: UISlider) { player.currentTime = TimeInterval(slider.value) }


Para ampliar la respuesta de Paull, debe establecer que el control deslizante sea continuo con un valor máximo de la duration de su reproductor de audio, y luego agregar un objeto suyo (probablemente el controlador de vista) como objetivo para el evento UIControlEventValueChanged del control deslizante; cuando reciba el mensaje de acción, luego establecerá la propiedad currentTime AVAudioPlayer en el valor del control deslizante. También es posible que desee utilizar un NSTimer para actualizar el valor del control deslizante mientras se reproduce el reproductor de audio; +scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: es la forma más fácil de hacerlo.