gpt4 book ai didi

c++ - 如何使用 libavcodec 高效地查找和解码第 N 帧?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:29:29 25 4
gpt4 key购买 nike

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

我想找到并解码第 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 帧或 B 帧会怎样?我该如何解码?
  2. 我注意到计算值与 inStream->codec->ticks_per_frame 不同,为什么?他们不应该是一样的吗?有什么区别?

最佳答案

这篇文章很好地解释了这个问题。 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,其中有关每个帧的信息是存在于文件头中。

关于c++ - 如何使用 libavcodec 高效地查找和解码第 N 帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14110149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com