GOP结构通过FFmpeg

时间:2015-09-25 12:39:49

标签: ffmpeg h.264 mpeg-4

关于MPEG4视频中的图片组(GOP)(MPEG4 Part2和H.264),我有两个问题:

  1. 如何使用FFmpeg提取视频序列的GOP结构和大小?我知道av_get_picture_type_char结构的AVPicture函数会为每个帧生成图片类型,但我想知道是否有更直接的方法来获取GOP信息?

  2. 如何检测序列是否具有开放GOP或闭合GOP,即是否允许来自一个GOP的B帧参考相邻GOP中的I帧和P帧?

2 个答案:

答案 0 :(得分:4)

这些都不是直接在ffmpeg中导出的,所以你必须自己解决这些问题。因此1的简短回答是" no"。如果你解析帧(你不需要解码它们)并获得帧类型,你应该能够在AVPacket.pos中识别文件中的位置(偏移量,以字节为单位)。对于序列中的每个I帧,搜索其后的数据包并记下AVPacketposAVPacketpts。如果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 的评论。