NVIDIA H265 Encoding Configurations: Difference between revisions
(Created page with "= Introduction = This wiki is intended to show some common configurations used to tune the H265 encoding that NVIDIA provides using the V4L2 controls. You can visit the [http...") |
No edit summary |
||
Line 214: | Line 214: | ||
[[File:Example encoder streaming latency.png|800px|thumb|center| | [[File:Example encoder streaming latency.png|800px|thumb|center|Example of encoder latency from video source to UDP sink]] | ||
[[Category:Jetson]] [[Category:JetsonTX2]] [[Category:JetsonXavierNX | [[Category:Jetson]] [[Category:JetsonTX2]] [[Category:JetsonXavierNX]] |
Revision as of 14:04, 14 September 2021
Introduction
This wiki is intended to show some common configurations used to tune the H265 encoding that NVIDIA provides using the V4L2 controls. You can visit the official documentation for more details.
H265 Controls Mapping
NVIDIA provides different ways to control and use the H265 encoder through V4l2 controls. Some of them are the NvVideoEncoder class from the Video API, and the Gstreamer element. To show how to modify the different H265 controls we have created the following table containing a mapping between these two options and the actual control.
V4L2 Control | Description | Gstreamer nvv4l2h265enc Property | NvVideoEncoder Class Method (Video API) |
---|---|---|---|
Profile | H265 encoder profile | profile | setProfile |
I-frame Interval or GOP Size | Interval between two I-frames, in number of frames | iframeinterval | setIFrameInterval |
IDR Interval | Encoder IDR frame interval | idrinterval | setIDRInterval |
Number of B-frames | Number of B-frames between P-frames | num-B-frames | setNumBFrames |
Bitrate | Bits per second of the encoded stream | bitrate | setBitrate |
Maximum Bitrate | Peak bitrate of the encoded stream in bits per second | peak-bitrate | setPeakBitrate |
Rate Mode | Type of rate control (constant or variable) | control-rate | setRateControlMode |
Intra Refresh Slice Interval | Slice intra refresh interval, in number of slices | SliceIntraRefreshInterval | setSliceIntrarefresh |
Quantization Parameters | Quantization parameter for constant QP mode | quant-i*, quant-p*, quant-b* | setConstantQp |
Quantization Range | Minimum and maximum for each frame quantization parameter | qp-range | setQpRange |
Virtual Buffer Size | Virtual buffer size in bits | vbv-size | setVirtualBufferSize |
Number of Reference Frames | Maximum number of reference frames that can be used | num-Ref-Frames | setNumReferenceFrames |
Insert SPS and PPS at IDR Interval | Configuration to enable/disable inserting SPS and PPS explicitly at IDR interval | insert-sps-pps | setInsertSpsPpsAtIdrEnabled |
Insert VUI | Enable or disable inserting video usability information in SPS. | insert-vui | setInsertVuiEnabled |
Insert AUD | Enable or disable inserting access unit delimiter. | insert-aud | setInsertAudEnabled |
Enable Motion Vector Metadata | Enable or disable encoder motion vector reporting | EnableMVBufferMeta | enableMotionVectorReporting |
Hardware Preset | Hardware encoder preset type | preset-level | setHWPresetType |
Temporal Trade-off Level | Encoder level to drop frames while encoding | N/A | setTemporalTradeoff |
Slice Length | Slice length either in terms of MBs or bits | N/A | setSliceLength |
Reconstructed CBR | Configure Reconstructed CRC for a session | N/A | enableReconCRC |
ROI Encoding | Configure ROI encoding for a session | N/A | enableROI |
ROI Params | Configuration to encode a particular region of a frame in high quality | N/A | setROIParams |
Metadata | Get encoder output metadata | N/A | getMetadata |
Motion Vector Metadata | Get encoder output motion vector metadata | N/A | getMotionVectors |
Input Metadata | Provide input metadata for the encoder buffer | N/A | SetInputMetaParams |
External RPS | Configure encoder for external RPS control | N/A | enableExternalRPS |
External Rate Control | Configure encoder for external rate control | N/A | enableExternalRC |
Extended Color Format | Enable or disable setting for extended color format | N/A | setExtendedColorFormat |
All I-frame Encoding | Enable or disable all I-Frame encoding | N/A | setAlliFramesEncode |
All I-frame Encoding | Enable or disable all I-Frame encoding | N/A | setAlliFramesEncode |
H265 Level | Set the H265 encoding level | N/A | setLevel |
Slice Level Encode | Enable or disable slice level encoding | N/A | setSliceLevelEncode |
Notes:
- Require ratecontrol-enable=0 and preset-level=0 properties.
Common Rate Control Modes
The rate control option shown above only allows the constant or variable bitrate options, however with certain combinations of properties other modes can be achieved, for example:
Mode | Required Properties |
---|---|
Constant QP | ratecontrol-enable=0, preset-level=0, quant-i-frames, quant-p-frames, quant-b-frames |
CBR Single-Pass | control-rate=constant_bitrate, bitrate |
VBR | control-rate=variable_bitrate, bitrate, peak-bitrate |
VBR with Minimum QP | control-rate=variable_bitrate, ratecontrol-enable=1, bitrate, peak-bitrate, qp-range |
Examples
Camera Capture + UDP Streaming
For this example we are using OV5693 Xavier AGX camera at 120 FPS, however we want our stream to be at 60 FPS, so we use a videorate to drop frames.
IP=127.0.0.1 PORT=12345 gst-launch-1.0 nvarguscamerasrc ! "video/x-raw(memory:NVMM),width=1280,height=720,framerate=120/1" ! videorate max-rate=60 drop-only=true ! queue max-size-buffers=3 leaky=downstream ! nvv4l2h265enc bitrate=2000000 iframeinterval=300 vbv-size=33333 insert-sps-pps=true control-rate=constant_bitrate profile=Main num-B-Frames=0 ratecontrol-enable=true preset-level=UltraFastPreset EnableTwopassCBR=false maxperf-enable=true ! h265parse ! mpegtsmux alignment=7 ! queue ! udpsink clients="${IP}:${PORT}"
This is an optimized pipeline with a maximum latency (from nvarguscamerasrc to udpsink) of 8 ms, as shown in the following diagram created with GstShark.