У кого-нибудь есть ссылка на учебник по добавлению индикатора выполнения воспроизведения в AVAudioPlayer?
Я много искал на этом сайте и в Google, но безрезультатно
У кого-нибудь есть ссылка на учебник по добавлению индикатора выполнения воспроизведения в AVAudioPlayer?
Я много искал на этом сайте и в Google, но безрезультатно
Я понял это, и это было неплохо.
Просто обновите его в таймере
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);
}
Класс 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
}
Добавьте периодический наблюдатель времени и обновите ползунок - в 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)
}
}
addPeriodicTimeObserver
.
- person Enrique; 11.06.2020