gpt4 book ai didi

ffmpeg - libavcodec 初始化实现实时播放,必要时丢帧

转载 作者:行者123 更新时间:2023-12-04 22:58:56 24 4
gpt4 key购买 nike

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

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

本质上,视频播放器的逻辑是确定何时跳过帧(而不是将它们传递给耗时的分析例程),以便分析尽可能接近实时地提供视频帧。

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

(当某些分析需要每一帧时,禁用丢帧的现有播放器实现很好。我怀疑如果我可以在 libav 级别发生丢帧,我也会将数据包保存到帧解压缩时间,减少处理超过我目前的版本。)

最佳答案

if I can get frame dropping to occur at the libav level, I'll save the packet to frame decompression time as well



不,你不会,除非你愿意放弃所有帧直到下一个关键帧。在典型的 mp4 视频中,这很容易是几秒钟。

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

关于ffmpeg - libavcodec 初始化实现实时播放,必要时丢帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58469017/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com