прогресс воспроизведения avaudioplayer

У кого-нибудь есть ссылка на учебник по добавлению индикатора выполнения воспроизведения в AVAudioPlayer?

Я много искал на этом сайте и в Google, но безрезультатно


person dubbeat    schedule 24.02.2010    source источник


Ответы (3)


Я понял это, и это было неплохо.

Просто обновите его в таймере

playbackTimer=[NSTimer scheduledTimerWithTimeInterval:0.5
                                     target:self 
                                                 selector:@selector(myMethod:) 
                                   userInfo:nil 
                                    repeats:YES];

}


-(void)myMethod:(NSTimer*)timer {

    float total=audioPlayer.duration;
    float f=audioPlayer.currentTime / total;

    NSString *str = [NSString stringWithFormat:@"%f", f];

    playbackProgress.progress=f;

    NSLog(str);
}
person dubbeat    schedule 24.02.2010

Класс CADisplayLink, который автоматически вызывает метод, который вы определяете, как только происходит перерисовка экрана.

Timer не обеспечивает точного срабатывания и может дрейфовать раньше или позже запрошенных обновлений, а также не имеет представления о перерисовке экрана и поэтому может с радостью сработать через 10 мс после того, как только что произошло перерисовка экрана.

let displayLink = CADisplayLink(target: self,
                                selector: #selector(update))
displayLink.add(to: .current, forMode: .common)


@objc func update() {
    let currentTime = avAudioPlayer.currentTime
    let totalTime = avAudioPlayer.duration
    let progress = currentTime / totalTime
}
person Paul Nyondo    schedule 20.02.2019
comment
Действительно таймер - это хорошо, но этот метод лучше для отслеживания. - person Muhammadjon; 23.06.2021

Добавьте периодический наблюдатель времени и обновите ползунок - в Swift это будет так -

   func addPlayBackSlider()
   {
    playbackSlider = UISlider(frame:CGRect(x:10, y:300, width:300, height:20))
    playbackSlider?.minimumValue = 0
    let duration : CMTime = playerItem.asset.duration
    let seconds : Float64 = CMTimeGetSeconds(duration)
    playbackSlider?.maximumValue = Float(seconds)
    playbackSlider?.isContinuous = true

    //If you want to manually set progressBar
    playbackSlider?.addTarget(self, action: #selector(AddAudioController.playbackSliderValueChanged(_:)), for: .valueChanged)

    //Here is the Observer
    player!.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, 1), queue: DispatchQueue.main) { (CMTime) -> Void in
        if self.player!.currentItem?.status == .readyToPlay {
            let time : Float64 = CMTimeGetSeconds(self.player!.currentTime());
            self.playbackSlider!.value = Float ( time );
        }
    }
   }

   //If you want to manually set progressBar
   func playbackSliderValueChanged(_ playbackSlider:UISlider)
   {
    let seconds : Int64 = Int64(playbackSlider.value)
    targetTime = CMTimeMake(seconds, 1)
    print(targetTime)

    player!.seek(to: targetTime)

    if player!.rate == 0
    {
        player?.play()
        playButton!.setTitle("Pause", for: UIControlState.normal)
    }
}
person Shawon91    schedule 13.09.2017
comment
Надеюсь это поможет :) - person Shawon91; 13.09.2017
comment
К сожалению, добавление периодического наблюдателя времени работает только для AVPlayer, но не для AVAudioPlayer. - person Joshua Haines; 14.09.2017
comment
AVAudioPlayer не имеет addPeriodicTimeObserver. - person Enrique; 11.06.2020