我已经实现了AVPlayerItem的stepByCount方法来逐帧手动浏览视频。以下是前进1步的表现。
AVPlayer *player = [AVPlayer playerWithURL:url];
[player.currentItem stepByCount:1];
向后一步
AVPlayer *player = [AVPlayer playerWithURL:url];
[player.currentItem stepByCount:-1];
前进1步(逐帧前进)效果很好。然而,当我尝试逐帧后退时,它不像前进步骤那样平滑。我错过了什么吗?或者这是因为视频的编码方式 - 它本来是向前看而不是向后看 - 本身就是这样?
答案 0 :(得分:2)
您可以检查AVPlayerItem是否支持步进:
if (playerItem.canStepBackward)
{
[playerItem stepByCount:numberOfFrames];
}
else
{
// Do our best here...
[player seekToTime:CMTimeSubtract(player.currentTime, CMTimeMake(ABS(numberOfFrames)*1000, compositionFPS*1000)) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
}
答案 1 :(得分:1)
不确定您的视频所处的编码格式,但压缩视频是使用关键帧编码的。它们以规则的间隔(例如每秒一次)或当场景发生变化时发生(例如从近距离拍摄到宽幅拍摄时)。关键帧之间的数据仅描述自上一个关键帧以来的累积更改 - 仅记录更改的像素。正如您所推断的,这意味着反向视频不是如何设计播放的。当您向后跳过时,编码器需要跳回到前一个关键帧(可能是当前位置之前的数百甚至数千帧),然后在实际向您呈现合成帧之前重新创建所需的帧。在您的情况下解决这个问题的唯一方法是使用已经展平的视频格式或在扫描前将其展平。如果您想进行减压,可能需要查看http://opencv.org/。