如何判断 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
,阅读框架 应该 * 实际上不会导致解压缩,但会导致对文件,给出 CMSampleBuffer
s,您可以检查其显示时间戳以确定帧速率稳定性。
*我希望,我最近没有验证这一点,但很久以前我在寻找索引电影文件的方法,这种方法似乎非常快。
我试图区分具有可变帧速率的 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
,阅读框架 应该 * 实际上不会导致解压缩,但会导致对文件,给出 CMSampleBuffer
s,您可以检查其显示时间戳以确定帧速率稳定性。
*我希望,我最近没有验证这一点,但很久以前我在寻找索引电影文件的方法,这种方法似乎非常快。