2

我已经实现了 AVPlayerItem 的 stepByCount 方法来手动逐帧浏览视频。这是前进 1 步的样子。

    AVPlayer *player = [AVPlayer playerWithURL:url];
    [player.currentItem stepByCount:1];

并向后退 1 步

    AVPlayer *player = [AVPlayer playerWithURL:url];
    [player.currentItem stepByCount:-1];

前进 1 步(逐帧按时间帧前进)效果很好。但是,当我尝试逐帧后退时,它并不像前进那么顺利。我错过了什么吗?或者这是因为视频的编码方式——它的本意是向前观看而不是向后观看——本质上?

4

2 回答 2

3

您可以检查 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];
}
于 2014-12-15T19:58:15.230 回答
1

不确定您的视频采用什么编码格式,但压缩视频是用关键帧编码的。这些事件要么定期发生(例如每秒一次),要么发生在场景发生变化时(例如从特写镜头到广角镜头的剪辑)。关键帧之间的数据只是描述了自最后一个关键帧以来的累积变化——只记录了变化的像素。正如您所推断的,这意味着反向视频不是设计播放的方式。当您向后跳过时,编码器需要跳回到上一个关键帧(可能是您当前位置之前的数百甚至数千帧),然后重新创建所有帧直到您需要的帧,然后再实际向您呈现合成帧。在您的情况下,解决此问题的唯一方法是使用已经扁平化的视频格式或在扫描前将其扁平化。你可能想看看http://opencv.org/如果你想进入解压。

于 2013-06-23T10:00:42.457 回答