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

标签 c++ ffmpeg video-processing libavcodec

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

我想找到并解码第 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/

相关文章:

audio - 在 SOX 中混合带有偏移量的音轨

c# - 多个视频源合二为一

android - 将 phonegap 用于移动视频编辑应用程序

C++ 返回和插入二维数组对象

c++ - 查找集合键和映射键之间的 set_difference

C++ RIFF WAVE 阅读器速度非常慢

ubuntu - 在 Python Ubuntu 服务器上压缩 .mov 视频文件?

c++ - 我如何在 C++11 中实现类似 "interrupted exception"行为的 Java

ffmpeg 在转换视频时写入

build - Dartium 使用 ffmpeg 在 Windows 上构建