Perfect quality for every viewer on every network
The complete adaptive streaming pipeline
Your stream is ingested at source quality
Transcoded to multiple quality levels
Segmented into HLS/DASH chunks
Player selects optimal quality
ABR uses manifest files (HLS .m3u8 or DASH .mpd) that list all available quality levels. The player continuously monitors conditions and requests the appropriate segments.
#EXTM3U #EXT-X-STREAM-INF:BANDWIDTH=15000000,RESOLUTION=3840x2160,CODECS="avc1.640033" 4k/playlist.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=4500000,RESOLUTION=1920x1080,CODECS="avc1.64001f" 1080p/playlist.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720,CODECS="avc1.64001f" 720p/playlist.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=700000,RESOLUTION=640x360,CODECS="avc1.42001e" 360p/playlist.m3u8
Complete SDK examples for all platforms
import { WaveClient } from '@wave/sdk';
const wave = new WaveClient({
apiKey: process.env.WAVE_API_KEY,
});
// Create ABR-enabled stream with full configuration
async function createABRStream() {
const stream = await wave.streams.create({
title: 'Adaptive Quality Stream',
protocol: 'webrtc',
// ABR Configuration
abr: {
enabled: true,
ladder: 'default', // 'default' | 'dense' | 'sparse' | 'mobile-first' | 'broadcast'
// Custom profiles (optional - overrides ladder preset)
profiles: [
{ name: '4K', width: 3840, height: 2160, bitrate: 15000, fps: 60, codec: 'h265' },
{ name: '1080p', width: 1920, height: 1080, bitrate: 4500, fps: 30, codec: 'h264' },
{ name: '720p', width: 1280, height: 720, bitrate: 2500, fps: 30, codec: 'h264' },
{ name: '480p', width: 854, height: 480, bitrate: 1200, fps: 30, codec: 'h264' },
{ name: '360p', width: 640, height: 360, bitrate: 700, fps: 30, codec: 'h264' },
{ name: '240p', width: 426, height: 240, bitrate: 400, fps: 24, codec: 'h264' },
],
// Player adaptation settings
adaptation: {
strategy: 'hybrid', // 'bandwidth' | 'buffer' | 'hybrid' | 'quality-first'
switchUpThreshold: 1.5, // Switch up when bandwidth is 1.5x current bitrate
switchDownThreshold: 0.8, // Switch down when bandwidth drops to 0.8x
minSwitchInterval: 5000, // Minimum 5 seconds between quality switches
startQuality: 'auto', // 'auto' | 'lowest' | 'highest' | specific profile
maxQuality: '4K', // Maximum quality to use (for cost control)
bufferTarget: 20000, // Target buffer in milliseconds
lowBufferThreshold: 5000, // Trigger down-switch when buffer falls below 5s
},
// Encoding settings
encoding: {
preset: 'balanced', // 'fast' | 'balanced' | 'quality'
keyframeInterval: 2, // Keyframe every 2 seconds (for switching)
segmentDuration: 4, // HLS segment duration in seconds
perTitleEncoding: true, // Optimize bitrate per content type
},
},
});
console.log('Master Playlist:', stream.hlsUrl);
console.log('DASH Manifest:', stream.dashUrl);
console.log('Profiles:', stream.abr.profiles.map(p => p.name).join(', '));
return stream;
}Complete reference of quality profiles and specifications
| Profile | Resolution | Bitrate | FPS | Codec | Tier |
|---|---|---|---|---|---|
| 4K UHD | 3840x2160 | 15,000 kbps | 60 | H.265 | Premium |
| 1440p QHD | 2560x1440 | 8,000 kbps | 60 | H.264 | Premium |
| 1080p FHD | 1920x1080 | 4,500 kbps | 30 | H.264 | Standard |
| 720p HD | 1280x720 | 2,500 kbps | 30 | H.264 | Standard |
| 480p SD | 854x480 | 1,200 kbps | 30 | H.264 | Mobile |
| 360p | 640x360 | 700 kbps | 30 | H.264 | Mobile |
| 240p | 426x240 | 400 kbps | 24 | H.264 | Low |
| 144p | 256x144 | 200 kbps | 15 | H.264 | Ultra-Low |
Choose the right quality ladder for your use case
Balanced ladder for most use cases
More quality steps for smoother adaptation
Fewer profiles for lower encoding costs
Optimized for mobile devices and data savings
Professional broadcast-grade encoding
How the player selects quality levels
Selects quality based on estimated network bandwidth
Mobile networks, Variable bandwidth
Selects quality based on playback buffer level
Stable connections, VOD content
Combines bandwidth and buffer metrics for optimal quality
Most use cases, Live streaming
Prioritizes highest quality even at risk of rebuffering
Premium subscriptions, High-bandwidth users
Optimize bitrate allocation based on content complexity
Per-title encoding analyzes your content and optimizes the bitrate ladder for each video. Simple content (talking heads, slides) needs less bitrate than complex content (sports, action).
Track quality distribution and viewer experience
Understand the cost impact of different ladder configurations
| Profiles | Cost/Hour | Cost/Month (720h) | Storage/Hour |
|---|---|---|---|
| 4 profiles | $0.02 | $14.40 | ~2 GB/hour |
| 6 profiles | $0.03 | $21.60 | ~3 GB/hour |
| 9 profiles | $0.05 | $36.00 | ~5 GB/hour |
| 12 profiles | $0.08 | $57.60 | ~8 GB/hour |
Optimize ABR for reliability and viewer experience
Common ABR issues and diagnostic commands
How leading companies optimize with WAVE ABR
WAVE's per-title encoding reduced our bandwidth costs by 43% while maintaining identical VMAF scores. The dynamic ladder optimization automatically adjusts to content complexity - talking heads get lower bitrates, action scenes get higher. Our viewers see perfect quality while we save millions annually.
For live gaming content, quality switches need to be imperceptible. WAVE's hybrid adaptation algorithm reduced visible switches by 78% while keeping rebuffer rates under 0.3%. Our streamers and viewers both noticed the improvement immediately.
Our classes need to work flawlessly on bikes, treads, mobile apps, and TVs. WAVE's device-specific ABR profiles ensure every platform gets optimized quality. We went from 15% mobile completion issues to under 2% - our members can work out without interruption.
Tailor quality selection for different devices