Привет, я реализовал 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];
}