使用FFMPEG/libavformat查找WebM的持续时间/帧数

7
我试图使用FFMPEG和libavformat从WebM文件中检索持续时间和帧数。我正在调整一些最初用于处理MP4的代码,当传递一个MP4时,它似乎可以正常工作。
我已经编译了带有vp8解析器和解码器以及matroska分离器的FFMPEG 2.1。
我有一个指向视频流的AVStream指针,*video_st。代码查找video_st->nb_frames中的帧数,并在video_st->duration中查找持续时间。这两者都显示为0。
API文档中对于video_st->duration (https://ffmpeg.org/doxygen/trunk/structAVStream.html#a4e04af7a5a4d8298649850df798dd0b)的说明是:"如果源文件没有指定持续时间,但指定了比特率,则将从比特率和文件大小估算此值。" 我可以确认该文件确实指定了持续时间和比特率(因为我在我的桌面上使用ffmpeg -i进行了测试)。所以这个返回值为0似乎有些奇怪。也许我的FFMPEG构建配置不正确?
至于nb_frames,文档中说:“如果已知,则为此流中的帧数;否则为0”。如果返回0,我能做什么呢?同样,ffmpeg -i会返回fps的估计值;这已经足够了,因为我可以用它和持续时间来估算帧数。
谢谢!
1个回答

14

为什么nb_frames为0?

Mp4文件可以拥有全部帧的索引,这使您能够准确知道帧数。AVI格式也是如此。WebM仅允许感兴趣的帧(例如关键帧)的索引,这意味着索引较小(即文件较小),但这也意味着除非解析整个文件,否则不知道帧数。

如何获得持续时间?

AVStream.duration每个流 的持续时间。对于许多文件类型,包括WebM,在头部中只指定了整个文件的持续时间,而不是每个流的持续时间。因此,请使用AVFormatContext.duration,它以AV_TIME_BASE单位(微秒)表示。要获得大约的FPS,请使用AVStream.avg_frame_rate,然后可以从那里近似计算nb_frames。


谢谢!解释得非常好。使用帧率来估算帧数对我的目的已经足够好了,而您关于持续时间的建议也很有用。我可能只需要想办法稍微更准确地估算,因为有时会看到最后几帧出现黑屏,或者最后几帧被剪掉了。 - gcgrant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接