h264 RTP timestamp
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
A partir daí, você tem 2 possibilidades:
- 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)
- 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.