里把VM PE GTS的母性 - handle loop/discontinuity

libav MPEGTS demuxing - handle loop/discontinuity

我正在编写一个 video/audio 播放器,它使用 libav/ffmpeg 通过 UDP 对 MPEGTS 流进行解复用和解码。我正在处理的一个问题是,有时流会循环播放,而当它循环播放时,我的播放器就会出现故障。

问题是一旦流循环,新数据包就会有很大的不同 dts/pts。我的播放器依赖 pts 进行视频-音频同步,因此我能够正确处理 pts 很重要。

每当服务器循环流时,它都会发送一个不连续标志,我可以确认 libav mpegts demuxer 已正确接收到该标志(我深入研究了代码并检查了调试日志)。但是,在我看来,分路器对不连续标志的作用不大。换句话说,从用户的角度来看,除了 dts/pts.

中的戏剧性跳跃外,我无法判断存在间断。

有没有一种方法可以可靠地告诉我存在中断,以便我可以重新计算我的时间戳并继续顺利播放?

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

https://github.com/mmoanis/mpegts_demux

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

确实,由 libav 解复用的数据包不包含任何关于发生中断的具体信息。但是,如果出现不连续性,则意味着 2 个数据包之间的 dts/pts 会突然发生变化。

换句话说,不连续意味着内容发生了变化。因为它改变了,时间戳将非常不同。

时间戳只能通过两种方式更改:

  1. 会比上一个低,连续流是不允许的
  2. 会比上一个大很多

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

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