C++ 使用FFMPEG/libavm格式查找WebM的持续时间/帧数

C++ 使用FFMPEG/libavm格式查找WebM的持续时间/帧数,c++,ffmpeg,webm,libavformat,C++,Ffmpeg,Webm,Libavformat,我正在尝试使用FFMPEG和libavformat从WebM文件中检索持续时间和帧数。我正在修改一些最初为MP4s编写的代码,当通过MP4时,它似乎可以正常工作 我用vp8解析器和解码器以及matroska解复用器编译了FFMPEG 2.1 我有一个指向视频流的AVStream指针,*video\u st。代码在video\u st->nb\u frames中查找帧数,并在video\u st->duration中查找持续时间。这两者似乎都是0 video\u st->duration()的AP

我正在尝试使用FFMPEG和libavformat从WebM文件中检索持续时间和帧数。我正在修改一些最初为MP4s编写的代码,当通过MP4时,它似乎可以正常工作

我用vp8解析器和解码器以及matroska解复用器编译了FFMPEG 2.1

我有一个指向视频流的
AVStream
指针,
*video\u st
。代码在
video\u st->nb\u frames
中查找帧数,并在
video\u st->duration
中查找持续时间。这两者似乎都是0

video\u st->duration
()的API文档说“如果源文件没有指定duration,但是指定了比特率,那么这个值将根据比特率和文件大小进行估计。”我可以确认这个文件确实指定了duration和比特率(正如我在桌面上用
ffmpeg-I
测试的那样)。所以它返回0似乎很奇怪。也许我的FFMPEG构建配置不正确

至于
nb_帧
,文档说“如果已知,则此流中的帧数为0”。如果返回0,我能做些什么吗?同样,
ffmpeg-i
确实返回fps的估计值;这就足够了,因为我可以用它来估计帧数和持续时间


谢谢

为什么nb\U帧为0?

Mp4文件可以具有流中所有帧的完整索引,这允许您准确地知道帧的数量。阿维也这样做。WebM只允许对感兴趣的帧(例如关键帧)进行索引,这意味着索引更小(即文件更小),但也意味着除非解析整个文件,否则不知道帧的数量

如何获取持续时间?


。是每流的持续时间。对于许多文件类型,包括WebM,头中只指定整个文件的持续时间,而不是每个流的持续时间。因此,使用单位为(微秒)的。要获得近似的FPS,请使用.,然后可以从那里近似nb_帧。

谢谢!很好的解释。使用帧速率来估计帧数对于我来说已经足够好了,你对持续时间的建议也行得通。我可能只需要弄清楚如何更准确地估计,因为我有时会在结尾看到两个黑色帧,或者最后两个帧被切掉。