C 是否有一种通过跳过帧来获取帧的更快方法?

C 是否有一种通过跳过帧来获取帧的更快方法?,c,ffmpeg,mp4,h.264,C,Ffmpeg,Mp4,H.264,Im循环通过av\u读取\u帧和avcodec\u解码\u视频2从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

Im循环通过
av\u读取\u帧
avcodec\u解码\u视频2
从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秒(60-300帧,假设视频为30fps)。但这可能或多或少

通过检查
AV\u PKT\u FLAG\u KEY&PKT.flags

你可以做:

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

但是你不能决定解码什么帧,视频文件本身就是这样。

我不敢相信你发布的代码能起作用:if
I%7!=0
ret
设置为
0
,则
pkt.data
pkt.size
不会发生任何实际变化,循环继续。。。直到
i%7==0
您想读取1/7帧,但不想删除其他6/7帧?这毫无意义。“不阅读”与删除是同一回事,不是吗?@IngoLeonhardt抱歉,在将代码剥离到基本内容(为了更易于阅读)的同时,我删除了该功能。现在,它已更新为“工作要素”。