首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CMTime和AVFoundation中单帧移动

在CMTime和AVFoundation中单帧移动
EN

Stack Overflow用户
提问于 2011-06-24 07:26:51
回答 2查看 5.1K关注 0票数 7

我正在尝试用AVFoundation播放视频。我为一个按钮使用了下面的代码,这个按钮将播放提前了一帧。

它间歇性地工作,在某些执行中它会做正确的事情并前进一帧,但大多数时候我必须按下按钮3到4次才能前进一帧。

这使我认为这是某种精度问题,但我不能弄清楚它是什么。每次运行时,新的CMTime似乎都会以相同的速度前进。

我的另一个理论是,这可能是因为currentTime没有设置到我的帧率下的精确帧边界(由查找视频引起)。但我不知道如何以我的帧速率“捕捉”到最近的帧。

代码语言:javascript
复制
AVAssetTrack *videoTrack = ...;
Float64 frameRate = [videoTrack nominalFrameRate];

CMTime currentTime = [self.playerItem currentTime];
CMTime oneFrame = CMTimeMakeWithSeconds(1.0 / frameRate, currentTime.timescale);
CMTime added = CMTimeAdd(currentTime, oneFrame);

[self.player seekToTime:added toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];

谢谢你的帮忙!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-12 03:37:44

这并不是很明显(因为奇怪的是,它只在AVPlayerItem中可用,而不是在AVPlayer中),但是如果AVPlayerItem为canStepForward/canStepBackward返回YES,那么您可以调用stepByCount:(NSInteger)stepCount:来向前或向后移动一定数量的帧。

票数 5
EN

Stack Overflow用户

发布于 2011-06-25 06:14:33

您的问题的答案在第二行代码中,您从nominalFrameRate中删除了"nominal“。

您的代码假定视频中的帧率是恒定的。这是不正确的。

一个视频可以有恒定的fps,但它不是必须的。例如,如果你用手机在不同的光照条件下拍摄胶片,那么帧曝光时间可能会改变,你的帧率也会相反变化。

要“捕捉”到框架边界,您需要使用AVAssetReader遍历各个框架。每一帧都有一个演示时间戳(它的"t"),但如果你是在单步执行,那么这并不重要,除非你正在更新位置标记。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6461789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档