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