Tenho brincado com o FFMPEG e estou tentando obter uma taxa de bits de streaming o mais constante possível. Examinei a documentação e os exemplos do FFMPEG, mas quando meço a taxa de bits resultante com o wireshark, ainda não obtenho uma taxa de bits constante e vejo picos de taxa de bits periódicos que ultrapassam o parâmetro -maxrate.
Atualmente eu pego o fluxo RTSP de uma câmera IP e depois o transcodifico para um fluxo UDP local usando o seguinte comando (ou variações dele):
ffmpeg -rtsp_transport tcp -i "RTSP_IP" -an -c:v libx264 -x264-params "hal-hrd=cbr:force-cfr1" -b:v 100k -minrate 100k -maxrate 100k -bufsize 150k -threads 1 -flush_packets 0 -f mpegts "udp://@10.100.3.30:5004?packet_size=1316&bitrate=100000"
No exemplo acima, estou buscando uma taxa de bits máxima de 100 Kbps, mas ainda vejo picos de taxa de bits cuja amplitude é afetada pelo parâmetro -bufsize. No entanto, tornar o tamanho do buf muito pequeno faz com que a qualidade da imagem seja reajustada com muita frequência. O gráfico wireshark resultante é:
Três perguntas:
- Há algo que estou fazendo de errado aqui? - Não importa o que eu faça, sempre vejo picos ultrapassando o -maxrate
- Meu entendimento é que o FFMPEG executa um soft-cap na taxa de bits. Isso está correto?
- Como posso conseguir um limite rígido na taxa de bits?
Obrigado por qualquer ajuda que você possa fornecer sobre o assunto. Já faz um tempo que estou batendo a cabeça nesse problema, então vou realmente agradecer!