Установите период PAT / PMT с помощью ffmpeg

3465
elbatron

Согласно документации 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.

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

1

3 ответа на вопрос

1
Sherry

Я также пытаюсь изменить -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. Вы получаете значение для PCR, но любое значение, которое вы пытаетесь использовать для 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 мс и генерирует тревогу на анализаторе.

Спасибо, что поделились своими выводами. Я использую анализатор транспортного потока MPEG-2 (Win) для вычисления фактических вхождений (или, точнее, расстояния между 2) в данном файле. elbatron 7 лет назад 0
0
elbatron

Использование -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 

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

0
Sherry

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

Вы правы, -fpegts не является необходимым. Обратите внимание, что bufsize, muxrate, CBR битрейт для видео и аудио строго определены (наряду со многими другими аспектами) в моем случае, поэтому я не мог играть с ними. Использование -pat_period не имеет никакого значения. (Я получил 78 за 2-минутный тестовый файл), при добавлении -mpegts_start_pid 0x150 были получены необходимые 100 мс PAT / PMT. elbatron 7 лет назад 0
@elbatron Вы устали от `-mpegts_flags` с` resend_headers` или `pat_pmt_at_frames` Sherry 7 лет назад 0
Нет, на самом деле, как только я получил 100 или около 100 PAT / PMT, мои файлы были приняты, и я закодировал и передал все фильмы. Я не беспокоился о проблеме с тех пор. elbatron 7 лет назад 0

Похожие вопросы