Configure o período PAT / PMT usando ffmpeg

1

De acordo com a documentação do ffmpeg usando %código% define o tempo máximo em segundos entre as tabelas PAT / PMT.

Gostaria de definir o valor para 100 ms, mas não estou obtendo o valor desejado.

O código que estou usando:

-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

Eu experimentei valores diferentes em vez de usar 100 (que resulta 78) sem obter 100.

Alguém poderia me indicar a direção certa? Eu suponho que sinto falta de algo ou não estou convertendo os valores corretamente.

    
por elbatron 08.08.2016 / 17:24

3 respostas

0

Usar -mpegts_start_pid 0x15 em vez de -pat_period fornece 100ms de período PAT / PMT.

O código que acabei usando para arquivos HD foi aceito por uma grande empresa de telecomunicações (sua especificação solicitada 100ms) é a seguinte:

-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

Espero que ajude os outros.

    
por 02.09.2016 / 11:58
1

Eu também estou tentando mudar o -pat_period. No entanto eu tenho sido mal sucedida até agora. Mas gostaria de compartilhar minha pesquisa. Eu verifiquei no arquivo fonte do mpegtsenc.c seguinte código explica como funciona como mostrado abaixo: Observe que isto é para referência ao código.

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);

definir valores são os seguintes:

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

se você calcular os valores, você obterá o valor de pcr correto de acordo com a expressão. Neste exemplo forneceu o valor 7 para -pat_period, -sdt_period, -pcr_period e muxrate 6500000. Você obtém valor para PCR, mas qualquer valor que você tente para SDT ou PAT ele transmite após cada 2147483647 pacotes.

Exemplo de PCR

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

Como você pode ver, a linha de depuração do ffmpeg mostra que o PCR é transmitido após 30 pacotes. Mas este não é o caso da SDT / PAT.

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

Para o PAT / SDT, devemos ter um valor semelhante, mas o valor real é diferente, não o esperado. Eu ainda estou trabalhando nisso. Pensei em compartilhar minhas descobertas. Eu apreciarei se os especialistas puderem ajudar.

Também gostaria de saber se você pode sugerir como você alcançou 78 para o PAT? Como você verificou que é depois de cada 78 pacotes?

A solução alternativa é:

1) Você pode definir o valor desejado no código-fonte, compilar e continuar testando até obter o resultado. 2) Aumente o muxrate a menos que obtenha o resultado desejado, mas isso custa muito consumo de largura de banda. o aumento reduzirá o número de pacotes após o qual o PAT será transmitido

Atualização: Meu mal não, não faz qualquer diferença para TS, na verdade, aumenta para PAT / PMT duração para 483ms que picos acima de 500ms e gera alarme no analisador.

    
por 02.09.2016 / 00:47
0

Devido à reputação, não posso comentar por isso estou adicionando como resposta a sua resposta. Ainda bem que você encontrou a solução, mas eu posso ver que alguns parâmetros não são necessários em sua linha de comando, por exemplo você não precisa do tempo do argumento '-f mpegts' como destacado abaixo:

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

deve ser suficiente assim

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

Este -mpegts_start_pid 0x150 não deve fazer qualquer diferença, eu acho que pode ser PMT pid valor que você pode querer olhar. verifique também que atualizei minhas descobertas.

    
por 02.09.2016 / 14:06