AVPlayer не работает в соответствии с ползунком перетаскивания в iOS - PullRequest
0 голосов
/ 07 ноября 2019

Привет, я реализовал AVPlayer, который воспроизводит звуковую песню с URL-адреса. Работает воспроизведение / пауза, но проблема заключается в попытке перетаскивания слайдера. Не работает. Когда я перетаскиваю ползунок. остановлен .. он начинает играть с самого начала .. Ниже приведен мой код. Можете ли вы помочь мне, что может быть проблема в mycode.

    - (instancetype)initWithLocalAudioUrl:(NSURL *)url {
    self = [super init];
    if (self) {
        self.playedTime = 0;
        self.audioUrl = url;
        NSLog(@"audio url : %@", url);
        [self prepareToPlay];
    }
    return self;
}

- (void)prepareToPlay {
    AVPlayerItem *playItem = [[AVPlayerItem alloc] initWithURL:self.audioUrl];
    NSLog(@"✅playitem with url :%@", playItem);
    self.player = [[AVPlayer alloc] initWithPlayerItem:playItem];
    self.playerView = [[OHPlayerView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, FIT_LENGTH(10))];
    self.playerView.delegate = self;
    NSLog(@"wav total time : %lf", CMTimeGetSeconds(self.player.currentItem.duration));
    self.playerView.totalTime = CMTimeGetSeconds(self.player.currentItem.asset.duration) * 1000;
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(stop)
                                                 name:AVPlayerItemDidPlayToEndTimeNotification
                                               object:playItem];
}

- (void)play {
    NSLog(@"play");
    [self changeAudioPort];
    [self.player play];
    [self refreshPlayedTime];
}

- (void)pause {
    NSLog(@"pause");
    [self.player pause];
}

- (void)stop {
    NSLog(@"stop");
    [self.player pause];
    [self.player seekToTime:kCMTimeZero];
    if (self.delegate && [self.delegate respondsToSelector:@selector(didFinishedPlaying)]) {
        [self.delegate performSelector:@selector(didFinishedPlaying)];
    }
    self.playedTime = 0;
    self.playerView.playedTime = 0;
    [self.player removeTimeObserver:self.timeObserver];
}

- (void)changeAudioPort {
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
    [session setActive:YES error:nil];
}

- (void)refreshPlayedTime {
    __weak typeof(self) weakSelf = self;
    self.timeObserver = [self.player addPeriodicTimeObserverForInterval:CMTimeMake(1, 10.0) queue:NULL usingBlock:^(CMTime time) {
        weakSelf.playedTime = CMTimeGetSeconds(time) * 1000;
        weakSelf.playerView.playedTime = CMTimeGetSeconds(time) * 1000;
        NSLog(@"..... play time : %f", weakSelf.playedTime);
    }];
}

Ниже код, используемый при скольжении

- (void)beginSliding {
    [self.player pause];
    if (self.timeObserver) {
        NSLog(@"begin sliding remove time observer");
        [self.player removeTimeObserver:self.timeObserver];
        self.timeObserver = nil;
    }
}
-(void)sliderValueChanged:(NSTimeInterval)time{

}
- (void)endSliding:(NSTimeInterval)time {
     self.playedTime = time;
     self.playerView.playedTime = time;
    NSLog(@"end sliding seek to time : %f", time);
    [self.player seekToTime:CMTimeMake(time, 1) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
    [self play];
}
...