关于MPEG4视频中的图片组(GOP)(MPEG4 Part2和H.264),我有两个问题:
如何使用FFmpeg提取视频序列的GOP结构和大小?我知道av_get_picture_type_char
结构的AVPicture
函数会为每个帧生成图片类型,但我想知道是否有更直接的方法来获取GOP信息?
如何检测序列是否具有开放GOP或闭合GOP,即是否允许来自一个GOP的B帧参考相邻GOP中的I帧和P帧?
答案 0 :(得分:4)
这些都不是直接在ffmpeg中导出的,所以你必须自己解决这些问题。因此1的简短回答是" no"。如果你解析帧(你不需要解码它们)并获得帧类型,你应该能够在AVPacket.pos中识别文件中的位置(偏移量,以字节为单位)。对于序列中的每个I帧,搜索其后的数据包并记下AVPacket。pos和AVPacket。pts。如果B(pos)> I(pos)但是B(pts)<我(pts),你有开放GOP,否则关闭共和党。如果您想更精确,可以找一些方法从h264解析器导出POC,这与时间戳成正比。
解析循环只是av_read_frame()。
答案 1 :(得分:0)
以下 ffprobe cmdline 对我有用:
ffprobe -hide_banner -show_frames -i video.mp4 | egrep pict_type
示例输出:
pict_type=I
pict_type=B
pict_type=B
pict_type=P
pict_type=B
pict_type=B
pict_type=P
...
我相信 pkt_size
的 grepping 会为您提供每帧的编码大小,但我可能是错的。
另见How to calculate GOP size of a file H264
编辑:另见下方 lllogan 的评论。