【问题标题】:Get 2 consecutives frames with av_read_frame()使用 av_read_frame() 获取 2 个连续帧
【发布时间】:2019-11-18 18:34:53
【问题描述】:

我正在使用 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 帧和 P 帧组成的,它们实际上是 I 帧,因为每个帧代表左和右。 我无法用av_read_frame 强制执行任何操作,所以我必须找到解决方法。

【问题讨论】:

    标签: c++ c ffmpeg stream streaming


    【解决方案1】:

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

    希望对您有所帮助。

    【讨论】:

    • 你好,不是连续2帧的pts时间不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2014-10-20
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多