我正在制作一个使用 AVPlayer 的应用程序。在我的一个观点中,我有一个 UISlider,用户应该能够使用它向前和向后滑动。我在让 seekToTime
按我的意愿工作时遇到了一些问题。当我尝试更改时间时,播放从 0 开始,但我不确定如何解决这个问题。我当前的实现如下所示:
[self.progressSlider addTarget:self action:@selector(sliderValueChanged) forControlEvents:UIControlEventValueChanged];
[self.progressSlider addTarget:self action:@selector(sliderReleased) forControlEvents:UIControlEventTouchUpInside];
- (void)sliderValueChanged {
[...]
[player pause];
}
- (void)sliderReleased {
float timeInSecond = self.progressSlider.value;
timeInSecond *= 1000;
// I have trie to hard code this value, but I get the same result.
CMTime cmTime = CMTimeMake(timeInSecond, NSEC_PER_SEC);
[player.currentItem seekToTime:cmTime toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero completionHandler:^(BOOL finished) {
if (finished) {
[player play];
}
}];
}
对我做错了什么有什么想法吗?
可以提及我使用 AVPlayer 的流式传输音频:playerItemWithURL
如果这有任何区别的话。
最佳答案
一个问题是 NSEC_PER_SEC
是 1,000,000,000,所以 CMTimeMake(timeInSecond, NSEC_PER_SEC)
将是一个非常小的数字(除非 timeInSecond
大得离谱) - 事实上,它会任意接近于零,这正是你正在经历的。
需要说明的是:CMTimeMake
定义了一个有理数。你给了一个分子和一个分母。如果分母很大,那么有理数就会很小。
关于iOS - AVPlayer seekToTime 重新开始播放 currentItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23228181/