【发布时间】:2020-05-04 14:17:13
【问题描述】:
我循环通过av_read_frame 和avcodec_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 帧的快速方法?
【问题讨论】:
-
我不敢相信您发布的代码有效:如果
i%7 != 0、ret设置为0,pkt.data和pkt.size并没有真正发生任何事情继续...直到i %7 == 0 -
您想阅读 1/7 的帧,但又不想放弃其他 6/7?这是没有意义的。 “不读书”和掉线是一回事,不是吗?
-
@IngoLeonhardt 抱歉,在将代码简化为基本要素时(为了便于阅读),我删除了该功能。它现在已更新为工作必需品。