gpt4 book ai didi

c++ - 使用 av_read_frame() 获取 2 个连续帧

转载 作者:行者123 更新时间:2023-11-30 16:10:15 28 4
gpt4 key购买 nike

我正在使用 rtmp 和 ffmpeg/libav。我有一个 fps 为 60 fps 的剪辑,由 2 个连续视频帧和 1 个音频帧组成。 2 个连续帧对应于来自 2 个摄像机的左右图像(已同步)。我使用 av_read_frame 来读取帧,然后如果它是视频帧,我使用 avcodec_decode_video2 (我知道它已被弃用,但它仍然有效,我稍后会替换它)。现在,由于我必须将 2 个视频帧并排放置,所以我等到 2 个帧完全读取后,用 OpenCV 将它们放在一起。问题是,我似乎总是只读取左帧,有时会被右帧打断。我搜索了一下这个问题,似乎与解码器的刷新有关。因此,我尝试使用空包或使用 avcodec_flush_buffers 来刷新解码器,但情况更糟糕,我得到了左右图像,但只有几帧。下面是我的代码示例:

bool left = false;
while(true)
{
ret = av_read_frame(fmt_ctx, &pkt);
if(ret < 0)
break
if(pkt.stream_index == video_index)
{
ret = avcodec_decode_video2(video_dec_ctx, frame, &got_frame, &pkt);
if(got_frame)
{
if(!left)
{
//I SAVE THE LEFT FRAME
left = true;
}
else
{
//I PUT THE LEFT AND RIGHT FRAME TOGETHER
left = false;
}
}
}
}

更新

我弄清楚了问题所在:基本上我试图读取的剪辑/流是由 1 个 I 帧和实际上是 I 帧的 P 帧组成,因为每个帧代表左和右。我无法使用 av_read_frame 强制执行任何操作,因此我必须找到解决方法。

最佳答案

我猜测相邻帧(左和右)可能具有相同的 PTS 值。您可以首先缓冲帧,然后根据 PTS 值(查找相同的值)来获取帧,在正确获取帧后,将它们连接起来可能很简单。

希望有帮助。

关于c++ - 使用 av_read_frame() 获取 2 个连续帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58920864/

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