【问题标题】:Deal with resolution changed while decoding?处理解码时改变的分辨率?
【发布时间】:2020-03-03 16:37:55
【问题描述】:

我正在使用带有 C++ 的 FFMPEG 来读取帧并从 IP 摄像机上的 RTSP 流解码它们。

一切正常,但在解码时,我尝试更改 IP 摄像机上的流分辨率配置(例如:从 1280x720 更改为 1920x1080)。

结果是 av_read_frame() 在 while 循环中仍然读取成功的下一帧(使用新分辨率)而没有错误。所以我无法检测到重新初始化缓冲区或重新连接流以更新其他流信息的更改。

av_read_frame() 将读取一个 AVPacket,如果我可以读取 AVPacket 中的分辨率信息,那么我可以检测到该更改并重新初始化缓冲区。但我在 AVPacket 结构中看不到任何分辨率信息。

有人可以帮助我,如何在读取和解码流时检测分辨率变化?

更新

我正在使用许多编解码器,例如 H264 和 H265/H265+。上述所有 3 个编解码器都发生了这种情况。

在许多情况下,我还会存储 AVPacket 以供以后播放,因此无需解码。我需要立即检测分辨率变化,以便能够正确构建标题信息以存储在 HDD 上。

非常感谢!

【问题讨论】:

    标签: c++ ffmpeg


    【解决方案1】:

    av_read_frame() 无法检测到带内分辨率的变化,因为av_read_frame() 不解析帧,它只从流中读取数据并将其放入缓冲区。您将需要使用比特流解析器,或将帧发送到解码器(如果解码器支持分辨率更改)。但是每个编解码器都不同,所以除非我知道您使用的是什么编解码器,否则我无法为您提供更多信息。

    【讨论】:

    • 您需要开始解析比特流,每个编解码器都会有所不同。你正在进入一个充满痛苦的世界。
    • 另一种方法是重置每个关键帧,但是您遇到了容器问题。
    • 根据您的回答,我有更多信息可以搜索谷歌,我已经解决了这个问题。谢谢你:)
    【解决方案2】:

    我已经解决了这个问题,通过使用av_parser_parse2() 函数从AVPacket 解析Resolution 等信息,并将其与旧值进行比较,以检测更改然后重新连接。

    谢谢大家!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      • 2012-07-01
      • 1970-01-01
      • 2012-01-29
      相关资源
      最近更新 更多