我正在制作一款使用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
如果这有任何区别。
答案 0 :(得分:2)
一个问题是NSEC_PER_SEC
是1,000,000,000,所以CMTimeMake(timeInSecond, NSEC_PER_SEC)
将是一个非常小的数字(除非timeInSecond
非常大) - 事实上,它将任意接近零,这正是你所经历的。
为了清楚起见:CMTimeMake
定义了一个有理数。你给的是分子和分母。如果你的分母很大,那么有理数就会很小。