3

请,这不是类似帖子的重复!

我想找到并解码第 N 帧,例如第 7 帧。

据我了解,使用time_base我可以计算每帧有多少滴答声,然后将其乘以 7,我们将得到第 7 帧的位置。计算我所做的刻度

AVStream inStream = getStreamFromAVFormatContext();

int fps = inStream->r_frame_rate.num;
AVRational timeBase = inStream->time_base;

int ticks_per_frame = (1/fps) / timeBase;
int _7thFramePos = ticks_per_frame * 7;
  1. 我是否正确计算了第 7 帧的位置?如果我这样做了,那么我就去那个框架av_seek_frame(pFormatCtx, -1, _7thFramePos, AVSEEK_FLAG_ANY),对吧?如果第 7 帧是 P-Frame 或 B-Frame 会发生什么,我如何解码它?
  2. 我注意到计算的值与 不同inStream->codec->ticks_per_frame,为什么?他们不应该是一样的吗?有什么不同?
4

1 回答 1

1

这篇文章很好地解释了这个问题。 http://www.hackerfactor.com/blog/index.php?/archives/307-Picture-Go-Back.html

[1] 对 AVStream 结构的评论清楚地提到“r_frame_rate”是一个猜测,可能不准确,因为即使我的帧速率为(比如说)25fps,就 base_time 而言,我每秒可能有 24 或 26 帧.

[2] 要找到您需要从一开始就解码帧并保留一个计数器的确切帧号,但这非常低效,这可以针对某些文件格式(如 MP4)进行优化,其中有关每个帧的信息都存在于文件中-标题。

于 2013-01-01T13:21:30.120 回答