Я экспериментировал с FFMPEG и пытаюсь добиться максимально постоянного потокового битрейта. Я просмотрел документацию и примеры FFMPEG, но когда я измеряю полученный битрейт с помощью Wireshark, я все еще не получаю постоянного битрейта и вижу периодические пики битрейта, которые превышают параметр -maxrate.
В настоящее время я принимаю поток RTSP с IP-камеры, а затем перекодирую его в локальный поток UDP с помощью следующей команды (или ее вариаций):
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"
В приведенном выше примере я стремлюсь к максимальной скорости передачи данных 100 Кбит/с, но я все еще вижу скачки скорости передачи данных, амплитуда которых зависит от параметра -bufsize. Однако, если сделать bufsize слишком маленьким, качество изображения придется перенастраивать слишком часто. Итоговый график Wireshark выглядит так:
Три вопроса:
- Что-то я делаю не так? - Что бы я ни делал, я всегда вижу пики, превышающие -maxrate.
- Насколько я понимаю, FFMPEG выполняет мягкое ограничение скорости передачи данных. Это правильно?
- Как можно добиться жесткого ограничения скорости передачи данных?
Спасибо за любую помощь, которую вы можете оказать по этому вопросу. Я уже некоторое время ломаю голову над этой проблемой, так что я буду очень признателен!