通过 FFmpeg 的 GOP 结构
GOP structure via FFmpeg
我有两个关于 MPEG4 视频(MPEG4 Part2 和 H.264)中的图片组 (GOP) 的问题:
如何使用 FFmpeg 提取视频序列的 GOP 结构和大小?我知道 AVPicture
结构体的 av_get_picture_type_char
函数会为每一帧生成图片类型,但我想知道是否有更直接的方法来获取 GOP 信息?
如何检测序列是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 的评论。
我有两个关于 MPEG4 视频(MPEG4 Part2 和 H.264)中的图片组 (GOP) 的问题:
如何使用 FFmpeg 提取视频序列的 GOP 结构和大小?我知道
AVPicture
结构体的av_get_picture_type_char
函数会为每一帧生成图片类型,但我想知道是否有更直接的方法来获取 GOP 信息?如何检测序列是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 的评论。