如何判断 AVAssetTrack 是否具有可变帧率?

How to tell if an AVAssetTrack has a variable framerate?

我试图区分具有可变帧速率的 AVAssets 和那些不可变帧速率的 AVAssets。

我知道我可以解码每一帧并检查帧持续时间是否不会改变每一帧,但这是昂贵的,我查看了可用的元数据但没有发现任何有用的东西。

有人知道从哪里开始吗?到目前为止我的最佳想法是使用:

CMTime duration = [myAsset duration];
CMTime frameDuration = myAssetTrack.minFrameDuration;
if(!(duration.value * frameDuration.timescale) %
    (duration.timescale * frameDuration.value))
    NSLog(@"asset is constant frame rate");

但这最终容易受到假阴性的影响。有没有更好的方法?

(此外,对于任何看上面的人来说,这也容易受到误报的影响,因为 AVAssets 似乎在视频末尾添加了一个黑框并给它一个可以变化的时间戳,要正确使用这个你应该解码倒数第二帧并使用它的呈现时间戳 - 此代码更简单)

首先,除非您自己创建它们,否则我认为最安全的假设是所有 视频文件都具有可变帧率。

其次,逐帧读取真的成本太高了吗?如果您使用 nil 输出设置创建 AVAssetReader + AVAssetReaderTrackOutput,阅读框架 应该 * 实际上不会导致解压缩,但会导致对文件,给出 CMSampleBuffers,您可以检查其显示时间戳以确定帧速率稳定性。

*我希望,我最近没有验证这一点,但很久以前我在寻找索引电影文件的方法,这种方法似乎非常快。