【发布时间】: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