AVPlayer currentTime актуализация за UISlider при зареждане на ViewController

Пускам песни в AVPlayer. Създадох отделен контролер за изглед за моя медиен плейър и инициализация и всички методи, които използвам за плейъра (възпроизвеждане, пауза, повторение, разбъркване), са в същия контролер за изглед.

Актуализирам плъзгач като този:

[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(sliderUpdate:) userInfo:nil repeats:YES];`


- (void) sliderUpdate:(id) sender{
    int currentTime =   (int)((song.player.currentTime.value)/song.player.currentTime.timescale);
    slider.value=currentTime;
    NSLog(@"%i",currentTime);

    song.currentTime=currentTime;
    int currentPoint=(int)((song.player.currentTime.value)/song.player.currentTime.timescale);
    int pointMins=(int)(currentPoint/60);
    int pointSec=(int)(currentPoint%60);

    NSString *strMinlabel=[NSString stringWithFormat:@"%02d:%02d",pointMins,pointSec];
    lblSlidermin.text=strMinlabel;
    song.strslidermin=strMinlabel;
}

След като излизам от контролера за изглед и когато се върна отново, песента се възпроизвежда, но проблемът е, че плъзгачът не се актуализира. Така че създадох единичен клас, за да присвоя подробности за текущо възпроизвежданата песен. Също така в актуализацията на плъзгача присвоих playerCurrentTime (текуща стойност на плъзгача) за променлива на единичен клас. И моя viewdidload метод, който присвоих така:

if (song.isPlaying==NO) {
    [self prePlaySong];
}else{
    lblAlbum.text=song.currentAlbum;
    lblArtist.text=song.currentArtist;
    lblSong.text=song.currentSong;
    slider.value=song.currentTime;
    slider.maximumValue=song.sliderMax;
    slider.minimumValue=song.sliderMin;
    imgSong.image=song.songImage;
    [btnMiddle setBackgroundImage:[UIImage imageNamed:@"pause.png"] forState:UIControlStateNormal];
}

но плъзгачът не се актуализира. Защо е така и как мога да разреша този проблем?


person iDia    schedule 01.10.2013    source източник


Отговори (2)


Не трябва да използвате таймер за това, AVPlayer предоставя API, който наблюдавате времето.

Регистрирайте наблюдател (напр. в viewWillAppear) по този начин:

CMTime interval = CMTimeMakeWithSeconds(1.0, NSEC_PER_SEC); // 1 second
self.playbackTimeObserver =
    [self.player addPeriodicTimeObserverForInterval:interval 
                                              queue:NULL usingBlock:^(CMTime time) {
    // update slider value here...
}];

За да отмените регистрацията на наблюдателя (напр. в viewDidDisappear), направете:

[self.player removeTimeObserver:self.playbackTimeObserver];

Надявам се това да помогне.

person chris    schedule 02.10.2013

Swift 3 версия.

Регистрирайте наблюдател:

// Invoke callback every second
let interval = CMTime(seconds:1.0, preferredTimescale: CMTimeScale(NSEC_PER_SEC))

// Queue on which to invoke the callback
let mainQueue = DispatchQueue.main

// Keep the reference to remove
self.playerObserver = player.addPeriodicTimeObserver(forInterval: interval, queue: mainQueue) { time in
    print(time)
}

Премахване на наблюдател:

if let observer = self.playerObserver {
    self.player.removeTimeObserver(observer)
    self.playerObserver = nil
}
person Allen    schedule 19.03.2018