UISlider para controlar o AVAudioPlayer

Estou tentando implementar uma pequena function no meu aplicativo. Atualmente estou tocando sons como AVAudioPlayers e isso funciona bem. O que eu gostaria de acrescentar é controlar a posição do som (currentTime) com um UISlider: existe uma maneira simples de fazer isso?

Eu olhei para um projeto da Apple, mas foi bastante confuso …. você tem amostras ou sugestões?

Obrigado a todos antecipadamente

Para estender a resposta do paull, você definiria o controle deslizante como contínuo com um valor máximo da duration do seu reprodutor de áudio e, em seguida, adicionaria algum object seu (provavelmente o controlador de exibição) como destino do evento UIControlEventValueChanged do controle deslizante; quando você receber a mensagem de ação, você definirá a propriedade currentTime do AVAudioPlayer como o valor do controle deslizante. Você também pode querer usar um NSTimer para atualizar o valor do controle deslizante enquanto o player de áudio é reproduzido; +scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: é a maneira mais fácil de fazer isso.

Não deve ser um problema – basta definir o controle deslizante para contínuo e definir o valor máximo para a duração do seu player após carregar o arquivo de som.

Editar

Eu fiz isso e funciona para mim …

 - (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]; } 

O controle deslizante é configurado no IB, assim como um botão para começar a jogar.

Atualização do 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) } 

Eu precisava adaptar um pouco a resposta acima para fazê-la funcionar. A questão é que usando

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

Não funcione porque o controle deslizante espera um float e o player currentTime e dration retornam CMTime. Para fazer estes trabalhos, adaptei-os para ler:

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