gpt4 book ai didi

c++ - 在循环中使用 av_read_frame 缓存 AVFrame 只会得到最后几帧

转载 作者:行者123 更新时间:2023-11-28 06:38:45 33 4
gpt4 key购买 nike

我正在尝试使用 opengl 逐帧处理视频。我使用 ffmpeg 从视频文件中读取帧。

在开始处理帧之前,我想先读取一些帧并将它们存储在内存中。所以我尝试在 while 循环中使用 av_read_frame,并将帧数据复制到数组中,

但是,当我尝试显示这些帧时,我发现我只得到最后几帧。例如,如果我想缓存 50 帧,但我只能获取最后几帧(第 45 帧到第 50 帧)。

这是我用来缓存帧的代码:

void cacheFrames()
{
AVPacket tempPacket;
av_init_packet(&tempPacket);

int i = 0;
avcodec_flush_buffers(formatContext->streams[streamIndex] ->codec);
codecContext = formatContext->streams[streamIndex] ->codec;

while (av_read_frame(formatContext, &tempPacket) >= 0 && i <NUM_FRAMES)
{
int finished = 0;
if (tempPacket.stream_index == streamIndex)
{
avcodec_decode_video2(
codecContext,
frame,
&finished,
&tempPacket);
if (finished)
{
memcpy(datas[i].datas, frame->data, sizeof(frame->data)); // copy the frame data into an array
i++;
}
}

}
av_free_packet(&tempPacket);
}

那么,我做错了什么?

最佳答案

data 定义为

 uint8_t* AVFrame::data[AV_NUM_DATA_POINTERS]

操作

memcpy(datas[i].datas, frame->data, sizeof(frame->data)); // copy the frame data into an array

会将 AV_NUM_DATA_POINTERS 指针复制到 datas[i].datas 中。这是不正确的,因为您只复制对您自己未分配的帧缓冲区的引用。此外,只有最后一帧缓冲区保证在 avcodec_decode_video2 之后可用。

想保留数据多久就需要clone框架。

AVFrame* framearray[NUM_FRAMES];
...
if (finished)
{
framearray[i] = av_frame_clone(frame);
i++;
}

关于c++ - 在循环中使用 av_read_frame 缓存 AVFrame 只会得到最后几帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26335737/

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