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