视频帧的排列顺序一般是I、B、B、P、B、B、P、B、B……I、B、B、P……
如果时间戳对应的帧为P帧或者B帧是不能直接获取当前的视频帧的,所以我们的基本思路是:
1,seek到前面最近的一个I帧;
2,解码到离所给时间戳最近的视频帧,返回;
假设所给的时间戳单位为ms,我们需要将它转换为ffmpeg内部的时间戳:
seek前面最近的I帧,ffmpeg是有提供seek接口的:
适用于时间戳的就只有两个:
AVSEEK_FLAG_BACKWARD:后面最近的I帧,好像不太符合。
AVSEEK_FLAG_ANY:任意帧,简直完美,然而实际结果来看,或者跟AVSEEK_FLAG_BACKWARD结果一致,或者获取的帧是花掉的。
没有其他选项了,怎么办,或许可以换一个思路,先找到前面最近的I帧之前的时间戳,然后使用这个时间戳调用AVSEEK_FLAG_BACKWARD,不就seek到前面最近的I帧了吗。
这里获取的为前一个I帧之前两帧的时间戳,之后:
这时候再做解码,找到最近的I帧,就可以得到准确的时间戳对应的视频帧了。