libavcodec初始化以实现实时回放并在必要时丢帧

问题描述 投票:1回答:1

我有一个与ffmpeg库链接的C ++计算机视觉应用程序,该库提供从视频流到分析例程的帧。这个想法可以提供一个适度的通用视频流标识符,并且视频源将被解压缩,然后逐帧传递到分析例程(运行用户的分析功能)。“中等通用视频标识符”涵盖3个通用视频流类型:磁盘上视频文件的路径,IP视频流(摄像机或视频流服务)以及具有所需格式和速率的USB网络摄像头引脚。

我当前的视频播放器尽可能通用:仅视频,忽略音频和其他流。它具有一个切换案例,用于根据流的源和编解码器检索流的帧速率,该速率用于估计解压缩帧之间的延迟。尝试从流中获取可靠的时间戳时遇到了许多问题,因此我目前忽略了pts和dts。我知道忽略pts / dts对可变帧率流不利。我打算在以后对它们进行特殊处理。播放器当前正在检查最后一个解压缩的帧是否晚于2帧(假设帧速率恒定),如果是,则“丢弃帧”-不会将其传递给用户的分析例程。

本质上,视频播放器的逻辑是确定何时跳过帧(不将其传递给费时的分析例程),以便将分析结果尽可能实时地反馈给视频帧。

我正在寻找示例或讨论,如何使用(大概但不限于)AVDictionary选项初始化和/或维护其AVFormatContext,AVStream和AVCodecContext,以便在libav上执行保持实时所需的丢帧操作库级别,而不是我的视频播放器级别。如果要实现这一点,则需要针对每种流类型和编解码器使用单独的AVDictionaies(或更多),那就也可以。我有兴趣了解这两种方法的优缺点:在播放器级别或libav级别删除帧。

((当某些分析需要每一帧时,禁用丢帧的现有播放器实现就可以了。我怀疑是否可以在libav级别上丢帧,我还将数据包保存到帧解压缩时间,从而减少了处理的比我当前的版本还要多。]

ffmpeg video-streaming libav libavcodec libavformat
1个回答
0
投票

如果我可以在libav级别上丢帧,我也会将数据包保存到帧解压缩时间中

不,除非您愿意将所有帧放置到下一个关键帧,否则不会。在典型的mp4视频上,这可能很容易几秒钟。

您可以跳过色彩空间的转换和调整大小,但通常这些由播放器来处理。

© www.soinside.com 2019 - 2024. All rights reserved.