【问题标题】:libav MPEGTS demuxing - handle loop/discontinuitylibav MPEGTS 解复用 - 处理循环/不连续性
【发布时间】:2021-11-14 05:48:11
【问题描述】:

我正在编写一个视频/音频播放器,它使用 libav/ffmpeg 通过 UDP 对 MPEGTS 流进行解复用和解码。我正在处理的一个问题是,有时流正在循环播放,当它循环播放时,我的播放器会崩溃。

问题在于,一旦流循环,新数据包的 dts/pts 就会大不相同。我的播放器依赖 pts 进行视频 - 音频同步,所以我可以正确处理 pts 很重要。

每当服务器循环流时,它都会发送一个不连续标志,我可以确认它被 libav mpegts demuxer 正确接收(我在代码中做了一些挖掘并检查了调试日志)。但是,在我看来,分路器对不连续标志的作用不大。换句话说,从用户的角度来看,除了 dts/pts 的急剧跳跃之外,我无法判断存在不连续性。

有没有一种方法可以可靠地判断存在不连续性,以便我可以重新计算时间戳并继续顺利播放?

【问题讨论】:

    标签: ffmpeg video-streaming libav mpeg2-ts


    【解决方案1】:

    最终我想出了一个解决方案。不确定这是处理这个问题的最佳方法,但它对我有用。

    确实,libav 解复用的数据包不包含任何有关发生不连续性的特定信息。但是,如果发生不连续性,则意味着这两个数据包之间的 dts/pts 将发生突然变化。

    换句话说,不连续意味着内容发生了变化。既然它改变了,时间戳就会有很大的不同。

    时间戳只能以两种方式改变:

    1. 它会低于上一个,这在连续流中是不允许的
    2. 它会比前一个大得多

    案例 1. 非常简单。如果您选择足够高的阈值,则案例 2. 有效。我选了1分钟。因此,如果我收到一个数据包,并且它与前一个数据包之间的时间戳差异超过 1 分钟,我认为这是一个不连续性。

    此决策过程基于“时间戳”,但我所说的时间戳是什么?数据包包含 2 个时间戳 - dts 和 pts。但是,似乎 pts 通常是无序的。但是 dts 总是在增加,所以我的逻辑基于 dts。

    【讨论】:

      【解决方案2】:

      我在使用 libav 的 TS demuxer 时遇到了类似的问题并放弃了使用它。相反,我发现这个项目可以让您更好地控制 demux 过程。

      https://github.com/mmoanis/mpegts_demux

      【讨论】:

      • 请不要只链接到图书馆。相反,演示如何该库可用于解决当前问题。否则,您很可能只是将一个问题换成另一个问题。您可以编辑答案以包含显示如何处理循环不连续性的代码吗?此外,您链接到的库似乎已被废弃,并且多年未更新,因此我不确定开发人员是否愿意依赖它。
      猜你喜欢
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      • 2019-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 2015-07-17
      相关资源
      最近更新 更多