我有一个C++计算机视觉应用程序连接到ffmpeg库,它提供从视频流到分析例程的帧。这种思想可以提供一个中等通用的视频流标识符,该视频源将被解压缩并将帧一帧一帧地传递到分析例程(这将运行用户的分析功能)。“中等通用视频标识符”涵盖3种一般视频流类型:磁盘上视频文件的路径、IP视频流(摄像机或视频流服务)和具有所需格式和速率的USB网络摄像头引脚。
我现在的视频播放器是尽可能通用的:只播放视频,忽略音频和其他流。它具有用于根据流的源和编解码器检索流的帧速率的开关箱,用于估计解压缩帧之间的延迟。我在试图从流中获得可靠的时间戳时遇到了许多问题,因此我目前忽略了pts和dts。我知道忽略pts/dts对可变帧速率流是不好的。我打算稍后再特地处理他们。播放机目前检查最后解压缩的帧是否超过2帧(假设帧速率恒定),如果是“丢弃帧”,则不会将其传递给用户的分析例程。
从本质上讲,视频播放器的逻辑是决定何时跳过帧(而不是传递给耗时的分析例程),从而尽可能接近实时地提供视频帧。
我正在寻找示例或讨论如何使用(想必但不限于) AVFormatContext、AVStream和AVCodecContext选项来初始化和/或维护它们的AVDictionary选项,以便在libav库级而不是在我的视频播放器级别执行保持实时所必需的帧删除。如果要实现这一点,需要对每种流类型和编解码器分别使用AVDictionaies (或更多),那么就这样吧。我有兴趣了解这两种方法的利弊:在玩家级别或在libav级别下降帧。
(当某些分析需要每个帧时,现有的禁用帧删除的播放器实现是可以的。我怀疑如果我能在libav级别上使帧下降,我也会节省数据包以帧解压缩时间,比我现在的版本更减少处理。)
发布于 2019-10-20 08:33:31
如果我可以在libav级别上进行帧丢弃,我将保存数据包以帧解压缩时间。
不,你不会的,除非你愿意放弃所有的帧直到下一个关键帧。在典型的mp4视频中,这很容易达到几秒钟。
您可以跳过颜色空间转换和调整大小,但这些往往是由播放器处理。
https://stackoverflow.com/questions/58469017
复制相似问题