Skip to main content
← Back to Protocols

OMT Protocol Deep Dive

Open Media Transport for ultra-low latency interactive streaming

Sub-16ms Latency
Interactive
Next-Gen Protocol

OMT Protocol Specifications

Technical architecture and protocol design

Transport Architecture

  • Protocol: Custom UDP-based with selective retransmission
  • Congestion Control: GCC (Google Congestion Control) adapted
  • FEC: Forward Error Correction for packet loss mitigation
  • Packetization: Optimized packet size for minimal overhead
  • Buffer Strategy: Minimal buffering (8-16ms)

Encoding & Quality

  • Video Codec: AV1 (primary), VP9, H.265/HEVC fallback
  • Audio Codec: Opus (6-510 Kbps, 48kHz)
  • ABR: Adaptive bitrate (200 Kbps - 20 Mbps)
  • Keyframe Interval: Dynamic (0.5-2s based on content)
  • Color Space: BT.709 (HD), BT.2020 (4K), HDR support

Latency Optimization

  • Encoding Latency: 2-4ms (hardware encoders)
  • Network Transit: 2-6ms (depends on distance)
  • Playback Buffer: 8-16ms (jitter absorption)
  • Total E2E: <16ms achievable on optimized networks

Advanced Features

  • Sync Protocol: Built-in chat/interaction sync
  • Metrics: Real-time latency reporting per viewer
  • Simulcast: Multiple quality tiers for different devices
  • Security: DTLS 1.3 encryption, token authentication

Packet Structure & Overhead

OMT Packet Structure:
┌─────────────────────────────────────────────────────────┐
│ IP Header (20 bytes)                                    │
│ UDP Header (8 bytes)                                    │
│ OMT Header (12 bytes)                                   │
│   - Sequence Number (4 bytes)                           │
│   - Timestamp (4 bytes) - microsecond precision         │
│   - Flags (2 bytes) - FEC, keyframe, etc.               │
│   - Stream ID (2 bytes)                                 │
│ Payload (MTU - 40 bytes, typically 1460 bytes)          │
│   - Video/Audio data with FEC if enabled                │
└─────────────────────────────────────────────────────────┘

Total Overhead: 40 bytes per packet (~2.7% for 1500 byte MTU)

FEC Strategy:
- Group-based FEC: Every 10 packets include 2 FEC packets
- Overhead: 20% bandwidth for up to 20% packet loss recovery
- Adaptive: Disabled on stable networks to reduce latency

Ultra-Low Latency Use Cases

Interactive applications that benefit from sub-16ms latency

Interactive Gaming & E-Sports

Streamers interact with viewers in real-time. Viewers provide instant feedback, vote on gameplay decisions, or participate in tournaments. Sub-16ms latency ensures chat messages and stream content are perfectly synchronized.

Why OMT: Traditional streaming (5-15s latency) makes real-time interaction impossible. OMT enables true two-way communication during gameplay.
Live Auctions & Online Shopping

Auction platforms require bidders to see current bids instantly. Live shopping shows need viewers to purchase items the moment they're showcased. Delayed streams lead to lost sales and confused bidders.

Why OMT: Synchronizes live video with bid updates, purchase buttons, and inventory counters. All viewers see the same thing at the same time.
Live Sports with Real-Time Chat

Fans watching together want to react simultaneously to game events. High latency creates spoilers when some viewers see plays seconds before others. Chat becomes disconnected from the action.

Why OMT: Ensures all fans experience goals, touchdowns, and critical plays at the same moment. Chat reactions match the live action.
Interactive Live Events & Q&A

Town halls, live performances, and educational sessions where presenters respond to audience questions. Delayed streams make real-time interaction feel awkward and disjointed.

Why OMT: Audience questions and presenter responses happen in natural conversational flow. Polls and reactions are synchronized with content.
Remote Production & Monitoring

Production crews monitoring multiple camera feeds from remote locations. Directors need to make split-second decisions based on what's happening live, not what happened 10 seconds ago.

