ffmpeg 关键记录 如何判断一个视频帧是否为关键帧
判断是否为关键帧的方法也比较简单,示例如下:
if (av_pkt.flags & AV_PKT_FLAG_KEY) { // av_pkt是从队列拿出来 的 每一个帧变量
LOGD(“read a key frame”);
}
其实是判断帧里面的一个参数flags,同理我们在编码 设置这个参数就是一个I帧了。
帧的时间戳
每一个帧都可能携带有 2 个时间戳信息,一个是解码时间戳 dts,一个是显示时间戳 pts,解码时间戳告诉我们什么时候需要解码,显示时间戳告诉我们什么时候需要显示,只有在码流中存在 B 帧的情况下,这两个时间戳才会不一致。
这些时间戳信息不一定存在于码流中(取决于生产端),如果不存在,则其值为:AV_NOPTS_VALUE
一定要选择正确地方式打印时间戳,时间戳是使用 long long 来表示的,即 int64_t,因此打印的时候,需要使用 “%lld” 来打印, 我们就可以通过这些 log 信息调试一下某一段音视频流的时间戳是否正确,比如是否出现了时间戳的回滚和错乱,则必然会导致播放端出现音视频不同步或者显示异常等情况。