使用av_read_frame()获取2个连续帧
Get 2 consecutives frames with av_read_frame()
我正在使用rtmp和ffmpeg/libav。我有一个每秒60帧的剪辑,它由2个连续的视频帧和1个音频帧组成。2个连续帧对应于来自2个相机的左图像和右图像toke(已经同步(。我使用av_read_frame
来读取帧,然后如果它是视频帧,我使用avcodec_decode_video2
(我知道它不推荐使用,但它仍然有效,我稍后会替换它(。现在,由于我必须将这两个视频帧并排放置,所以我等待这两个帧被完全读取,然后将它们与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
强制执行任何操作,所以我必须找到一个变通方法。
我猜相邻的帧(左和右(可能具有相同的PTS值。您可以先对帧进行缓冲,然后根据PTS值进行提取(寻找相同的值(。在正确提取帧之后,将它们连接起来可能很简单。
希望能有所帮助。
相关文章:
- 最多获取2个对象
- 在c++中获取两个大int,并将它们存储在数组中
- 获取 2 个数字之间的差异百分比
- 如何在我的项目中从 CMAKE 中的同一项目获取多个库
- 获取第一个模板参数的可靠方法
- 如何获取两个 std::map 的公钥?
- 在 2D 矢量中获取多个输入时出现问题
- 如何获取两个时间点之间的时间
- 查询事件日志.如何查询才能单独获取第一个和最后一个事件?
- 使用av_read_frame()获取2个连续帧
- C++获取两个分隔符之间的字符串并替换它
- 获取两个不同模板的产品类型
- 正则表达式 获取两个换行符之间的文本
- 通过具有嵌套类的工厂类获取多个变异类模板参数包
- 有没有更简单的方法可以从用户那里获取三个数字并按升序打印它们?
- 如何按z顺序获取第二个活动窗口?
- 获取两个最大值的索引
- 从单个标志C++获取多个参数
- 获取两个无符号整数 C++ 乘积的高 32 位的有效方法
- C++ std::队列推送弹出两个不同的对象获取第一个对象