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

Get 2 consecutives frames with av_read_frame()

本文关键字:获取 2个 连续 av read frame 使用      更新时间:2023-10-16

我正在使用rtmp和ffmpeg/libav。我有一个每秒60帧的剪辑,它由2个连续的视频帧和1个音频帧组成。2个连续帧对应于来自2个相机的左图像和右图像toke(已经同步(。我使用av_read_frame来读取帧,然后如果它是视频帧,我使用avcodec_decode_video2(我知道它不推荐使用,但它仍然有效,我稍后会替换它(。现在,由于我必须将这两个视频帧并排放置,所以我等待这两个帧被完全读取,然后将它们与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帧和p帧组成的,这些帧实际上是I帧,因为每一帧都代表左和右。我不能用av_read_frame强制执行任何操作,所以我必须找到一个变通方法。

我猜相邻的帧(左和右(可能具有相同的PTS值。您可以先对帧进行缓冲,然后根据PTS值进行提取(寻找相同的值(。在正确提取帧之后,将它们连接起来可能很简单。

希望能有所帮助。