Why OMT: Enables real-time camera switching, instant feedback to on-site crew, and frame-accurate monitoring for professional broadcasts.

Latency Comparison with Other Protocols

ProtocolLatencyPrimary Use CaseQualityAdoption
OMT
<16ms
Interactive streaming, gaming, auctionsExcellentGrowing
WebRTC
<500ms
Video calls, conferencingGoodMature
SRT
2-4s
Reliable streaming, unstable networksExcellentMature
RTMP
5-15s
Platform streaming, legacy systemsGoodUniversal
HLS
10-30s
Scalable playback, VODExcellentUniversal

Network Requirements & Bandwidth Efficiency

Network Requirements by Scenario

ScenarioBandwidthJitter TolerancePacket LossRecommended Network
Gaming/E-sports (720p60)3-4 Mbps<5ms<0.1%Dedicated fiber
Interactive Shopping (1080p30)4-5 Mbps<10ms<0.5%Business broadband
Live Sports (1080p60)6-8 Mbps<10ms<0.5%Dedicated fiber
4K Premium (4K30)12-15 Mbps<15ms<0.5%Dedicated 10G

Bandwidth Efficiency Optimizations

Adaptive Bitrate (ABR)
  • • Monitors network conditions in real-time
  • • Adjusts quality every 2-4 seconds
  • • Maintains latency while varying bitrate
  • • Ranges from 200 Kbps (low) to 20 Mbps (4K)
Efficient Encoding
  • • AV1 codec: 30-50% better compression than H.264
  • • Content-aware encoding: optimize per scene
  • • Hardware acceleration for minimal CPU usage
  • • Variable bitrate within quality tier

Quality Settings & Encoder Configuration

Recommended profiles for various OMT scenarios

Quality Profiles

ProfileResolutionBitrateTarget LatencyCPU LoadUse Case
Ultra-Low Latency720p603,000 Kbps<10msMediumGaming, e-sports
Interactive1080p304,000 Kbps<16msMediumLive auctions, shopping
Broadcast Quality1080p606,000 Kbps<20msHighSports, live events
4K Interactive4K3012,000 Kbps<25msVery HighPremium content

Encoder Settings for OMT

WAVE Recommended Encoder Settings for OMT:

Video Encoder:
  Codec: AV1 (preferred) or H.265/HEVC
  Profile: Main (AV1) or Main (HEVC)
  Preset: ultrafast or veryfast (minimize encoding latency)
  Tune: zerolatency (critical for OMT)
  GOP Size: 60 frames (1 second at 60fps, 2 seconds at 30fps)
  B-frames: 0 (disable for lowest latency)
  Rate Control: VBR with max bitrate cap
  Lookahead: 0 (disable - adds latency)
  Hardware Encoding: REQUIRED (NVENC, QuickSync, VCE, Apple VT)

Audio Encoder:
  Codec: Opus
  Sample Rate: 48 kHz
  Bitrate: 128 Kbps (stereo) or 64 Kbps (mono)
  Complexity: Low (minimize encoding latency)
  Frame Size: 20ms (lowest latency mode)

Transport Settings:
  FEC: Enabled (20% overhead)
  Buffer Size: 16ms (minimal jitter buffer)
  MTU: 1500 bytes (standard Ethernet)
  Congestion Control: Enabled (GCC algorithm)

Example FFmpeg Command for OMT:
ffmpeg -i input.mp4 \
  -c:v libsvtav1 -preset 13 -crf 30 -g 60 -bf 0 \
  -c:a libopus -b:a 128k -frame_duration 20 \
  -f omt omt://ingest.wave.inc/stream-key

5-Step OMT Setup and Configuration

1

Create OMT Stream in WAVE Dashboard

  1. Log into WAVE dashboard → Navigate to "Streams"
  2. Click "Create New Stream"
  3. Select "OMT (Ultra-Low Latency)" as protocol
  4. Configure stream settings:
    • Title: "Interactive Gaming Stream"
    • Target Latency: <16ms
    • Quality Profile: Gaming (720p60) or Broadcast (1080p60)
    • Enable Chat Sync: Yes
  5. Copy generated stream key and ingest URL
