我有以下代码:
AVPlayerItem *currentItem = [AVPlayerItem playerItemWithURL:soundURL];
[self.audioPlayer replaceCurrentItemWithPlayerItem:currentItem];
[self.audioPlayer play];其中soundURL是remoteURL。效果很好。AVPlayer完美地播放了音乐。我有一个进度条,我正在根据球员的当前时间来更新它。
一切都很好。我的问题是,当我向前拖动进度条时,audioplayer从新位置开始,但是如果我拖动progressbar,它不会从新位置开始,实际上它会从前一个位置恢复。下面是我的进度条,拖动“开始”和“停止”代码:
- (IBAction)progressBarDraggingStart:(id)sender
{
if (self.audioPlayer.rate != 0.0)
{
[self.audioPlayer pause];
}
}
- (IBAction)progressBarDraggindStop:(id)sender
{
CMTime newTime = CMTimeMakeWithSeconds(self.progressBar.value, 1);
[self.audioPlayer seekToTime:newTime];
[self.audioPlayer play];
}有人能帮我解决这个问题吗?
发布于 2014-02-24 16:17:41
我建议你做几件事。首先,获取timescale值并将其传递给CMTime结构。第二,使用seekToTime:toleranceBefore:toleranceAfter:completionHandler:方法进行更精确的搜索。例如,您的代码如下所示:
- (IBAction)progressBarDraggindStop:(id)sender {
int32_t timeScale = self.audioPlayer.currentItem.asset.duration.timescale;
[self.audioPlayer seekToTime: CMTimeMakeWithSeconds(self.progressBar.value, timeScale)
toleranceBefore: kCMTimeZero
toleranceAfter: kCMTimeZero
completionHandler: ^(BOOL finished) {
[self.audioPlayer play];
}];
}发布于 2015-09-02 06:53:47
我使用下面的代码在@Corey的答案之后拖动添加的completionHandler,它工作得很好,没有任何web服务依赖:
- (void) sliderValueChanged:(id)sender {
if ([sender isKindOfClass:[UISlider class]]) {
UISlider *slider = sender;
CMTime playerDuration = self.avPlayer.currentItem.duration;
if (CMTIME_IS_INVALID(playerDuration)) {
return;
}
double duration = CMTimeGetSeconds(playerDuration);
if (isfinite(duration)) {
float minValue = [slider minimumValue];
float maxValue = [slider maximumValue];
float value = [slider value];
double time = duration * (value - minValue) / (maxValue - minValue);
[self.avPlayer seekToTime:CMTimeMakeWithSeconds(time, NSEC_PER_SEC) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero completionHandler:^(BOOL finished) {
[self.avPlayer play];
}];
}
}
}https://stackoverflow.com/questions/21992538
复制相似问题