使用 ffmpeg 设置 PAT/PMT 周期

使用 ffmpeg 设置 PAT/PMT 周期

根据 ffmpeg 文档使用 -pat_period 设置最大时间很快PAT/PMT 表之间。

我想将该值设置为 100ms,但是我没有得到所需的值。

我正在使用的代码:

-map 0:0 -map 0:1 -c:a ac3 -ab 384k -ar 48000 -ac 6 -async 1 -streamid 1:0x102 -streamid 0:0x101 -c:v libx264 -pat_period 100 -crf 20 -b:v 7800k -minrate 7800k -maxrate 7800k -muxrate 8250K -bufsize 700k -r 25 -force_fps -s 1920x1080 -aspect 16:9 -profile:v high422 -level 40 -partitions default -b-pyramid 1 -weightb 0 -8x8dct 0 -fast-pskip 0 -rc-lookahead 40 -x264-params force-cfr=1 -trellis 1 -me_method hex -sws_flags fast_bilinear -sc_threshold 40 -keyint_min 25  -g 50 -bf 3 -qmin 3 -qmax 51 -f mpegts  -copyts -threads 8 -f mpegts -sn

我尝试了不同的值,而不是使用 100(结果为 78),而没有得到 100。

有人能给我指出正确的方向吗?我想我漏掉了什么,或者我没有正确转换值。

答案1

Ffmpegmpegts多路复用器默认 PAT/PMT 表之间的时间间隔为 100 毫秒,但您可以使用 明确设置它-pat_period 0.1

任何超过的值0.4都可能导致分析仪抛出优先级 1 PAT 错误,定义如下欧洲电信标准协会 TR 101 290,第 17 页。

答案2

由于声誉问题,我无法发表评论,这就是我将其作为答案添加到您的回复的原因。很高兴您找到了解决方案,但我可以看到命令行中的某些参数不是必需的,例如,您不需要参数“-f mpegts”,如下所示:

-f mpegts -threads 8 -f mpegts -sn -mpegts_start_pid 0x150

应该足够了

-threads 8 -sn -f mpegts -mpegts_start_pid 0x150

这个 -mpegts_start_pid 0x150 应该没有任何区别,我猜它可能是您可能需要研究的 PMT pid 值。另请检查我已经更新了我的发现。

答案3

我也尝试更改 -pat_period。但是到目前为止我还没有成功。但我想分享我的研究。我已检查了 mpegtsenc.c 的源文件,以下代码解释了它的工作原理,如下所示:请注意,这是对代码的参考。

if (ts->mux_rate > 1) {
   service->pcr_packet_period = (ts->mux_rate * PCR_RETRANS_TIME)
               (TS_PACKET_SIZE * 8 * 1000);
   ts->sdt_packet_period      = (ts->mux_rate * SDT_RETRANS_TIME)
               (TS_PACKET_SIZE * 8 * 1000);
   ts->pat_packet_period      = (ts->mux_rate * PAT_RETRANS_TIME)
               (TS_PACKET_SIZE * 8 * 1000);

定义值如下:

#define SDT_RETRANS_TIME 500
#define PAT_RETRANS_TIME 100
#define PCR_RETRANS_TIME 20
#define TS_PACKET_SIZE 188

如果您计算这些值,您将根据表达式获得正确的 pcr 值。在此示例中,我为 -pat_period、-sdt_period、-pcr_period 和 muxrate 6500000 提供了 7 个值。您会获得 PCR 的值,但无论您尝试 SDT 或 PAT 的值是什么,它都会在每 2147483647 个 pkt 之后传输一次。

PCR 示例

6500000 * 7 / 188 * 8 * 1000 = 45500000 / 1504000 = 30.25265957446809

如您所见,ffmpeg 的调试行显示每 30 个数据包后都会传输 PCR。但 SDT/PAT 并非如此。

> [mpegts @ 0x22862c0] muxrate 6500000, pcr every 30 pkts, sdt every
> 2147483647, pat/pmt every 2147483647 pkts

对于 PAT / SDT,我们应该有相似的值,但实际值与预期值不同。我仍在努力。想分享我的发现。如果专家能提供帮助,我将不胜感激。

另外想知道您是否可以建议如何实现 PAT 78?您如何验证每 78 个 pkts 之后都是如此?

解决方法是:

1) 您可以在源代码中定义所需的值,编译并继续测试,直到获得结果。 2) 增加多路复用率,除非您获得所需的结果,但这会消耗大量带宽。增加多路复用率将减少 PAT 传输后的数据包数量

更新: 我的错,它对 TS 没有任何影响,实际上它增加 PAT/PMT 持续时间到 483 毫秒,峰值超过 500 毫秒并在分析仪上产生警报。

答案4

使用-mpegts_start_pid 0x15而不是-pat_period给出 100ms PAT/PMT 周期。

我最终用于高清文件的代码已被一家大型电信公司接受(其规范要求 100ms),如下所示:

-map 0:0 -map 0:1 -c:a ac3 -ab 384k -ac 6 -ar 48000 -metadata:s:a:0 language=deu -strict -2 -streamid 1:0x102 -streamid 0:0x101 -c:v libx264 -b:v 7800k -minrate 7800k -maxrate 7800k -bufsize 700k -muxrate 8250k -r 25 -s 1920x1080 -aspect 16:9 -profile:v high -level 4.0 -pix_fmt yuv420p -x264-params force-cfr=1 -trellis 1 -me_method hex -flags +cgop -sws_flags fast_bilinear -sc_threshold 40 -keyint_min 25 -g 50 -bf 3 -qmin 3 -qmax 51 -f mpegts -threads 8 -f mpegts -sn -mpegts_start_pid 0x150

我希望它能对其他人有所帮助。

相关内容