其他分享
首页 > 其他分享> > c – 使用FFMPEG / libavformat查找WebM的持续时间/帧数

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

作者:互联网

我正在尝试使用FFMPEG和libavformat从WebM文件中检索持续时间和帧数.我正在调整一些最初编写的代码用于MP4s,并且当通过MP4时,它似乎工作正常.

我有使用vp8解析器和解码器以及matroska demuxer编译的FFMPEG 2.1.

我有一个指向视频流的AVStream指针,* video_st.该代码查找video_st-> nb_frames中的帧数,以及video_st-> duration中的持续时间.这两者似乎都是0.

适用于video_st->持续时间(https://ffmpeg.org/doxygen/trunk/structAVStream.html#a4e04af7a5a4d8298649850df798dd0b)的API文档说“如果源文件未指定持续时间,但确实指定了比特率,则将根据比特率和文件大小估算此值.”我可以确认这个文件确实指定了持续时间和比特率(因为我在桌面上用ffmpeg -i测试它).所以这似乎很奇怪,这是返回0.也许我的FFMPEG构建配置不正确?

对于nb_frames,文档说“此流中的帧数(如果已知或0)”.如果返回0,我能做什么吗?同样,ffmpeg -i确实返回fps的估计值;这将是足够好的,因为我可以估计具有该帧和持续时间的帧数.

谢谢!

解决方法:

为什么nb_frames为0?

Mp4文件可以包含流中所有帧的完整索引,这使您可以准确地知道帧数. AVI也这样做. WebM仅允许感兴趣帧的索引,例如,关键帧,这意味着索引较小(即较小的文件),但它也意味着你不知道帧数,除非你解析整个文件.

如何获得持续时间?

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

标签:webm,c,ffmpeg,libavformat
来源: https://codeday.me/bug/20190724/1526893.html