Pergunta

Eu tenho uma confusão sobre a hora de h264 RTP pacotes. Eu sei que a taxa de relógio de parede de vídeo é 90kHz que eu definido no SIP SDP. A taxa de quadros do meu codificador não é exatamente 30 FPS, é variável. Ela varia de 15 FPS 30 FPS on the fly. Então, eu não posso usar qualquer timestamp fixo.

Qualquer um poderia me dizer a hora do seguinte pacote codificado.
Após 0 milisecond codificado RTP timestamp = 0 (Deixe o timestamp começando 0)
Após 50 milisecond codificado RTP = timestamp?
Após 40 milisecond codificado RTP timestamp =?
Após 33 milisecond codificado RTP = timestamp?

O que é a fórmula quando a taxa de quadros codificados é variável?

Agradecemos antecipadamente.

Nenhuma solução correta

Outras dicas

Não importa se o vídeo o codificador codifica a 10fps ou 30fps, com a RTP timestamp você diz ao receptor quanto tempo é a pausa entre os dois quadros. Então você determinar que na mosca para cada quadro. Dessa forma, você pode enviar 10 quadros em um segundo (10fps), e no outro segundo você pode enviar 30 frames (30 fps). Você só precisa definir o timestamp RTP corretamente. E se eu conseguir a sua pergunta, você está em dúvida de como fazer isso ...

Deixe o carimbo de hora de início ser 0, você adicionar a hora do relógio de parede em milissegundos multiplicado por 100 para o último timestamp RTP, ou você pode usar qualquer escala de tempo que você deseja. Para fazer a decodificação 10fps decodificador de vídeo a 30 fps, adicione 333000 a RTP timestamp para cada pacote ... mas vamos olhar para o seu exemplo:

Frame #      RTP Time   Time between frames [ms]
[  1]               0   0
[  2]           50000   50
[  3]           90000   40
[  4]          420000   33  

Então, se você definir RTP timestamp como esta (Time in ms * 100000) você vai fazer a carga decodificador e decodificar Quadro 1, e depois carregar e Quadro de decodificação 2, mas vai dormir por 50 ms (diferença de tempo entre o Quadro 1 e Quadro 2) antes de desenha o Quadro 2, e assim por diante ...

E como você pode ver, o decodificador usa RTP timestamps para saber quando para exibir cada um, e ele não mente se o vídeo foi codificado em 30 ou 10 fps.

Além disso, se o vídeo é de 30 fps, isso não significa que, para cada segundo haverá 30 pacotes RTP. Às vezes pode haver mais de 100, então você não pode ter uma fórmula que garante o cálculo RTP timestamp correta.

Eu acho que isso é o que você precisa ... espero que eu ajudei, não faça -1-me se eu não ... =)

Não existe uma fórmula simples para isso.

O instante de amostragem utilizado para o quadro antes da codificação é chamado o PTS (timestamp apresentação). Está fora do escopo do codificador, você deve se lembrar que em seus fluxo de dados quando você capturar os frames.

A partir daí, você tem 2 possibilidades:

  1. O codificador H264 não gera B-frame, então o timestamp RTP deve ser o PTS + deslocamento aleatório (o mesmo para todas as sessões de streaming)
  2. Se o codificador gerar quadros B (ou B-fatias), então a decodificação necessidades de ordem a ser modificada, uma vez B-frame requer o próximo quadro a ser decodificado, por isso deve ser enviado antes.

Neste último caso, os estados RFC6184 que você tem forma múltipla para transmitir as unidades NAL codificados.

A maioria dos softwares de streaming vai usar o modo chamado "Non intercalados", no qual, você deve definir o timestamp RTP para o PTS + offset, mas enviá-los na ordem de decodificação de modo que o timestamp não vai aumentar monotonamente. Isso também significa que o cliente terá de decodificação na ordem recebida e não reordenar os quadros na ordem PTS.

Não estou usando o termo DTS aqui por uma razão, porque você não precisa a decodificação timestamp Para que isso funcione, apenas o fim.

O último modo descrito no RFC6184 é a chamada ordem intercalada, onde pode reordenar as unidades NAL. Nesse caso, você tem que implementar alguma lógica de aplicação para reordenar as unidades, consulte RFC6184 para mais detalhes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top