通过 FFmpeg 的 GOP 结构

GOP structure via FFmpeg

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

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

  2. 如何检测序列是open GOP还是closed GOP,即一个GOP中的B帧是否可以引用相邻GOP中的I帧和P帧?

None 其中直接导出到 ffmpeg 中,因此您必须自己解决这些问题。所以 1 的简短答案是 "no"。如果你解析帧(你不需要解码它们)并获得帧类型,你应该能够在 AVPacket.pos 中识别文件中的位置(偏移量,以字节为单位)。对于序列中的每个 I 帧,搜索其后的数据包并记下 AVPacket.pos and AVPacket.pts。如果 B(pos) > I(pos) 但 B(pts) < I(pts),则 GOP 打开,否则关闭 GOP。如果你想更精确,想办法从h264解析器中导出POC,它与时间戳成正比。

解析循环就是av_read_frame()。

以下 ffprobe 命令行适用于我:

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
...

我相信 grepping pkt_size 可以为您提供每个帧的编码大小,但我可能是错的。

另见 How to calculate GOP size of a file H264

编辑:另请参阅下面 llogan 的评论。