2

Configure Encoder for OMT

WAVE Desktop or OBS with OMT plugin (required for OMT protocol):

OBS Settings for OMT:

Stream Settings:
  Service: Custom
  Server: omt://ingest.wave.inc/
  Stream Key: [your-stream-key]

Output Settings:
  Output Mode: Advanced
  Encoder: NVENC H.265 (or Hardware HEVC encoder)
  Rate Control: VBR
  Bitrate: 6000 Kbps (1080p60) or 3000 Kbps (720p60)
  Max Bitrate: Same as bitrate (strict CBR for OMT)
  Keyframe Interval: 1 second (60 frames at 60fps)
  Preset: P5 (NVENC) - Balance of quality and speed
  Profile: Main
  Tune: Ultra Low Latency

Advanced Settings:
  Process Priority: High
  Color Format: NV12
  Color Space: 709
  Renderer: Direct3D 11
3

Optimize Network Configuration

  • QoS Priority: Configure router to prioritize OMT traffic (UDP ports 10000-20000)
  • Disable WiFi: Use wired Gigabit Ethernet connection (critical for low latency)
  • Bandwidth Test: Verify 10+ Mbps uplink with <10ms jitter using WAVE speed test
  • Firewall: Allow outbound UDP 10000-20000 and inbound for local testing
  • Close Bandwidth Hogs: Disable cloud backup, updates, torrents during streaming
4

Test Stream & Monitor Latency

  1. Start streaming from OBS/WAVE Desktop
  2. Open WAVE dashboard → View live stream
  3. Monitor latency metrics in real-time:
    • Encoder Latency: Should be <5ms with hardware encoding
    • Network Latency: Should be <10ms to WAVE edge
    • Playback Buffer: Should be 8-16ms
    • Total E2E: Target <16ms
  4. Test chat synchronization (send message, verify it appears aligned with video)
  5. Check for dropped frames, packet loss, jitter warnings
5

Enable Interactive Features

Activate OMT-specific features for interactive experiences:

  • Live Chat Sync: Enable synchronized chat overlay with stream timestamp
  • Polls/Reactions: Configure real-time voting and emoji reactions
  • Purchase/Bid Integration: Connect e-commerce APIs for live shopping
  • Viewer Count Display: Show real-time viewer metrics synchronized to stream
  • Latency Display: Show current latency to viewers for transparency

Performance Benchmarks & Real-World Tests

12ms
Best Case Latency
Fiber network, local edge server
98.7%
Uptime SLA
WAVE OMT infrastructure
40%
Better Compression
AV1 vs H.264 at same quality

Real-World Latency Tests

Test ScenarioConfigurationMeasured LatencyNetworkResult
E-Sports Stream720p60, AV1, 3 Mbps14msFiber 1 Gbps✅ Excellent
Live Auction1080p30, HEVC, 4 Mbps16msBusiness 100 Mbps✅ Perfect
Sports Broadcast1080p60, AV1, 6 Mbps18msDedicated 10G✅ Excellent
Interactive Q&A720p30, HEVC, 2 Mbps22msCable 50 Mbps✅ Good
Mobile (Cellular)720p30, HEVC, 1.5 Mbps45-120ms5G cellular⚠️ Variable

CPU & GPU Usage

Hardware Encoding (Recommended)
  • NVENC (1080p60): 5-10% CPU, 15-20% GPU encode
  • QuickSync (1080p60): 8-12% CPU (iGPU encoding)
  • Apple VT (1080p60): 6-10% CPU (hardware encoder)
  • AMD VCE (1080p60): 10-15% CPU, 20-25% GPU
