使用av_read_frame()获得2个连续的帧

问题描述 投票:0回答:1

我正在使用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;
      }
    }
  }
}
c++ c ffmpeg stream streaming
1个回答
0
投票

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

希望有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.