【问题标题】:AVPlayerItem's stepByCount only smooth for forward, but choppy for backwards?AVPlayerItem step 计数仅向前平滑,但向后波动?
【发布时间】:2013-06-23 06:51:04
【问题描述】:

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

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

后退1步

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

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

【问题讨论】:

    标签: ios avfoundation video-capture avplayer


    【解决方案1】:

    可以查看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];
    }
    

    【讨论】:

    • 是否有支持步进的视频格式列表?
    【解决方案2】:

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

    【讨论】:

    • 非常感谢您的回答!由于压缩视频的每一帧只包含自上一帧以来的增量信息,这是否意味着当我解压缩视频时,每一帧都将包含完整的图像数据而不是差异,从而产生大量的完整图像帧(和当然是音轨)?我问的原因是因为我可以看到也许我可以实时捕获图像帧并将它们存储在大量图像中以便以后来回播放,而不是一开始就以视频格式存储它们。
    • 理论上你可以在它们进入时将它们全部缓存,但你说的是要存储的大量数据 - 对于 720p,你说的是 1280x720 的 30fps,可能是 24 位深,这大约是每秒 80mb(如果我的数学是正确的)。您可能会考虑以低得多的分辨率存储扫描的图像,因为它们在倒带时看起来不错,然后在扫描完成后跳回更高分辨率。
    • @amergin 我正在处理特定的
    • 抱歉,Ryan,我不确定,有一段时间没有使用这些东西了。如果您的视频很小,那么也许只需解压缩它们,然后自己处理解压缩的数据,虽然比现成的调用更冗长。
    • @amergin 你知道 AVFoundation 是否支持像这样手动管理数据?还是需要降级到较低级别的框架?
    猜你喜欢
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 2010-12-17
    相关资源
    最近更新 更多