VP8/VP9 Encoders
This guide provides comprehensive documentation for implementing VP8 and VP9 video encoding in VisioForge .NET SDKs. The SDK offers multiple encoder implementations to suit different needs and platforms.
Available Encoders
The SDK provides several encoder implementations:
Windows-only Engines
- Software VP8 and VP9 encoders (configured via WebMOutput class)
Cross-platform X-engines
- VP8 software encoder (VP8EncoderSettings)
- VP9 software encoder (VP9EncoderSettings)
- Intel GPU VP9 encoder (QSVVP9EncoderSettings) - supports integrated GPUs
Bitrate Control Modes
All VPx encoders support multiple bitrate control strategies. The appropriate mode depends on your specific use case:
1. Constant Bitrate (CBR)
CBR maintains a steady bitrate throughout the encoding process. This mode is ideal for:
- Live streaming with bandwidth constraints
- Scenarios requiring predictable file sizes
- Real-time communication applications
Here's how to implement CBR with different encoder types:
Using WebMOutput
(Windows-only):
var webmOutput = new WebMOutput();
webmOutput.Video_EndUsage = VP8EndUsageMode.CBR;
webmOutput.Video_Encoder = WebMVideoEncoder.VP8;
webmOutput.Video_Bitrate = 2000; // 2 Mbps
Using VP8EncoderSettings
:
var vp8 = new VP8EncoderSettings();
vp8.RateControl = VPXRateControl.CBR;
vp8.TargetBitrate = 2000; // 2 Mbps
Using VP9EncoderSettings
:
var vp9 = new VP9EncoderSettings();
vp9.RateControl = VPXRateControl.CBR;
vp9.TargetBitrate = 2000; // 2 Mbps
Using QSVVP9EncoderSettings
:
var vp9qsv = new QSVVP9EncoderSettings();
vp9qsv.RateControl = QSVVP9EncRateControl.CBR;
vp9qsv.Bitrate = 2000; // 2 Mbps
2. Variable Bitrate (VBR)
VBR adjusts the bitrate based on content complexity. This mode is recommended for:
- Non-live video encoding
- Scenarios where visual quality is more important than consistent file size
- Content with varying complexity
Implementation examples:
Using WebMOutput
(Windows-only):
var webmOutput = new WebMOutput();
webmOutput.Video_EndUsage = VP8EndUsageMode.VBR;
webmOutput.Video_Encoder = WebMVideoEncoder.VP8;
webmOutput.Video_Bitrate = 3000; // 3 Mbps target
Using VP8EncoderSettings
:
var vp8 = new VP8EncoderSettings();
vp8.RateControl = VPXRateControl.VBR;
vp8.TargetBitrate = 3000;
Using VP9EncoderSettings
:
var vp9 = new VP9EncoderSettings();
vp9.RateControl = VPXRateControl.VBR;
vp9.TargetBitrate = 3000;
Using QSVVP9EncoderSettings
:
var vp9qsv = new QSVVP9EncoderSettings();
vp9qsv.RateControl = QSVVP9EncRateControl.VBR;
vp9qsv.Bitrate = 3000;
3. Quality-based Modes
These modes focus on maintaining consistent quality rather than targeting specific bitrates:
Constant Quality (CQ)
Available for VP8 and VP9 software encoders:
Using VP8EncoderSettings
.
var vp8 = new VP8EncoderSettings();
vp8.RateControl = VPXRateControl.CQ;
vp8.CQLevel = 20; // Quality level (0-63, lower is better)
Using VP9EncoderSettings
.
var vp9 = new VP9EncoderSettings();
vp9.RateControl = VPXRateControl.CQ;
vp9.CQLevel = 20;
Intel QSV Quality Modes
For Intel QSV VP9 encoder, two quality-focused modes are available:
- ICQ (Intelligent Constant Quality):
var vp9qsv = new QSVVP9EncoderSettings();
vp9qsv.RateControl = QSVVP9EncRateControl.ICQ;
vp9qsv.ICQQuality = 25; // 20-27 recommended for balanced quality
- CQP (Constant Quantization Parameter):
var vp9qsv = new QSVVP9EncoderSettings();
vp9qsv.RateControl = QSVVP9EncRateControl.CQP;
vp9qsv.QPI = 26; // I-frame QP
vp9qsv.QPP = 28; // P-frame QP
Advanced Features
VP9-specific Features
VP9 encoders support additional features for optimization:
- Adaptive Quantization:
var vp9 = new VP9EncoderSettings();
vp9.AQMode = VPXAdaptiveQuantizationMode.Variance; // Enable variance-based AQ
- Parallel Processing:
var vp9 = new VP9EncoderSettings();
vp9.FrameParallelDecoding = true; // Enable parallel frame processing
vp9.RowMultithread = true; // Enable row-based multithreading
vp9.TileColumns = 6; // Set number of tile columns (log2)
vp9.TileRows = 0; // Set number of tile rows (log2)
Error Resilience
Both VP8 and VP9 support error resilience features for robust streaming:
Using WebMOutput
(Windows-only):
var webmOutput = new WebMOutput();
webmOutput.Video_ErrorResilient = true; // Enable error resilience
Using VP8EncoderSettings
or VP9EncoderSettings
:
var vpx = new VP8EncoderSettings(); // or VP9EncoderSettings
vpx.ErrorResilient = VPXErrorResilientFlags.Default | VPXErrorResilientFlags.Partitions;
Performance Optimization
Several settings are available for performance tuning:
var vpx = new VP8EncoderSettings(); // or VP9EncoderSettings
vpx.CPUUsed = 0; // -16 to 16, higher values trade quality for speed
vpx.NumOfThreads = 4; // Number of encoding threads
vpx.TokenPartitions = VPXTokenPartitions.Eight; // Parallel token processing
Best Practices
-
Rate Control Selection:
- Use CBR for live streaming and real-time communication
- Use VBR for offline encoding where quality is priority
- Use quality-based modes for highest possible quality regardless of bitrate
-
Performance Optimization:
- Adjust
CPUUsed
based on your quality/speed requirements - Enable multithreading for better performance on multi-core systems
- Use tile-based parallelism in VP9 for better hardware utilization
- Adjust
-
Error Resilience:
- Enable error resilience for streaming over unreliable networks
- Use appropriate token partitioning for better error recovery
-
Quality Optimization:
- Use adaptive quantization in VP9 for better quality distribution
- Consider two-pass encoding for better quality in non-real-time scenarios
- Adjust quantizer ranges based on content type and quality requirements