1

Согласно документации ffmpeg, использование -pat_period устанавливает максимальное время в секундах между таблицами PAT/PMT.

Я хотел бы установить значение 100 мс, однако я не получаю желаемое значение.

Код, который я использую:

-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.

Может ли кто-нибудь, пожалуйста, указать мне в правильном направлении? Я предполагаю, что я что-то упускаю, или я не правильно конвертирую значения.

3 ответа3

1

Я также пытаюсь изменить -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 в соответствии с выражением. В этом примере я предоставил 7 значений -pat_period, -sdt_period, -pcr_period и muxrate 6500000. Вы получаете значение для ПЦР, но независимо от того, какое значение вы используете для SDT или PAT, оно передается после каждых 2147483647 pkts.

Пример для ПЦР

6500000 * 7/188 * 8 * 1000 = 45500000/1504000 = 30,25265957446809

Как вы можете видеть, строка отладки ffmpeg показывает, что PCR передается через каждые 30 пунктов. Но это не относится к SDT/PAT.

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

Для PAT / SDT у нас должно быть подобное, но фактическое значение отличается от ожидаемого. Я все еще работаю над этим. Мысль поделиться своими выводами. Я буду признателен, если эксперты могут помочь.

Также хотелось бы узнать, можете ли вы подсказать, как вы достигли 78 баллов по ПАТ? Как вы проверили, что это после каждых 78 пунктов?

Обходные пути:

1) Вы можете определить желаемое значение в исходном коде, скомпилировать и продолжать тестирование, пока не получите результат. 2) Увеличьте мукрат, если вы не получите желаемого результата, но это потребляет много трафика. увеличение приведет к снижению количества пакетов, после которых будет передаваться PAT

Обновление: мой плохой, нет, это не имеет никакого значения для TS, на самом деле оно увеличивается до длительности PAT/PMT до 483 мс, которая достигает пика выше 500 мс и генерирует тревогу на анализаторе.

0

Из-за репутации я не могу комментировать, поэтому я добавляю в качестве ответа на ваш ответ. Рад, что вы нашли решение, но я вижу, что некоторые параметры не нужны в вашей командной строке, например, вам не нужно время аргумента '-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 не должен иметь никакого значения. Я думаю, это может быть значение pid PMT, которое вы, возможно, захотите посмотреть. Также проверьте, я обновил свои выводы.

0

Использование -mpegts_start_pid 0x15 вместо -pat_period дает период 100 мс PAT/PMT.

Код, который я использовал для файлов HD, был принят крупной телекоммуникационной компанией (его спецификация запрашивала 100 мс):

-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

Я надеюсь, что это помогает другим.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .