IOS AVPlayer获取fps

我试图找出如何通过AVPlayer检索video帧率。 AVPlayerItem有一个速率variables,但它只返回一个介于0和2之间的值(通常在播放时为1)。 任何人有一个想法如何获得video帧率?

干杯

使用AVAssetTrack's nominalFrameRate property

下面的方法来获取FrameRate :这里queuePlayerAVPlayer

 -(float)getFrameRateFromAVPlayer { float fps=0.00; if (self.queuePlayer.currentItem.asset) { AVAssetTrack * videoATrack = [[videoAsset tracksWithMediaType:AVMediaTypeVideo] lastObject]; if(videoATrack) { fps = videoATrack.nominalFrameRate; } } return fps; } 

在不同版本的iOS上播放的相同媒体返回的这个nominalFrameRate似乎存在差异。 我有我用ffmpeg以每秒1帧(125帧)和关键帧每25帧编码的video,当在iOS 7.x上的应用程序中加载时,(标称)帧速率为1.0,而在iOS 8.x上,标称)帧率是0.99。 这似乎是一个非常小的差异,但是在我的情况下,我需要精确导航到电影中给定的帧,这种差异导致这种导航(电影是演示幻灯片序列的编码)。 鉴于我已经知道我的应用程序需要播放的video的帧速率(例如1 fps),我可以简单地依靠这个值,而不是dynamic地确定帧速率(通过nominalFrameRate值),但是我想知道为什么有这样的差异这个nominalFrameRate去iOS版本。 有任何想法吗?

我不知道什么AVPlayer可以帮助你计算帧率。

AVPlayerItem rate属性是播放速率,与帧速率无关。

更简单的选项是获取AVAssetTrack并读取其nominalFrameRate属性。 只要创build一个AVAsset ,你会得到一个轨道arrays。

或者使用AVAssetReader读取video,获取其演示时间并计算同一秒内有多less帧,然后平均几秒或整个video。

AVPlayer上的比率值是相对于实时播放的速度,例如0.5是慢动作,2是双倍速度。

正如帕雷什Navadiya指出,一个轨道也有一个nominalFrameRatevariables,但这似乎有时会给出奇怪的结果。 我迄今为止发现的最佳解决scheme是使用以下内容:

 CMTime frameDuration = [myAsset tracksWithMediaType:AVMediaTypeVideo][0].minFrameDuration; float fps = frameDuration.timescale/(float)frameDuration.value; 

以上给出了可变帧频略微出乎意料的结果,但可变帧频无论如何都有一些奇怪的行为。 除此之外,它在我的testing中匹配ffmpeg -i。

编辑—-

我发现有时上面给出时间kCMTimeZero。 我使用的解决方法是创build一个带有轨道输出的AVAssetReader,获取第一帧和第二帧的点数,然后减去两个点。