gpt4 book ai didi

c - 有没有更快的方法通过跳帧来抓取帧?

转载 作者:行者123 更新时间:2023-11-30 14:32:28 27 4
gpt4 key购买 nike

我循环通过 av_read_frameavcodec_decode_video2 从 mp4 视频中读取像素数据。

int i = 0;
while (av_read_frame(pFormatCtx, &pkt)>=0) {
AVPacket orig_pkt = pkt;
do {
int ret = 0;
int decoded = pkt.size;
got
if (i%7==0) { // Only process 1/7th of frames
ret = avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &pkt);
if (got_frame) {
// get pixel data
} else {
printf("Error: could not get frame %d", i );
}
}
ret = decoded;
pkt.data += ret;
pkt.size -= ret;
} while (pkt.size > 0);
av_free_packet(&orig_pkt);
}

这是一个 35FPS 的视频,但我只需要读取大约 5FPS 的像素数据。

i%7==0 条件导致超过 1/7 的帧被丢弃。删除该行会导致所有帧都缓慢处理,并且不会丢失任何帧。

有没有一种快速方法可以只读取 1/7 帧?

最佳答案

这取决于视频。大多数视频被压缩成“图片组”,其中第一张图片是关键帧,其余的是预测帧。关键帧可以自行解码,但只有当所有先前的预测帧(包括前一个关键帧)都被解码时,预测帧才能被解码(实际上比这更复杂一些,但目前已经足够好了)。如果您正在解码的视频都是关键帧(例如 MJPEG),是的,您可以跳过您想要的任何帧。如果不是,并且您跳过一帧,则必须跳过所有帧直到下一个关键帧。关键帧通常约为 2 到 10 秒(假设 30fps 视频为 60-300 帧)。但可能或多或少。

您可以通过检查AV_PKT_FLAG_KEY & pkt.flags来检查帧是否为关键帧

你可以这样做:

if (AV_PKT_FLAG_KEY &pkt.flags) {
ret = avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &pkt);
...
}

但是您无法决定解码哪些帧,而是由视频文件本身决定。

关于c - 有没有更快的方法通过跳帧来抓取帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59791652/

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