x264enc bitrate adjustment latency
Nicolas Dufresne
nicolas at ndufresne.ca
Wed May 11 18:18:55 UTC 2022
Le mercredi 11 mai 2022 à 14:43 +0100, Samuel Hurst via gstreamer-devel a
écrit :
> Hello,
>
> I've been experimenting with congestion control for RTP, and as part of
> this I have a use case where the "bitrate" property on the encoder in a
> sending pipeline is changed dynamically in response to network conditions.
>
> I've been using the x264enc element in GStreamer as my encoder for this,
> and I've been observing that x264enc seems to take a while to react to
> the "bitrate" property being changed before that actually takes a second
> or two before the encoder actually reacts to a requested reduction in
> bit rate. This is then causing further congestion on the network that
> I'm testing on.
>
> I've taken the congestion controller out of the loop and written a small
> application which adjusts the bitrate property on the x264enc element as
> a stand alone tool [1], with effectively the following pipeline:
>
> videotestsrc horizontal-speed=10 ! \
> video/x-raw,format=NV12,width=1920,height=1080,framerate=25/1 ! \
> x264enc bitrate=10000 speed-preset=ultrafast \
> tune=zerolatency+fastdecode ! \
> queue ! \
This queue will fill in, causing high latency as you observe. Sets is-live=1 on
videotestsrc, configure that queue to be smaller.
> avdec_h264 ! \
> queue ! \
> fpsdisplaysink
>
> I've then been graphing the output to understand the time between the
> bitrate property being set, and the new rate taking effect. I've been
> using the gst-shark [2] bitrate and buffer tracers to track the average
> bit rate out of the x264enc element as well as the individual sizes of
> each encoded frame.
>
> The graph linked in [3] shows the requested bit rate in gold, the
> average bit rate as seen by gst-shark in red and the size of each
> encoded frame in blue. In the example, I've reduced the key-int-max
> parameter to 25, but regardless of the value of this parameter I still
> see the same 1-2 second delay in any attempt by the encoder to conform
> to the bit rate limitation.
>
> Is there any way of reducing the latency between setting the bitrate
> parameter to it actually taking effect? I've so far tried adjusting the
> key-int-max, qp-max, qp-step, rc-lookahead and vbv-buf-capacity
> attributes but nothing seems to improve it. I've tried with GStreamer
> 1.16.3 and 1.20.2. I'm using libx264 version 163.
>
> Thanks in advance,
> -Sam
>
> [1]: https://www.dropbox.com/s/bofyyfcee2m5olz/gst-launch-h264.c?dl=0
> [2]: https://developer.ridgerun.com/wiki/index.php?title=GstShark
> [3]:
> https://www.dropbox.com/s/d9sxya0mr00j5np/x264-buffer-bitrate-test-idr-25-10mb-to-8mb.png?dl=0
More information about the gstreamer-devel
mailing list