使用av_read_frame()

我正在使用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强制执行任何操作,因此我必须找到一种解决方法。

canyu1 回答:使用av_read_frame()

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

希望有帮助。

本文链接:https://www.f2er.com/3078654.html

大家都在问