Adapting H264 encoding rate

Guillaume Denis via gstreamer-devel <[email protected]>
Newsgroups gmane.comp.video.gstreamer.devel
Message-ID <CAB0ELa-GkZp0J_JWP1H53EcnyG9xXuU+fwebytDNR4aOXfZzDw@mail.gmail.com>
Hello,

We are using GStreamer within a WebRTC app (the WebRTC part is done with
https://github.com/pion/webrtc) where we estimate the best target bitrate
depending on network conditions (congestion control).

I was wondering if anyone has experience about the best way to control
encoders (x264enc and nvcodec' nvh264enc) in particular:

   - when we update the target bitrate: should it be done at a slow pace?
   (or: is updating every second could be useless or even harmful in any way)
   - can it have an impact on keyframes (other than their quality)?
   - are there other encoders' properties worth controlling?

Just in case anyone is interested, below is a typical pipeline we use.

Thanks,
Guillaume

## Pipeline with RTP in/out (appsrc/appsink)
## and two filesinks (one for the in/dry stream, one after applying a video
FX, here facedetect)
## we force streams to a 800x600 resolution not to crash muxers with
changing resolutions

appsrc name=video_src is-live=true format=GST_FORMAT_TIME
min-latency=33333333
appsink name=video_sink qos=true
matroskamux name=dry_recorder ! filesink location=data/dry.mkv
matroskamux name=wet_recorder ! filesink location=data/wet.mkv

video_src. !
application/x-rtp,encoding-name=H264 !
rtpjitterbuffer name=video_buffer do-lost=1
add-reference-timestamp-meta=true latency=200 !
rtph264depay wait-for-keyframe=true !
h264parse !
nvh264sldec min-force-key-unit-interval=3000000000
discard-corrupted-frames=true qos=true !
cudaupload !
cudaconvertscale !
cudadownload !
videorate !
video/x-raw, framerate=30/1, width=800, height=600, format=I420,
colorimetry=bt601, chroma-site=jpeg, pixel-aspect-ratio=1/1 !

tee name=tee_video_in !
queue !
nvh264enc name=video_encoder_dry rc-mode=3 preset=4 gop-size=15
zerolatency=true b-adapt=0 bframes=0 rc-lookahead=0
min-force-key-unit-interval=3000000000 qos=true ! video/x-h264,
profile=constrained-baseline !
h264parse !
dry_recorder.

tee_video_in. !
queue !
videoconvert !
facedetect !
queue !
cudaupload !
cudaconvertscale !
cudadownload !
video/x-raw, format=I420, colorimetry=bt601, chroma-site=jpeg,
pixel-aspect-ratio=1/1 !
nvh264enc name=video_encoder_wet rc-mode=3 preset=4 gop-size=15
zerolatency=true b-adapt=0 bframes=0 rc-lookahead=0
min-force-key-unit-interval=3000000000 qos=true !
video/x-h264, profile=constrained-baseline !
h264parse !

tee name=tee_video_out !
queue !
wet_recorder.

tee_video_out. !
queue !
rtph264pay config-interval=-1 min-ptime=30000000 !
video_sink.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.