我或多或少地使用此处的代码:AVPlayer Video SeekToTime 然而,当我尝试滚动它似乎锁定到某些时间点(基本上每一帧都放在第二个时间标记上),所以当我擦洗擦洗器时,在我的手指和最后一秒之间来回拍摄通过,视频只在第二个标记处发生变化。
现在我做了一个“大”改变,因为我们想要平滑滚动是在任何有“seekToTime”的地方我用seekToTime替换它:toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero。
如果您需要更多信息,请告诉我们!提前谢谢!
答案 0 :(得分:12)
参考下面的代码:此代码是Apple示例代码的一部分
如果您尝试实现流媒体播放器,请参阅下面的示例代码。
另外,完全修复的完整工具是使用下面的like滑块。 因为伟大的视频播放器应该考虑用户体验。如您所知,运行默认视频应用程序。在擦洗时,如果向下拖动滑块必须进行微调。
/* The user is dragging the movie controller thumb to scrub through the movie. */
- (IBAction)beginScrubbing:(id)sender
{
mRestoreAfterScrubbingRate = [mPlayer rate];
[mPlayer setRate:0.f];
/* Remove previous timer. */
[self removePlayerTimeObserver];
}
/* Set the player current time to match the scrubber position. */
- (IBAction)scrub:(id)sender
{
if ([sender isKindOfClass:[UISlider class]])
{
UISlider* slider = sender;
CMTime playerDuration = [self playerItemDuration];
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);
[mPlayer seekToTime:CMTimeMakeWithSeconds(time, NSEC_PER_SEC)];
}
}
}
/* The user has released the movie thumb control to stop scrubbing through the movie. */
- (IBAction)endScrubbing:(id)sender
{
if (!mTimeObserver)
{
CMTime playerDuration = [self playerItemDuration];
if (CMTIME_IS_INVALID(playerDuration))
{
return;
}
double duration = CMTimeGetSeconds(playerDuration);
if (isfinite(duration))
{
CGFloat width = CGRectGetWidth([mScrubber bounds]);
double tolerance = 0.5f * duration / width;
mTimeObserver = [[mPlayer addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(tolerance, NSEC_PER_SEC) queue:NULL usingBlock:
^(CMTime time)
{
[self syncScrubber];
}] retain];
}
}
if (mRestoreAfterScrubbingRate)
{
[mPlayer setRate:mRestoreAfterScrubbingRate];
mRestoreAfterScrubbingRate = 0.f;
}
}
答案 1 :(得分:3)
除了bitmapdata.com回答(使用[AVPlayer setRate]而不是pause / seekTime),您需要在每个帧上编码一个带有关键帧的视频。 只需使用该设置重新编码我的视频,现在我可以非常顺利地浏览我的视频!