我正在尝试使用FFMPEG和libavformat从WebM文件中检索持续时间和帧数。我正在调整一些最初编写的代码用于MP4s,并且在传递MP4时似乎工作正常。
我使用vp8解析器和解码器以及matroska demuxer编译了FFMPEG 2.1。
我有一个指向视频流的AVStream
指针*video_st
。该代码会查找video_st->nb_frames
中的帧数以及video_st->duration
中的持续时间。这两者似乎都是0。
video_st->duration
(https://ffmpeg.org/doxygen/trunk/structAVStream.html#a4e04af7a5a4d8298649850df798dd0b)的API文档说“如果源文件未指定持续时间,但指定了比特率,则将根据比特率和文件大小估算此值。 “我可以确认这个文件确实指定了持续时间和比特率(因为我在桌面上用ffmpeg -i
测试了它)。所以这似乎很奇怪,这是返回0.也许我的FFMPEG构建配置不正确?
对于nb_frames
,文档说“此流中的帧数(如果已知或0)”。如果返回0,我能做什么吗?同样,ffmpeg -i
确实返回fps的估计值;这将是足够好的,因为我可以估计具有该帧和持续时间的帧数。
谢谢!
答案 0 :(得分:8)
为什么nb_frames为0?
Mp4文件可以包含流中所有帧的完整索引,这样您就可以准确地知道帧数。 AVI也这样做。 WebM仅允许感兴趣帧的索引,例如,关键帧,这意味着索引较小(即较小的文件),但它也意味着除非你解析整个文件,否则你不知道帧数。
如何获得持续时间?
AVStream。duration是每个流的持续时间。对于许多文件类型(包括WebM),只在标题中指定整个文件的持续时间,而不是每个流的持续时间。因此,请使用AVFormatContext。duration,其中AV_TIME_BASE单位(微秒)。要获得近似的FPS,请使用AVStream。avg_frame_rate,然后可以从那里近似nb_frames。