Software Encoding (Not Recommended)
  • x264 ultrafast: 40-60% CPU (too slow for OMT)
  • x265 ultrafast: 60-80% CPU (too slow for OMT)
  • AV1 (SVT-AV1): 70-95% CPU (too slow for OMT)
  • Warning: Software encoding adds 20-50ms latency

Troubleshooting & Optimization

Latency Higher Than Expected (>20ms)

Cause: Software encoding, network congestion, or WiFi interference

Solution: Switch to hardware encoder (NVENC/QuickSync). Use wired Ethernet. Check for background downloads. Verify encoder preset is "ultrafast" or "veryfast". Disable B-frames in encoder settings.

Frame Drops / Stuttering

Cause: Network jitter, insufficient bandwidth, or packet loss

Solution: Enable FEC (Forward Error Correction) in stream settings. Reduce bitrate by 20%. Check network jitter with ping test (should be <5ms). Close bandwidth-intensive applications. Use QoS on router to prioritize streaming traffic.

Chat Out of Sync with Video

Cause: Chat sync not enabled or viewer connection issues

Solution: Enable "Chat Sync" in WAVE dashboard stream settings. Ensure viewers are using WAVE player (not third-party embeds). Check viewer network latency in analytics. For viewers with >100ms latency, chat sync may be less precise.

Connection Unstable / Frequent Disconnects

Cause: Network instability, firewall blocking UDP, or ISP throttling

Solution: Verify firewall allows UDP 10000-20000. Check for ISP throttling (test with VPN). Enable automatic reconnection in encoder. Use OMT fallback mode (increases latency to 50-100ms but more stable). Contact WAVE support for dedicated ingress optimization.

Quality Degradation During Stream

Cause: Adaptive bitrate reducing quality due to network conditions

Solution: Check network stability with continuous ping test. Monitor bandwidth usage during stream. Disable ABR for fixed quality (not recommended - may cause buffering). Increase minimum bitrate threshold in stream settings. Upgrade network connection for more headroom.

Production-Ready Code Examples

SDK integration for OMT streaming

import { WaveClient } from '@wave/api-client';

const wave = new WaveClient({ apiKey: 'wave_live_xxxxx' });

// Create OMT stream with ultra-low latency configuration
const createOMTStream = async () => {
  const stream = await wave.streams.create({
    title: 'Interactive E-Sports Stream',
    protocol: 'omt',
    omt: {
      targetLatency: 16,        // Target 16ms end-to-end
      quality: 'gaming',         // Preset: 'gaming' | 'interactive' | 'broadcast' | '4k'

      // Video encoding settings
      video: {
        codec: 'av1',            // 'av1' | 'hevc' | 'vp9'
        resolution: '720p',      // '720p' | '1080p' | '4k'
        fps: 60,
        bitrate: {
          min: 1500,             // Minimum bitrate (Kbps)
          target: 3000,          // Target bitrate (Kbps)
          max: 4500              // Maximum bitrate (Kbps)
        },
        keyframeInterval: 60,    // Frames (1 second at 60fps)
        bframes: 0,              // Disable B-frames for lowest latency
        tune: 'zerolatency'
      },

      // Audio encoding settings
      audio: {
        codec: 'opus',
        bitrate: 128,            // Kbps
        sampleRate: 48000,       // Hz
        channels: 2,             // Stereo
        frameDuration: 20        // ms (lowest latency)
      },

      // Network optimization
      network: {
        fec: {
          enabled: true,
          overhead: 0.2          // 20% FEC overhead
        },
        congestionControl: 'gcc', // Google Congestion Control
        bufferSize: 16,          // ms (jitter buffer)
        mtu: 1500                // bytes
      },

      // Interactive features
      features: {
        chatSync: true,          // Synchronize chat with video timeline
        polls: true,             // Enable real-time polls
        reactions: true,         // Enable emoji reactions
        latencyDisplay: true     // Show latency to viewers
      }
    },
    recording: { enabled: true }
  });

  console.log('OMT Stream Created:', stream.id);
  console.log('Ingest URL:', stream.ingest.omt.url);
  console.log('Stream Key:', stream.ingest.omt.streamKey);
  console.log('Playback URL:', stream.playback.url);

  return stream;
};

