Wil*_*ler 6 avfoundation ios cmtime
我正在尝试用AVFoundation播放视频.我使用以下代码获得一个按钮,使播放前进一帧.
它间歇性地工作,在一些执行中它会做正确的事情并前进一帧,但是大多数时候我将不得不按下按钮3或4次才能前进一帧.
这让我觉得这是一种精确的问题,但我无法弄清楚它是什么.每次运行时,新的CMTime似乎都以相同的数量前进.
我的另一个理论是它可能是由于currentTime没有被设置为我的帧速率的精确帧边界(由搜索视频引起).但我不知道如何以我的帧率"捕捉"到最近的帧.
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];
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
这不是很明显(因为奇怪的是它只在 AVPlayerItem 中可用,而不是在 AVPlayer 中可用),但如果 AVPlayerItem 返回 YES,那么canStepForward/canStepBackward您可以调用stepByCount:(NSInteger)stepCount:向前或向后移动一定数量的帧。
您的问题的答案在第二行代码中,您从nominalFrameRate中删除"名义".
您的代码假定视频中的帧速率不变.这是不正确的.
视频可以有一个恒定的fps,但它没有.例如,如果您在可变照明条件下使用手机拍摄胶片,则帧曝光时间可能会发生变化,帧速率也会反向变化.
要"捕捉"到帧边界,您需要使用AVAssetReader逐步执行各个帧.每个帧都标有一个演示时间戳(它的"t"),但如果你踩到的那个并不重要,除非你正在更新一个位置标记.
| 归档时间: |
|
| 查看次数: |
4727 次 |
| 最近记录: |