UISlider для управления AVAudioPlayer
Я пытаюсь реализовать небольшую функцию в своем приложении. В настоящее время я играю звуки как AVAudioPlayers, и это отлично работает. Что я хотел бы добавить, это контролировать положение звука (currentTime) с помощью UISlider: есть ли простой способ сделать это?
Я посмотрел на проект Apple, но это было довольно грязно... у вас есть образцы или предложения?
Спасибо всем заранее
Ответы
Ответ 1
Чтобы продлить ответ на paull, вы должны установить ползунок непрерывным с максимальным значением вашего аудиоплеера duration
, а затем добавить некоторый объект (возможно, контроллер вида) в качестве цели для слайдера UIControlEventValueChanged
событие; когда вы получите сообщение о действии, вы должны установить для свойства AVAudioPlayer
currentTime
значение ползунка.
Вы также можете использовать NSTimer
для обновления значения слайдера при воспроизведении звукового проигрывателя; +scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
- это самый простой способ сделать это.
Ответ 2
Не должно быть проблем - просто установите ползунок в непрерывном режиме и установите максимальное значение на длительность проигрывателя после загрузки звукового файла.
Edit
Я только что сделал это, и он работает для меня...
- (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];
}
Ползунок настроен в IB, как кнопка для начала воспроизведения.
Обновление 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)
}
Ответ 3
Мне нужно было немного адаптировать приведенный выше ответ, чтобы заставить его работать. Проблема в том, что использование
slider.maximumValue = [player duration];
slider.value = player.currentTime;
player.currentTime = slider.value;
Не работает, потому что слайдер ожидает поплавок и текущий ток игрока, а возврат - CMTime. Чтобы сделать эти работы, я адаптировал их для чтения:
slider.maximumValue = CMTimeGetSeconds([player duration]);
slider.value = CMTimeGetSeconds(player.currentTime);
player.currentTime = CMTimeMakeWithSeconds((int)slider.value,1);