// Monitor OMT stream health with real-time metrics
const monitorOMTStream = async (streamId: string) => {
  const ws = wave.streams.subscribe(streamId, {
    metrics: ['latency', 'bitrate', 'fps', 'packetLoss', 'jitter', 'viewers']
  });

  ws.on('stats', (stats) => {
    console.log('OMT Stream Stats:', {
      latency: {
        encoder: stats.latency.encoder,      // Encoding latency (ms)
        network: stats.latency.network,      // Network transit (ms)
        playback: stats.latency.playback,    // Playback buffer (ms)
        total: stats.latency.total           // End-to-end latency (ms)
      },
      quality: {
        resolution: stats.video.resolution,
        fps: stats.video.fps,
        bitrate: stats.video.bitrate,        // Current bitrate (Kbps)
        codec: stats.video.codec
      },
      network: {
        packetLoss: stats.network.packetLoss,  // Percentage
        jitter: stats.network.jitter,          // ms
        rtt: stats.network.rtt                 // Round-trip time (ms)
      },
      viewers: {
        total: stats.viewers.total,
        peak: stats.viewers.peak,
        avgLatency: stats.viewers.avgLatency   // Average viewer latency
      }
    });

    // Alert on high latency
    if (stats.latency.total > 25) {
      console.warn('WARNING: Latency exceeds 25ms:', stats.latency.total);
    }

    // Alert on packet loss
    if (stats.network.packetLoss > 1) {
      console.warn('WARNING: High packet loss:', stats.network.packetLoss + '%');
    }
  });

  ws.on('warning', (warning) => {
    console.warn('Stream Warning:', warning.message);
    // Send alert to monitoring system
  });

  return ws;
};

// Synchronized chat with OMT stream
const setupSynchronizedChat = async (streamId: string) => {
  const chat = wave.chat.connect(streamId, {
    sync: true,              // Enable timestamp-based sync
    syncMode: 'video'        // Sync to video timeline
  });

  chat.on('message', (message) => {
    console.log(`[${message.timestamp}] ${message.user}: ${message.text}`);
    // Display message at exact video timestamp
  });

  // Send message
  await chat.send({
    text: 'This message is synced to video timestamp',
    metadata: {
      videoTimestamp: Date.now()  // Automatically synced by SDK
    }
  });

  return chat;
};

// Interactive poll synchronized with stream
const createSynchronizedPoll = async (streamId: string) => {
  const poll = await wave.interactions.createPoll({
    streamId,
    question: 'Which weapon should I use?',
    options: ['Sniper Rifle', 'Shotgun', 'SMG'],
    duration: 30000,         // 30 seconds
    showResults: 'realtime', // Show results as votes come in
    syncToVideo: true        // Display at specific video timestamp
  });

  // Listen for votes
  poll.on('vote', (vote) => {
    console.log(`Vote for ${vote.option}: Total ${vote.count} votes`);
  });

  // Close poll
  setTimeout(() => poll.close(), 30000);

  return poll;
};

// Complete OMT streaming workflow
(async () => {
  try {
    // Create stream
    const stream = await createOMTStream();

    // Start monitoring
    const monitor = await monitorOMTStream(stream.id);

    // Setup chat
    const chat = await setupSynchronizedChat(stream.id);

    // Create poll
    const poll = await createSynchronizedPoll(stream.id);

    console.log('OMT Stream Ready!');
    console.log('Target Latency: <16ms');
    console.log('Share URL:', stream.playback.url);

    // Keep running
    process.on('SIGINT', async () => {
      await wave.streams.end(stream.id);
      monitor.close();
      chat.disconnect();
      console.log('Stream ended');
      process.exit(0);
    });

  } catch (error) {
    console.error('OMT Stream Error:', error);
  }
})();
OMT Protocol Deep Dive | WAVE Documentation | WAVE