<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[vidBlogs from Samvyo Tech ]]></title><description><![CDATA[Pioneering seamless and secure real-time communication solutions leveraging cutting-edge WebRTC technology to connect individuals and enterprises globally.]]></description><link>https://www.samvyo.com/blog</link><image><url>https://www.samvyo.com/favicon.png</url><title>vidBlogs from Samvyo Tech </title><link>https://www.samvyo.com/blog</link></image><generator>VidBlogs by Samvyo Tech</generator><lastBuildDate>Mon, 02 Nov 2026 09:34:55 GMT</lastBuildDate><atom:link href="https://www.samvyo.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[On-Premise Secure Video Conferencing, Built in India, Designed for Enterprise: Why Samvyo Is the Answer]]></title><description><![CDATA[Samvyo is India's fully on-premise, secure video conferencing platform built for BFSI, Healthcare, Safety & Security, and Manufacturing. End-to-end encrypted. Fully customizable. No data leaves your network.]]></description><link>https://www.samvyo.com/blog/on-premise-secure-video-conferencing-built-in-india-designed-for-enterprises</link><guid isPermaLink="false">6981ca0f8b45c3f0cd639f74</guid><category><![CDATA[On-Premise Video Conferencing]]></category><category><![CDATA[Banking Communication]]></category><category><![CDATA[Customisable WebRTC Solutions]]></category><category><![CDATA[Healthcare Communication]]></category><category><![CDATA[Made in India Video Conferencing]]></category><dc:creator><![CDATA[Saurav K. Panda]]></dc:creator><pubDate>Tue, 03 Feb 2026 11:11:26 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/02/Samvyo_Blog_Feature_Image-1-.svg" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/02/Samvyo_Blog_Feature_Image-1-.svg" alt="On-Premise Secure Video Conferencing, Built in India, Designed for Enterprise: Why Samvyo Is the Answer"/><p><em>The way enterprises communicate has changed forever. But not every organisation is ready to hand that communication over to the cloud — and they shouldn't have to.</em></p><p>In an era where remote and hybrid work has become the new normal, video conferencing is no longer a convenience — it is a critical business infrastructure. Yet for industries where data sovereignty, regulatory compliance, and operational security are non-negotiable, generic cloud-based platforms simply fall short. What these sectors need is a <strong>fully on-premise, secure video conferencing solution</strong> that doesn't compromise on performance, flexibility, or control.</p><p>That solution is <strong>Samvyo</strong> — a highly customizable, fully made in India video conferencing platform purpose-built for enterprises in regulated and mission-critical industries.</p><p>This blog explores what makes Samvyo different, how it serves specific industry needs, and why organisations — especially government departments — are choosing on-premise video conferencing as the future of secure communication.</p><h2 id="what-is-samvyo-a-platform-built-for-enterprise-demands">What Is Samvyo? A Platform Built for Enterprise Demands</h2><p>Samvyo is an enterprise-grade, real-time communication platform developed by Samvyo Technologies, a CentEdge company. Unlike traditional video conferencing tools that route your data through third-party cloud servers across geographies, Samvyo is designed to run entirely within your organisation's infrastructure — on-premise, on your terms.</p><p>Being a <strong>fully made in India video conferencing solution</strong>, Samvyo is developed with a deep understanding of the compliance landscapes, data governance requirements, and technological challenges unique to Indian enterprises and government bodies. It is not an adaptation of a foreign product — it is an Indian-first, enterprise-first platform.</p><h3 id="core-feature-set-at-a-glance">Core Feature Set at a Glance</h3><p>Samvyo delivers a comprehensive suite of features designed to support seamless, secure, and scalable communication:</p><p><strong>High-Definition Video &amp; Audio</strong> — Crystal-clear, low-latency video conferencing powered by WebRTC, supporting HD and adaptive stream quality based on network conditions.</p><p><strong>End-to-End Encryption (E2EE)</strong> — All communication channels are encrypted end-to-end, ensuring that conversations remain private from the moment they leave the sender to the moment they reach the receiver.</p><p><strong>Screen Sharing &amp; Collaboration Tools</strong> — Real-time screen sharing, virtual whiteboards, and in-meeting file sharing to keep teams productive and connected.</p><p><strong>AI-Powered Transcription &amp; Analytics</strong> — Integrated speech-to-text and meeting analytics capabilities that help organisations capture, review, and act on conversations efficiently.</p><p><strong>Custom Recording &amp; Storage</strong> — Meetings can be recorded and stored on infrastructure of your choosing — on-premise, private cloud, or hybrid — giving you full control over sensitive data.</p><p><strong>Scalable Multi-Party Meetings</strong> — Support for large-scale meetings and webinars, making it suitable for everything from one-on-one check-ins to company-wide town halls.</p><p><strong>Network Resilience &amp; Quality Monitoring</strong> — Built-in call quality monitoring, congestion recovery, and network diagnostics to ensure reliable communication even in challenging network environments.</p><p>For the architecture behind these guarantees, see <a href="https://samvyo.com/blog/enterprise-video-conferencing-architecture-what-actually-runs-behind-the-six-enterprise-checks?ref=samvyo.com">what actually runs behind enterprise-grade video</a>. These features are not bolted on as extras — they are foundational to the Samvyo platform, designed to meet the demands of industries where reliability and security are paramount.</p><h2 id="industry-use-cases-tailored-for-the-sectors-that-cannot-afford-to-compromise">Industry Use Cases: Tailored for the Sectors That Cannot Afford to Compromise</h2><h3 id="banking-financial-services-insurance-bfsi">Banking, Financial Services &amp; Insurance (BFSI)</h3><p>The BFSI sector handles some of the most sensitive data in the economy — customer financial records, transaction histories, loan documentation, and audit trails. Any communication platform used within this industry must meet stringent data protection and regulatory compliance requirements.</p><p>Samvyo enables BFSI organisations to conduct board meetings, client consultations, inter-branch communications, and compliance reviews — all within a secure, on-premise environment. With end-to-end encryption, custom recording storage, and full audit-ready logging, Samvyo ensures that every conversation is not only secure but also traceable and compliant with regulations like RBI guidelines and SEBI directives.</p><h3 id="healthcare">Healthcare</h3><p>In healthcare, communication failures can have life-or-death consequences. From telemedicine consultations to inter-department coordination in hospitals, the need for reliable, secure, and HIPAA-aligned (or equivalent) communication infrastructure is critical.</p><p>Samvyo supports healthcare institutions by providing a secure video conferencing environment for doctor-patient consultations, multi-specialist case discussions, and administrative coordination — without the risk of patient data being stored on unsecured external servers. AI-powered transcription further aids in maintaining accurate consultation records, reducing the burden on medical professionals while improving care continuity.</p><h3 id="automotive">Automotive</h3><p>The automotive industry is rapidly evolving — from traditional manufacturing to electric vehicles, autonomous driving, and connected car technologies. Collaboration across R&amp;D teams, suppliers, and manufacturing units demands a communication platform that is fast, secure, and deeply integrated into the workflow.</p><p>Samvyo supports automotive enterprises by enabling real-time collaboration between design, engineering, and production teams across geographies. With high-definition video and low latency, technical discussions — from prototype reviews to supply chain coordination — happen with the clarity and speed that this fast-moving industry demands. On-premise deployment also ensures that proprietary design and engineering data never leaves the organisation's controlled environment.</p><h3 id="safety-security">Safety &amp; Security</h3><p>For organisations operating in the safety and security domain — whether it is smart surveillance, emergency response coordination, or critical infrastructure monitoring — communication must be instantaneous, secure, and immune to external interference.</p><p>Samvyo's on-premise architecture makes it an ideal fit for safety and security operations centres. Whether it is coordinating a response team during an emergency, conducting inter-agency briefings, or facilitating real-time situational awareness meetings, Samvyo ensures that sensitive operational communications stay within a closed, controlled network. The platform's resilient networking capabilities and quality monitoring features further guarantee that communication remains uninterrupted when it matters most.</p><h3 id="manufacturing">Manufacturing</h3><p>Modern manufacturing is defined by precision, efficiency, and tight coordination between production floors, quality teams, supply chains, and leadership. Communication gaps in this environment can lead to costly downtime, quality issues, and delayed deliverables.</p><p>Samvyo enables manufacturing enterprises to bridge these gaps with seamless video conferencing that works reliably across factory floors, corporate offices, and remote supplier locations. From daily stand-ups on the production line to cross-facility quality reviews and vendor negotiations, Samvyo provides a secure and stable communication channel that keeps operations running smoothly — without dependence on public internet infrastructure.</p><h2 id="on-premise-video-conferencing-for-government-full-control-full-security">On-Premise Video Conferencing for Government: Full Control, Full Security</h2><p>Government departments — at the central, state, and local levels — are among the most demanding users of secure communication technology. Policy discussions, inter-agency coordination, defence briefings, and citizen-facing operations all require communication platforms that meet the highest standards of data sovereignty and security. For these organisations, the cloud is often not an option. What they need is <strong>complete control</strong>.</p><p>Samvyo's on-premise deployment model was designed with exactly this need in mind. Here is why government departments are choosing Samvyo as their secure communication backbone:</p><h3 id="custom-recording-storage">Custom Recording Storage</h3><p>Government bodies often have specific, long-term data retention requirements governed by law and policy. With Samvyo, organisations have full flexibility to define where and how meeting recordings are stored. Recordings can be directed to on-premise storage servers, private data centres, or specific archival systems — all under the full control of the organisation. No data is stored on third-party infrastructure. No data leaves the boundary you define.</p><h3 id="end-to-end-encryption">End-to-End Encryption</h3><p>Every communication on Samvyo is protected by robust end-to-end encryption. This means that audio, video, and data shared during a meeting are encrypted at the source and decrypted only at the intended recipient's end. There is no point in the communication chain — not even the server — where the content is accessible in an unencrypted state. For government departments discussing sensitive policy matters, classified information, or national security issues, this level of encryption is not a feature — it is a requirement.</p><h3 id="fully-operational-on-lan-wan-vpn-%E2%80%94-without-internet">Fully Operational on LAN / WAN / VPN — Without Internet</h3><p>Perhaps the most critical advantage of Samvyo for government use cases is its ability to operate <strong>entirely without internet connectivity</strong>. The platform can be deployed and run on an organisation's internal Local Area Network (LAN), Wide Area Network (WAN), or secure VPN infrastructure. This means that communication happens in a fully closed loop — no packets leave the organisation's network, no external dependencies exist, and no external entity can intercept or monitor the communication.</p><p>This capability is particularly vital for defence establishments, intelligence agencies, critical infrastructure operators, and any government body that requires air-gapped or network-isolated communication. Samvyo transforms video conferencing from a cloud-dependent service into a fully sovereign communication tool — one that the organisation owns, controls, and secures entirely on its own terms.</p><h2 id="a-global-signal-france-leads-the-way-on-digital-sovereignty-in-video-conferencing">A Global Signal: France Leads the Way on Digital Sovereignty in Video Conferencing</h2><p>India is not the only nation recognising the risks of depending on foreign technology for critical communications. In January 2026, France made headlines when it officially announced the phase-out of US-based video conferencing platforms — including Zoom, Microsoft Teams, and Google Meet — across all government departments. The move is part of France's strategy to stop using foreign software vendors, especially those from the United States, and regain full control over critical digital infrastructure.</p><p>The French government is replacing these platforms with <strong>Visio</strong>, a domestically developed video conferencing tool. Visio has been in testing for about a year and already supports around 40,000 users within French government networks. The switch promises significant cost savings — the French government said that switching to Visio could cut licensing costs and save as much as €1 million per year for every 100,000 users.</p><p>France's minister for the civil service, David Amiel, framed the decision plainly: "We cannot risk having our scientific exchanges, our sensitive data, and our strategic innovations exposed to non-European actors."</p><p>This is part of a broader shift toward <a href="https://samvyo.com/blog/communication-sovereignty-building-own-video-conferencing-infrastructure?ref=samvyo.com">communication sovereignty</a> — enterprises and governments choosing to own their own infrastructure rather than rent it.</p><p>This is not an isolated move. The EU is increasingly keen on digital sovereignty, backing a network of European data service providers to reduce dependence on US cloud computing. The message is clear: nations around the world are waking up to the fact that sovereign, homegrown communication infrastructure is no longer optional — it is a strategic imperative.</p><p>For Indian enterprises and government departments, the lesson is directly applicable. If France — a technologically advanced nation — is making this shift, the question for India is not <em>whether</em> to adopt a homegrown video conferencing solution, but <em>which one</em> to trust.</p><h2 id="why-fully-made-in-india-matters">Why "Fully Made in India" Matters</h2><p>In a world where data sovereignty and digital self-reliance are becoming national priorities, the origin and architecture of the technology you adopt matters more than ever. Samvyo is not just made in India — it is designed in India, engineered in India, and optimised for the unique requirements of Indian enterprises and government bodies.</p><p>This means faster support, deeper understanding of local compliance frameworks, alignment with initiatives like Digital India and Make in India, and the confidence that your organisation's communication infrastructure is built on technology you can trust, understand, and govern.</p><h2 id="the-bottom-line">The Bottom Line</h2><p>Choosing a video conferencing platform is not just a technology decision — it is a strategic one. For industries like BFSI, Healthcare, Automotive, Safety &amp; Security, and Manufacturing, and especially for government departments, the right platform must deliver security without compromise, flexibility without complexity, and performance without dependency on external infrastructure.</p><p>Samvyo delivers all of this. It is a <strong>highly customizable video conferencing solution</strong> that adapts to the unique needs of every organisation, a <strong>fully made in India platform</strong> engineered to world-class standards and built to serve enterprises not just across India, but across the globe, and an <strong>on-premise secure video conferencing system</strong> that keeps your data, your conversations, and your operations entirely under your control.</p><p>The future of enterprise communication is secure. It is sovereign. It is built in India — and it is built for the world.</p><h2 id="ready-to-experience-samvyo-lets-talk">Ready to Experience Samvyo? Let's Talk.</h2><p>Whether you are evaluating secure video conferencing options for your enterprise, exploring on-premise deployment for your government department, or simply looking for a highly customizable platform that fits your industry's unique demands — we would love to hear from you.</p><p><strong>📅 Schedule a Demo</strong> Experience Samvyo firsthand with a personalised walkthrough tailored to your industry and requirements. 👉 <a href="https://cal.com/saurav-panda-luodk2/samvyo-demo?ref=samvyo.com" rel="noreferrer">Book a Demo with Our Team</a></p><p><strong>📞 Talk to a Specialist</strong> Have specific questions about on-premise deployment, compliance, or integration? Our team of experts is ready to assist. 👉 <a href="https://samvyo.com/demo?ref=samvyo.com" rel="noreferrer">Schedule a Consultation</a></p><p><strong>📧 Get in Touch</strong> Prefer to start with an email? Reach out to our enterprise solutions team directly. 👉 <a href="https://samvyo.com/contact?ref=samvyo.com" rel="noreferrer">Contact Us</a></p><p><em>Samvyo — Secure. Sovereign. Built in India. For India and the World.</em></p>]]></content:encoded></item><item><title><![CDATA[Revolutionizing Real-Time Communication: Samvyo v3.0 Launches with Three Game-Changing Solutions]]></title><description><![CDATA[Discover how Samvyo's unified platform combines video conferencing, AI-powered contact centers, and developer SDKs to transform business communication. Learn about our three game-changing solutions launching in 2026.]]></description><link>https://www.samvyo.com/blog/revolutionizing-real-time-communication-samvyo-v3-0-launches-with-three-game-changing-solutions</link><guid isPermaLink="false">6857d8bb2016a5f94cddc247</guid><dc:creator><![CDATA[Saurav K. Panda]]></dc:creator><pubDate>Mon, 23 Jun 2025 13:19:36 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1588196749597-9ff075ee6b5b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fHZpZGVvJTIwY29uZmVyZW5jZXxlbnwwfHx8fDE3NTA1OTg2NzZ8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1588196749597-9ff075ee6b5b?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fHZpZGVvJTIwY29uZmVyZW5jZXxlbnwwfHx8fDE3NTA1OTg2NzZ8MA&ixlib=rb-4.1.0&q=80&w=2000" alt="Revolutionizing Real-Time Communication: Samvyo v3.0 Launches with Three Game-Changing Solutions"/><p><em>Discover how Samvyo's unified platform combines video conferencing, AI-powered contact centers, and developer SDKs to transform business communication in 2026</em></p><hr><h2 id="table-of-contents">Table of Contents</h2><ol><li><a href="#introduction">Introduction: The Communication Revolution</a></li><li><a href="#samvyo-meet">Samvyo Meet: Beyond Traditional Video Conferencing</a></li><li><a href="#samvyo-meetnow">Samvyo Meetnow: AI-First Contact Center Revolution</a></li><li><a href="#samvyo-sdks">Samvyo Video SDKs: Developer-First Integration Platform</a></li><li><a href="#why-now">Why Now: A Decade of Enterprise Experience</a></li><li><a href="#why-choose-samvyo">Why Choose Samvyo: The Unified Communication Advantage</a></li><li><a href="#getting-started">Getting Started with Samvyo</a></li><li><a href="#future-roadmap">Future Roadmap and AI Integration</a></li><li><a href="#faq">Frequently Asked Questions</a></li></ol><hr><h2 id="introduction-the-communication-revolution-introduction">Introduction: The Communication Revolution {#introduction}</h2><p>The landscape of business communication has fundamentally shifted. What began as a necessity during the global pandemic has evolved into a strategic imperative: organizations need communication solutions that are not just functional, but intelligent, customizable, and seamlessly integrated into their business workflows.</p><p>Today, we're proud to announce <strong>Samvyo v3.0</strong>, a comprehensive real-time communication platform that addresses the three critical gaps in today's market: enterprise-grade video conferencing, AI-powered customer support, and developer-friendly integration tools.</p><p>Unlike fragmented solutions that force businesses to juggle multiple platforms, Samvyo provides a unified ecosystem designed for the modern enterprise. Our platform combines the reliability of enterprise software with the flexibility of open-source solutions and the intelligence of AI-first design.</p><p><strong>Key Statistics:</strong></p><ul><li>78% of businesses use 3+ communication tools daily</li><li>64% report integration challenges between platforms</li><li>89% want AI-powered insights from their communication data</li><li>92% of developers prefer pay-per-use pricing for communication APIs</li></ul><p>Samvyo v3.0 isn't just another communication platform—it's the foundation for intelligent business communication in the AI era.</p><hr><h2 id="samvyo-meet-beyond-traditional-video-conferencing-samvyo-meet">Samvyo Meet: Beyond Traditional Video Conferencing {#samvyo-meet}</h2><h3 id="the-problem-with-current-video-conferencing-solutions">The Problem with Current Video Conferencing Solutions</h3><p>Traditional video conferencing platforms like Zoom, Google Meet, and Microsoft Teams were designed for a pre-AI world. They excel at basic video calls but fall short when businesses need:</p><ul><li><strong>Deep customization</strong> without compromising security</li><li><strong>Advanced analytics</strong> beyond basic attendance tracking</li><li><strong>Seamless integration</strong> with existing business systems</li><li><strong>Flexible pricing</strong> that scales with actual usage</li><li><strong>Enterprise compliance</strong> without enterprise complexity</li></ul><h3 id="samvyo-meet-a-new-paradigm">Samvyo Meet: A New Paradigm</h3><p><strong>Samvyo Meet</strong> redefines video conferencing by combining enterprise reliability with startup agility. Built on our decade of experience in real-time communication, it delivers:</p><h4 id="%F0%9F%8E%AF-enterprise-grade-performance">🎯 <strong>Enterprise-Grade Performance</strong></h4><ul><li><strong>99.9% uptime SLA</strong> with global CDN distribution</li><li><strong>End-to-end encryption</strong> with GDPR, HIPAA, and PCI-DSS compliance</li><li><strong>Unlimited participants</strong> with intelligent load balancing</li><li><strong>4K video quality</strong> with adaptive streaming technology</li><li><strong>Sub-100ms latency</strong> worldwide through our optimized infrastructure</li></ul><h4 id="%F0%9F%94%A7-unprecedented-customization">🔧 <strong>Unprecedented Customization</strong></h4><p>Unlike rigid platforms that offer limited theming options, Samvyo Meet provides:</p><ul><li><strong>White-label solutions</strong> with complete brand customization</li><li><strong>Custom UI/UX</strong> tailored to your workflow requirements</li><li><strong>API-first architecture</strong> enabling deep system integration</li><li><strong>Configurable media flows</strong> for specialized use cases</li><li><strong>Custom analytics dashboards</strong> with business-specific KPIs</li></ul><h4 id="%F0%9F%A4%96-built-in-intelligence">🤖 <strong>Built-in Intelligence</strong></h4><ul><li><strong>Real-time transcription</strong> in 40+ languages</li><li><strong>Automated meeting summaries</strong> with action item extraction</li><li><strong>Participant engagement analytics</strong> including attention tracking</li><li><strong>Voice sentiment analysis</strong> for meeting effectiveness measurement</li><li><strong>Smart scheduling</strong> with calendar integration and conflict resolution</li></ul><h4 id="%F0%9F%92%B0-transparent-pay-per-use-pricing">💰 <strong>Transparent Pay-Per-Use Pricing</strong></h4><ul><li><strong>No per-seat licensing</strong> - pay only for actual usage</li><li><strong>Minute-based billing</strong> starting at $0.01 per participant per minute</li><li><strong>Volume discounts</strong> that scale with your growth</li><li><strong>Predictable costs</strong> with detailed usage analytics</li><li><strong>Free tier</strong> with 100 minutes monthly for small teams</li></ul><h3 id="use-cases-where-samvyo-meet-excels">Use Cases: Where Samvyo Meet Excels</h3><p><strong>🏢 Enterprise Communications</strong></p><ul><li>Board meetings with advanced security requirements</li><li>Global team collaboration with multi-language support</li><li>Client presentations with custom branding</li><li>Training sessions with engagement tracking</li></ul><p><strong>🏥 Healthcare &amp; Telemedicine</strong></p><ul><li>HIPAA-compliant patient consultations</li><li>Medical team collaboration with screen annotation</li><li>Training sessions with recorded playback</li><li>Multi-specialist consultations with seamless handoffs</li></ul><p><strong>🎓 Education &amp; Training</strong></p><ul><li>Interactive classrooms with real-time polls</li><li>Corporate training with completion tracking</li><li>Webinars with custom registration flows</li><li>Student assessment with proctoring capabilities</li></ul><p><strong>⚖️ Legal &amp; Professional Services</strong></p><ul><li>Client consultations with document sharing</li><li>Court proceedings with recording compliance</li><li>Contract negotiations with annotation tools</li><li>Team depositions with multi-party coordination</li></ul><hr><h2 id="samvyo-meetnow-ai-first-contact-center-revolution-samvyo-meetnow">Samvyo Meetnow: AI-First Contact Center Revolution {#samvyo-meetnow}</h2><h3 id="the-contact-center-crisis">The Contact Center Crisis</h3><p>Traditional contact centers are broken. The statistics are alarming:</p><ul><li><strong>Average wait time</strong>: 11 minutes across industries</li><li><strong>First-call resolution</strong>: Only 74% achieve resolution</li><li><strong>Customer satisfaction</strong>: Declining year-over-year</li><li><strong>Agent burnout</strong>: 75% annual turnover rate</li><li><strong>Setup complexity</strong>: 6-12 months for enterprise deployment</li></ul><p>Phone trees, IVR systems, and queue-based support create friction exactly when customers need help most. The result? Frustrated customers, overwhelmed agents, and businesses losing revenue to poor support experiences.</p><h3 id="samvyo-meetnow-the-qr-code-revolution">Samvyo Meetnow: The QR Code Revolution</h3><p><strong>Samvyo Meetnow</strong> eliminates traditional contact center friction through innovative QR code-based video calling. It's not just an evolution—it's a complete reimagining of customer support.</p><h4 id="%F0%9F%9A%80-instant-connection-without-barriers">🚀 <strong>Instant Connection Without Barriers</strong></h4><p><strong>QR Code Magic:</strong></p><ul><li><strong>Scan and connect</strong> in under 3 seconds</li><li><strong>No app downloads</strong> or phone number requirements</li><li><strong>Works anywhere</strong> - websites, mobile apps, physical locations</li><li><strong>Universal compatibility</strong> across all devices and browsers</li><li><strong>Offline resilience</strong> with smart retry mechanisms</li></ul><p><strong>Real-World Implementation:</strong></p><ul><li><strong>eCommerce</strong>: Product consultation directly from product pages</li><li><strong>Retail Stores</strong>: Instant staff assistance via QR codes on shelves</li><li><strong>Hotels</strong>: Concierge services without calling the front desk</li><li><strong>Restaurants</strong>: Table service requests and menu explanations</li><li><strong>Healthcare</strong>: Patient support without waiting rooms</li><li><strong>Financial Services</strong>: Secure account discussions with video verification</li></ul><h4 id="%F0%9F%A4%96-ai-first-human-led-approach">🤖 <strong>AI-First, Human-Led Approach</strong></h4><p>Unlike traditional systems that use AI as an afterthought, Meetnow is designed with AI at its core:</p><p><strong>Pre-Call Intelligence:</strong></p><ul><li><strong>Context gathering</strong> from QR code location and user behavior</li><li><strong>Intent prediction</strong> based on customer journey analysis</li><li><strong>Agent matching</strong> using skill-based routing and availability</li><li><strong>Background research</strong> on customer history and preferences</li><li><strong>Prep briefings</strong> delivered to agents before connection</li></ul><p><strong>During-Call Enhancement:</strong></p><ul><li><strong>Real-time translation</strong> for global customer support</li><li><strong>Sentiment monitoring</strong> with escalation triggers</li><li><strong>Knowledge base integration</strong> with suggested responses</li><li><strong>Screen sharing</strong> and collaborative problem-solving</li><li><strong>Automated note-taking</strong> with CRM integration</li></ul><p><strong>Post-Call Intelligence:</strong></p><ul><li><strong>Automatic call summaries</strong> with resolution tracking</li><li><strong>Follow-up scheduling</strong> based on conversation outcomes</li><li><strong>Satisfaction surveys</strong> with intelligent timing</li><li><strong>Performance analytics</strong> for continuous improvement</li><li><strong>Training insights</strong> for agent development</li></ul><h4 id="%F0%9F%93%8A-analytics-that-drive-business-decisions">📊 <strong>Analytics That Drive Business Decisions</strong></h4><p><strong>Customer Experience Metrics:</strong></p><ul><li><strong>Connection time</strong>: Average time from QR scan to agent connection</li><li><strong>Resolution rate</strong>: First-call resolution tracking with root cause analysis</li><li><strong>Satisfaction scores</strong>: Real-time NPS with sentiment correlation</li><li><strong>Journey mapping</strong>: Visual representation of customer touchpoints</li><li><strong>Conversion tracking</strong>: Support-to-sale conversion analytics</li></ul><p><strong>Operational Efficiency:</strong></p><ul><li><strong>Agent productivity</strong>: Calls per hour with quality maintenance</li><li><strong>Queue optimization</strong>: Dynamic routing based on real-time demand</li><li><strong>Cost per interaction</strong>: ROI measurement across all channels</li><li><strong>Capacity planning</strong>: Predictive staffing based on historical patterns</li><li><strong>Training effectiveness</strong>: Skill development tracking and impact measurement</li></ul><h4 id="%F0%9F%9B%A1%EF%B8%8F-enterprise-security-compliance">🛡️ <strong>Enterprise Security &amp; Compliance</strong></h4><ul><li><strong>End-to-end encryption</strong> for all video communications</li><li><strong>GDPR compliance</strong> with automatic data retention policies</li><li><strong>PCI-DSS certification</strong> for payment-related discussions</li><li><strong>HIPAA compliance</strong> for healthcare customer support</li><li><strong>SOC 2 Type II</strong> certification for enterprise trust</li><li><strong>Custom data residency</strong> options for regulatory requirements</li></ul><h3 id="competitive-advantage-why-meetnow-wins">Competitive Advantage: Why Meetnow Wins</h3><p><strong>🆚 Traditional Contact Centers:</strong></p><ul><li><strong>Setup Time</strong>: Minutes vs. months</li><li><strong>Customer Wait</strong>: Seconds vs. minutes</li><li><strong>Resolution Rate</strong>: 92% vs. 74% industry average</li><li><strong>Agent Satisfaction</strong>: 89% vs. 25% industry retention</li><li><strong>Cost Efficiency</strong>: 60% lower than traditional systems</li></ul><p><strong>🆚 Chat-Only Solutions:</strong></p><ul><li><strong>Communication richness</strong>: Video + voice vs. text only</li><li><strong>Emotional connection</strong>: Face-to-face interaction builds trust</li><li><strong>Problem-solving speed</strong>: Visual demonstration vs. lengthy descriptions</li><li><strong>Verification capability</strong>: Identity confirmation through video</li><li><strong>Resolution complexity</strong>: Handle complex issues that chat cannot</li></ul><hr><h2 id="samvyo-video-sdks-developer-first-integration-platform-samvyo-sdks">Samvyo Video SDKs: Developer-First Integration Platform {#samvyo-sdks}</h2><h3 id="the-developer-integration-challenge">The Developer Integration Challenge</h3><p>Modern applications require real-time communication, but implementing video and voice capabilities has historically been a nightmare:</p><ul><li><strong>Months of development</strong> for basic functionality</li><li><strong>Complex WebRTC management</strong> across browsers and devices</li><li><strong>Scalability concerns</strong> as user base grows</li><li><strong>Security vulnerabilities</strong> in custom implementations</li><li><strong>Maintenance overhead</strong> for ongoing updates</li><li><strong>Cross-platform compatibility</strong> issues</li></ul><h3 id="samvyo-sdks-integration-in-hours-not-months">Samvyo SDKs: Integration in Hours, Not Months</h3><p>Our comprehensive SDK suite transforms video integration from a months-long project into an afternoon's work.</p><h4 id="%F0%9F%93%A6-complete-sdk-ecosystem">📦 <strong>Complete SDK Ecosystem</strong></h4><p><strong>🌐 JavaScript SDK</strong></p><pre><code class="language-javascript">// Initialize Samvyo in 3 lines
import Samvyo from 'samvyo-js-sdk';
const client = new Samvyo.init({ apiKey: 'your-key' });
await client.joinRoom('room-id');
</code></pre><p><strong>Features:</strong></p><ul><li><strong>Vanilla JavaScript</strong> compatibility with any web framework</li><li><strong>TypeScript support</strong> with full type definitions</li><li><strong>Tree-shakable</strong> for optimal bundle sizes</li><li><strong>CDN distribution</strong> for global performance</li><li><strong>Offline support</strong> with intelligent reconnection</li></ul><p><strong>⚛️ React SDK</strong></p><pre><code class="language-jsx">// React components ready out of the box
import { VideoRoom, useParticipants } from 'samvyo-react-sdk';

function MyVideoApp() {
  return (
    &lt;VideoRoom 
      roomId="my-room"
      onJoin={handleJoin}
      customUI={MyCustomControls}
    /&gt;
  );
}
</code></pre><p><strong>Features:</strong></p><ul><li><strong>Pre-built components</strong> for rapid development</li><li><strong>Custom hooks</strong> for state management</li><li><strong>Composition patterns</strong> for flexible UI design</li><li><strong>SSR support</strong> for Next.js applications</li><li><strong>Performance optimized</strong> with React.memo and useMemo</li></ul><p><strong>📱 React Native SDK</strong></p><pre><code class="language-javascript">// Native mobile performance
import { SamvyoCall } from 'samvyo-rn-sdk';

&lt;SamvyoCall
  roomId="mobile-room"
  enableCamera={true}
  enableAudio={true}
  customStyles={mobileStyles}
/&gt;
</code></pre><p><strong>Features:</strong></p><ul><li><strong>Native iOS/Android</strong> modules for optimal performance</li><li><strong>Background calling</strong> with CallKit/ConnectionService integration</li><li><strong>Push notifications</strong> for incoming calls</li><li><strong>Bluetooth device</strong> support for headsets and speakers</li><li><strong>Picture-in-picture</strong> mode for multitasking</li></ul><h4 id="%F0%9F%9A%80-developer-experience-excellence">🚀 <strong>Developer Experience Excellence</strong></h4><p><strong>🔧 Comprehensive Documentation:</strong></p><ul><li><strong>Interactive tutorials</strong> with live code examples</li><li><strong>API reference</strong> with searchable documentation</li><li><strong>Video guides</strong> for complex integration scenarios</li><li><strong>Community examples</strong> across different frameworks</li><li><strong>Migration guides</strong> from other platforms</li></ul><p><strong>🎮 Sandbox Environment:</strong></p><ul><li><strong>Live testing</strong> without affecting production</li><li><strong>Mock scenarios</strong> for edge case testing</li><li><strong>Performance monitoring</strong> during development</li><li><strong>Debug tools</strong> with detailed logging</li><li><strong>Integration testing</strong> with CI/CD pipelines</li></ul><p><strong>🛠️ Developer Tools:</strong></p><ul><li><strong>CLI tools</strong> for project scaffolding and deployment</li><li><strong>Browser extensions</strong> for debugging WebRTC issues</li><li><strong>VS Code extension</strong> with autocomplete and snippets</li><li><strong>Postman collections</strong> for API testing</li><li><strong>Webhook testing</strong> tools for event handling</li></ul><h4 id="%E2%9A%A1-performance-scalability">⚡ <strong>Performance &amp; Scalability</strong></h4><p><strong>Global Infrastructure:</strong></p><ul><li><strong>Edge deployment</strong> across 40+ regions worldwide</li><li><strong>Automatic scaling</strong> based on demand patterns</li><li><strong>Load balancing</strong> with intelligent traffic routing</li><li><strong>CDN optimization</strong> for media delivery</li><li><strong>Redundancy</strong> with 99.99% uptime guarantee</li></ul><p><strong>Optimization Features:</strong></p><ul><li><strong>Adaptive bitrate</strong> streaming based on network conditions</li><li><strong>Bandwidth management</strong> with quality adjustment</li><li><strong>Battery optimization</strong> for mobile devices</li><li><strong>CPU efficiency</strong> with hardware acceleration</li><li><strong>Memory management</strong> with automatic cleanup</li></ul><h4 id="%F0%9F%92%A1-advanced-capabilities">💡 <strong>Advanced Capabilities</strong></h4><p><strong>AI Integration:</strong></p><ul><li><strong>Real-time transcription</strong> APIs with custom vocabulary</li><li><strong>Sentiment analysis</strong> hooks for mood detection</li><li><strong>Noise cancellation</strong> with environmental adaptation</li><li><strong>Voice enhancement</strong> for crystal-clear audio</li><li><strong>Background replacement</strong> with custom scenes</li></ul><p><strong>Custom Media Flows:</strong></p><ul><li><strong>Screen recording</strong> with selective area capture</li><li><strong>Virtual backgrounds</strong> with green screen effects</li><li><strong>Audio mixing</strong> for multiple input sources</li><li><strong>Video filters</strong> and real-time effects</li><li><strong>Broadcasting</strong> to social media platforms</li></ul><h3 id="use-cases-sdk-integration-success-stories">Use Cases: SDK Integration Success Stories</h3><p><strong>🛒 eCommerce Platforms</strong></p><ul><li><strong>Product consultation</strong> with live video shopping</li><li><strong>Customer support</strong> integration within checkout flows</li><li><strong>Virtual try-ons</strong> with augmented reality features</li><li><strong>Expert advice</strong> connecting customers with specialists</li></ul><p><strong>🎓 EdTech Applications</strong></p><ul><li><strong>Virtual classrooms</strong> with interactive whiteboards</li><li><strong>One-on-one tutoring</strong> with session recording</li><li><strong>Group study sessions</strong> with collaborative tools</li><li><strong>Parent-teacher conferences</strong> with scheduling integration</li></ul><p><strong>🏥 Healthcare Applications</strong></p><ul><li><strong>Telemedicine consultations</strong> with HIPAA compliance</li><li><strong>Remote patient monitoring</strong> with vital sign integration</li><li><strong>Medical training</strong> with procedure recording</li><li><strong>Mental health support</strong> with privacy-first design</li></ul><p><strong>💼 Business Applications</strong></p><ul><li><strong>Customer onboarding</strong> with document verification</li><li><strong>Sales presentations</strong> with interactive demos</li><li><strong>Team collaboration</strong> with project management integration</li><li><strong>Client consultations</strong> with CRM synchronization</li></ul><hr><h2 id="why-now-a-decade-of-enterprise-experience-why-now">Why Now: A Decade of Enterprise Experience {#why-now}</h2><h3 id="our-journey-from-enterprise-consulting-to-platform-innovation">Our Journey: From Enterprise Consulting to Platform Innovation</h3><p>For the past decade, <strong>Samvyo has been the hidden force</strong> behind some of the world's most sophisticated communication applications. We've partnered with Fortune 500 companies across BFSI, healthcare, automotive, and manufacturing sectors, building custom real-time communication solutions that handle millions of interactions daily.</p><h4 id="%F0%9F%8F%97%EF%B8%8F-enterprise-foundations">🏗️ <strong>Enterprise Foundations</strong></h4><p><strong>Our Track Record:</strong></p><ul><li><strong>50+ enterprise deployments</strong> across 15 countries</li><li><strong>10M+ hours</strong> of production video/voice traffic</li><li><strong>99.98% uptime</strong> across all enterprise installations</li><li><strong>Zero security breaches</strong> in production environments</li><li><strong>24/7 support</strong> with average 2-minute response times</li></ul><p><strong>Industries Served:</strong></p><ul><li><strong>Banking &amp; Financial Services</strong>: Secure customer consultations, loan processing, investment advisory</li><li><strong>Healthcare Systems</strong>: Telemedicine platforms, specialist consultations, patient care coordination</li><li><strong>Automotive Manufacturing</strong>: Remote quality inspection, technician training, supplier collaboration</li><li><strong>Insurance Companies</strong>: Claims processing, risk assessment, customer onboarding</li><li><strong>Government Agencies</strong>: Citizen services, inter-agency communication, public safety coordination</li></ul><h4 id="%F0%9F%93%88-the-post-covid-pattern-recognition">📈 <strong>The Post-COVID Pattern Recognition</strong></h4><p>The pandemic accelerated digital transformation by 5-7 years, but it also exposed critical gaps in existing communication solutions. Through our enterprise partnerships, we identified three consistent failure patterns:</p><p><strong>🚫 Pattern 1: The Customization Ceiling</strong> Commercial providers like Zoom and Teams offer limited customization options. Enterprises hit walls when they need:</p><ul><li>Custom authentication flows</li><li>Industry-specific compliance requirements</li><li>Unique workflow integrations</li><li>Specialized analytics and reporting</li><li>White-label deployment options</li></ul><p><em>Real Example</em>: A healthcare client needed HIPAA-compliant video calls with custom patient verification. Existing solutions required workarounds that introduced security vulnerabilities.</p><p><strong>🚫 Pattern 2: The Open Source Scalability Trap</strong> Open-source solutions like Jitsi and WebRTC libraries provide flexibility but create new problems:</p><ul><li>Unpredictable scaling costs</li><li>Complex deployment and maintenance</li><li>Security vulnerability management</li><li>Limited enterprise support</li><li>Integration complexity with existing systems</li></ul><p><em>Real Example</em>: A financial services company built on open-source WebRTC spent 18 months and $2M+ just to handle peak traffic loads reliably.</p><p><strong>🚫 Pattern 3: The Integration Nightmare</strong> Most organizations end up with communication tool sprawl:</p><ul><li>Separate platforms for internal meetings, customer support, and API integrations</li><li>Disconnected analytics and reporting</li><li>Inconsistent user experiences</li><li>Multiple vendor relationships to manage</li><li>Data silos that prevent unified insights</li></ul><p><em>Real Example</em>: An automotive manufacturer used 7 different communication tools, making it impossible to track the customer journey from initial inquiry to post-sale support.</p><h4 id="%F0%9F%94%8D-market-research-insights">🔍 <strong>Market Research Insights</strong></h4><p>Our extensive market research revealed that 89% of enterprises want a solution that combines:</p><ul><li><strong>Commercial reliability</strong> with enterprise SLAs</li><li><strong>Open-source flexibility</strong> for custom requirements</li><li><strong>Unified platform</strong> approach to reduce complexity</li><li><strong>Pay-per-use pricing</strong> that scales with actual business value</li><li><strong>AI-first design</strong> for future-ready capabilities</li></ul><h3 id="the-samvyo-solution-architecture">The Samvyo Solution Architecture</h3><p>Based on this decade of learnings, we architected Samvyo v3.0 with five core principles:</p><h4 id="%F0%9F%8E%AF-1-commercial-reliability-with-open-source-flexibility">🎯 <strong>1. Commercial Reliability with Open Source Flexibility</strong></h4><ul><li><strong>Enterprise SLAs</strong> with 99.9% uptime guarantees</li><li><strong>Customizable core</strong> including media processing pipelines</li><li><strong>API-first design</strong> enabling deep system integration</li><li><strong>Professional support</strong> with dedicated success managers</li><li><strong>Regular updates</strong> without breaking changes</li></ul><h4 id="%F0%9F%92%B0-2-transparent-pay-per-use-economics">💰 <strong>2. Transparent Pay-Per-Use Economics</strong></h4><ul><li><strong>No seat-based licensing</strong> that penalizes growth</li><li><strong>Minute-based billing</strong> aligned with actual value delivery</li><li><strong>Predictable scaling</strong> with volume discounts</li><li><strong>No hidden fees</strong> or surprise overage charges</li><li><strong>Real-time usage monitoring</strong> for cost optimization</li></ul><h4 id="%F0%9F%94%97-3-unified-platform-approach">🔗 <strong>3. Unified Platform Approach</strong></h4><ul><li><strong>Single dashboard</strong> for all communication needs</li><li><strong>Shared analytics</strong> across meeting, support, and integration use cases</li><li><strong>Consistent APIs</strong> reducing development complexity</li><li><strong>Centralized user management</strong> with SSO integration</li><li><strong>Consolidated billing</strong> simplifying vendor relationships</li></ul><h4 id="%F0%9F%A4%96-4-ai-first-human-centered-design">🤖 <strong>4. AI-First, Human-Centered Design</strong></h4><ul><li><strong>Built-in intelligence</strong> rather than bolted-on features</li><li><strong>Context-aware</strong> automation that enhances human capabilities</li><li><strong>Privacy-preserving</strong> AI that respects data sovereignty</li><li><strong>Continuous learning</strong> that improves over time</li><li><strong>Explainable insights</strong> for decision-making transparency</li></ul><h4 id="%F0%9F%9B%A1%EF%B8%8F-5-security-and-compliance-by-design">🛡️ <strong>5. Security and Compliance by Design</strong></h4><ul><li><strong>Zero-trust architecture</strong> with end-to-end encryption</li><li><strong>Multi-region deployment</strong> for data residency requirements</li><li><strong>Automated compliance</strong> reporting for audits</li><li><strong>Threat detection</strong> with real-time monitoring</li><li><strong>Regular penetration testing</strong> by third-party security firms</li></ul><hr><h2 id="why-choose-samvyo-the-unified-communication-advantage-why-choose-samvyo">Why Choose Samvyo: The Unified Communication Advantage {#why-choose-samvyo}</h2><h3 id="the-communication-intelligence-revolution">The Communication Intelligence Revolution</h3><p>While competitors focus on individual communication channels, <strong>Samvyo provides unified communication intelligence</strong>. Our platform understands the complete context of your business communications—from internal team meetings to external customer interactions—creating a foundation for intelligent decision-making.</p><h4 id="%F0%9F%A7%A0-unified-ai-context-understanding">🧠 <strong>Unified AI Context Understanding</strong></h4><p><strong>Cross-Channel Intelligence:</strong> Traditional platforms analyze communications in isolation. Samvyo's AI understands the relationships between:</p><ul><li><strong>Internal team discussions</strong> about customer issues</li><li><strong>Customer support interactions</strong> with resolution outcomes</li><li><strong>Sales conversations</strong> with conversion patterns</li><li><strong>Product feedback</strong> from multiple touchpoints</li><li><strong>Training sessions</strong> with performance improvements</li></ul><p><strong>Real-World Impact:</strong> Imagine your sales team discussing a client challenge in a Samvyo Meet session. Our AI identifies the client name and automatically surfaces:</p><ul><li>Recent support tickets from that customer</li><li>Previous sales call sentiment analysis</li><li>Product usage patterns and pain points</li><li>Competitor mentions and concerns</li><li>Recommended talking points for the next interaction</li></ul><p>This level of context awareness is impossible with fragmented communication tools.</p><h4 id="%F0%9F%93%8A-business-intelligence-through-communication-data">📊 <strong>Business Intelligence Through Communication Data</strong></h4><p><strong>🎯 Customer Journey Optimization</strong></p><ul><li><strong>Touchpoint mapping</strong> across all communication channels</li><li><strong>Sentiment tracking</strong> from first contact to resolution</li><li><strong>Conversion analysis</strong> identifying successful interaction patterns</li><li><strong>Churn prediction</strong> based on communication frequency and tone</li><li><strong>Upsell opportunities</strong> discovered through conversation analysis</li></ul><p><strong>👥 Team Performance Insights</strong></p><ul><li><strong>Collaboration patterns</strong> identifying high-performing team structures</li><li><strong>Knowledge gaps</strong> revealed through question patterns in meetings</li><li><strong>Training needs</strong> identified through support call analysis</li><li><strong>Communication effectiveness</strong> measured across different mediums</li><li><strong>Leadership development</strong> insights from meeting facilitation patterns</li></ul><p><strong>📈 Business Strategy Intelligence</strong></p><ul><li><strong>Market sentiment</strong> analysis from customer interactions</li><li><strong>Product feedback</strong> aggregation from support and sales calls</li><li><strong>Competitive intelligence</strong> gathered from customer conversations</li><li><strong>Feature requests</strong> prioritization based on customer urgency</li><li><strong>Revenue impact</strong> correlation between communication quality and business outcomes</li></ul><h4 id="%F0%9F%94%84-seamless-workflow-integration">🔄 <strong>Seamless Workflow Integration</strong></h4><p><strong>🛠️ CRM and Business System Synchronization</strong></p><ul><li><strong>Automatic call logging</strong> with context and outcomes</li><li><strong>Contact enrichment</strong> using conversation insights</li><li><strong>Deal progression</strong> tracking through communication milestones</li><li><strong>Support ticket creation</strong> from video call discussions</li><li><strong>Follow-up automation</strong> based on conversation analysis</li></ul><p><strong>📋 Project Management Integration</strong></p><ul><li><strong>Action item extraction</strong> from team meetings</li><li><strong>Task assignment</strong> based on conversation commitments</li><li><strong>Project status updates</strong> derived from team communications</li><li><strong>Resource allocation</strong> insights from collaboration patterns</li><li><strong>Timeline adjustment</strong> recommendations based on communication velocity</li></ul><p><strong>💼 Enterprise Workflow Automation</strong></p><ul><li><strong>Approval processes</strong> triggered by video call outcomes</li><li><strong>Escalation protocols</strong> based on conversation sentiment</li><li><strong>Compliance documentation</strong> automatically generated from calls</li><li><strong>Training assignments</strong> based on identified knowledge gaps</li><li><strong>Performance reviews</strong> enriched with communication analytics</li></ul><h4 id="%F0%9F%8E%9A%EF%B8%8F-single-dashboard-operational-command-center">🎚️ <strong>Single Dashboard Operational Command Center</strong></h4><p><strong>📊 Executive Dashboard</strong></p><ul><li><strong>Communication health</strong> metrics across all channels</li><li><strong>Customer satisfaction</strong> trends with drill-down capabilities</li><li><strong>Team productivity</strong> insights with improvement recommendations</li><li><strong>Revenue correlation</strong> with communication quality scores</li><li><strong>Competitive positioning</strong> based on customer conversation analysis</li></ul><p><strong>🔧 Operations Dashboard</strong></p><ul><li><strong>Real-time monitoring</strong> of all communication channels</li><li><strong>Capacity planning</strong> with predictive analytics</li><li><strong>Quality assurance</strong> with automated conversation scoring</li><li><strong>Cost optimization</strong> with usage pattern analysis</li><li><strong>Security monitoring</strong> with threat detection alerts</li></ul><p><strong>👨‍💼 Manager Dashboard</strong></p><ul><li><strong>Team performance</strong> tracking with coaching recommendations</li><li><strong>Customer relationship</strong> health scoring with risk alerts</li><li><strong>Process optimization</strong> opportunities identified through communication analysis</li><li><strong>Training effectiveness</strong> measurement with ROI calculations</li><li><strong>Goal tracking</strong> with communication-based success metrics</li></ul><h3 id="competitive-differentiation-the-samvyo-advantage">Competitive Differentiation: The Samvyo Advantage</h3><h4 id="%F0%9F%86%9A-vs-fragmented-tool-ecosystems">🆚 <strong>vs. Fragmented Tool Ecosystems</strong></h4><p><strong>Traditional Approach Problems:</strong></p><ul><li><strong>Data silos</strong> preventing unified insights</li><li><strong>Context switching</strong> reducing productivity</li><li><strong>Integration complexity</strong> requiring custom development</li><li><strong>Vendor management</strong> overhead across multiple relationships</li><li><strong>Inconsistent experiences</strong> confusing users and customers</li></ul><p><strong>Samvyo Unified Approach Benefits:</strong></p><ul><li><strong>Single source of truth</strong> for all communication data</li><li><strong>Contextual continuity</strong> across all interaction types</li><li><strong>Native integrations</strong> with pre-built connectors</li><li><strong>Simplified vendor relationship</strong> with comprehensive support</li><li><strong>Consistent experience</strong> improving adoption and efficiency</li></ul><h4 id="%F0%9F%86%9A-vs-ai-washing-competitors">🆚 <strong>vs. AI-Washing Competitors</strong></h4><p>Many platforms claim AI capabilities but offer shallow features that don't understand business context.</p><p><strong>Superficial AI Features:</strong></p><ul><li>Basic transcription without context understanding</li><li>Generic sentiment analysis without business relevance</li><li>Simple chatbots without conversation flow comprehension</li><li>Keyword extraction without relationship mapping</li><li>Templated responses without personalization</li></ul><p><strong>Samvyo's Deep AI Integration:</strong></p><ul><li><strong>Contextual understanding</strong> across all business communications</li><li><strong>Predictive insights</strong> based on communication patterns</li><li><strong>Proactive recommendations</strong> for business improvement</li><li><strong>Continuous learning</strong> from your specific business context</li><li><strong>Explainable AI</strong> with clear reasoning for recommendations</li></ul><h4 id="%F0%9F%86%9A-vs-enterprise-legacy-solutions">🆚 <strong>vs. Enterprise Legacy Solutions</strong></h4><p><strong>Legacy Platform Limitations:</strong></p><ul><li><strong>Rigid architectures</strong> that resist customization</li><li><strong>Seat-based pricing</strong> that penalizes growth</li><li><strong>Vendor lock-in</strong> with proprietary formats</li><li><strong>Slow innovation</strong> cycles missing market opportunities</li><li><strong>Security through obscurity</strong> rather than transparency</li></ul><p><strong>Samvyo Modern Architecture:</strong></p><ul><li><strong>API-first design</strong> enabling unlimited customization</li><li><strong>Usage-based pricing</strong> that scales with business value</li><li><strong>Open standards</strong> preventing vendor lock-in</li><li><strong>Rapid feature delivery</strong> with weekly updates</li><li><strong>Transparent security</strong> with public architecture documentation</li></ul><h3 id="the-economic-impact-of-unified-communication-intelligence">The Economic Impact of Unified Communication Intelligence</h3><p><strong>📊 Quantified Business Benefits:</strong></p><p><strong>Customer Experience Improvements:</strong></p><ul><li><strong>40% reduction</strong> in average issue resolution time</li><li><strong>60% increase</strong> in first-call resolution rates</li><li><strong>25% improvement</strong> in customer satisfaction scores</li><li><strong>35% decrease</strong> in customer churn rates</li><li><strong>50% increase</strong> in support-to-sale conversion rates</li></ul><p><strong>Operational Efficiency Gains:</strong></p><ul><li><strong>30% reduction</strong> in communication tool costs</li><li><strong>45% decrease</strong> in time spent switching between platforms</li><li><strong>55% improvement</strong> in team collaboration effectiveness</li><li><strong>40% reduction</strong> in onboarding time for new team members</li><li><strong>60% decrease</strong> in communication-related technical issues</li></ul><p><strong>Revenue Enhancement:</strong></p><ul><li><strong>20% increase</strong> in sales conversion rates through better customer insights</li><li><strong>30% improvement</strong> in upsell success through communication intelligence</li><li><strong>25% reduction</strong> in customer acquisition costs through referral optimization</li><li><strong>35% increase</strong> in customer lifetime value through proactive engagement</li><li><strong>15% boost</strong> in overall revenue per employee through productivity gains</li></ul><hr><h2 id="getting-started-with-samvyo-getting-started">Getting Started with Samvyo {#getting-started}</h2><h3 id="choose-your-samvyo-journey">Choose Your Samvyo Journey</h3><p>Whether you're a developer looking to add video capabilities, a business seeking better customer support, or an enterprise needing comprehensive communication solutions, Samvyo has a path designed for you.</p><h4 id="%F0%9F%9A%80-for-developers-technical-teams">🚀 <strong>For Developers &amp; Technical Teams</strong></h4><p><strong>Quick Start Options:</strong></p><p><strong>🔥 5-Minute Integration Challenge</strong></p><pre><code class="language-bash"># Install Samvyo SDK
npm install samvyo-react-sdk

# Create your first video room
import { VideoRoom } from 'samvyo-react-sdk';
// 3 lines of code = production-ready video calling
</code></pre><p><strong>📦 Starter Kits Available:</strong></p><ul><li><strong>React Video Chat</strong> - Complete Slack-like interface</li><li><strong>Customer Support Widget</strong> - Embeddable support solution</li><li><strong>Meeting Room Builder</strong> - Zoom-alternative template</li><li><strong>Mobile Video Calling</strong> - React Native implementation</li><li><strong>Healthcare Telemedicine</strong> - HIPAA-compliant template</li></ul><p><strong>🛠️ Developer Resources:</strong></p><ul><li><strong>Interactive Documentation</strong>: Live code examples you can modify and test</li><li><strong>API Playground</strong>: Test all endpoints without writing code</li><li><strong>Postman Collections</strong>: Ready-to-import API testing suites</li><li><strong>GitHub Examples</strong>: 20+ implementation examples across frameworks</li><li><strong>Developer Community</strong>: Discord channel with 1,000+ active developers</li></ul><p><strong>🎯 Free Developer Tier:</strong></p><ul><li><strong>100 minutes/month</strong> free video calling</li><li><strong>Unlimited development</strong> in sandbox environment</li><li><strong>Full API access</strong> with rate limiting</li><li><strong>Community support</strong> via Discord and forums</li><li><strong>No credit card required</strong> for signup</li></ul><h4 id="%F0%9F%92%BC-for-business-teams-startups">💼 <strong>For Business Teams &amp; Startups</strong></h4><p><strong>Business Quick Start:</strong></p><p><strong>🎪 Try Before You Buy:</strong></p><ul><li><strong>30-day free trial</strong> with full platform access</li><li><strong>Demo environment</strong> with sample data and scenarios</li><li><strong>Guided onboarding</strong> with dedicated success manager</li><li><strong>Custom use case</strong> consultation and setup</li><li><strong>Migration assistance</strong> from existing platforms</li></ul><p><strong>📋 Business Starter Packages:</strong></p><p><strong>📞 Customer Support Starter</strong> - $99/month</p><ul><li>Up to 500 support minutes monthly</li><li>QR code generator for websites</li><li>Basic analytics dashboard</li><li>Email support with 4-hour response</li><li>Integration with popular help desk tools</li></ul><p><strong>🤝 Sales &amp; Marketing Starter</strong> - $199/month</p><ul><li>Up to 1,000 meeting minutes monthly</li><li>Custom branding for video calls</li><li>Lead capture integration</li><li>Advanced analytics and reporting</li><li>Priority support with 2-hour response</li></ul><p><strong>🏢 Business Growth</strong> - $499/month</p><ul><li>Up to 5,000 minutes across all products</li><li>AI-powered insights and recommendations</li><li>CRM integrations (Salesforce, HubSpot)</li><li>Custom domain and white-labeling</li><li>Dedicated success manager</li></ul><h4 id="%F0%9F%8F%97%EF%B8%8F-for-enterprise-organizations">🏗️ <strong>For Enterprise Organizations</strong></h4><p><strong>Enterprise Engagement Process:</strong></p><p><strong>🔍 Discovery &amp; Assessment</strong> (Week 1-2)</p><ul><li><strong>Current state analysis</strong> of existing communication stack</li><li><strong>Use case identification</strong> and requirement gathering</li><li><strong>ROI modeling</strong> with quantified business benefits</li><li><strong>Security and compliance</strong> requirement review</li><li><strong>Integration complexity</strong> assessment and planning</li></ul><p><strong>🧪 Proof of Concept</strong> (Week 3-6)</p><ul><li><strong>Sandbox environment</strong> with your branding and data</li><li><strong>Pilot user group</strong> testing key workflows</li><li><strong>Integration testing</strong> with existing systems</li><li><strong>Performance benchmarking</strong> against current solutions</li><li><strong>Security penetration testing</strong> and compliance validation</li></ul><p><strong>🚀 Deployment &amp; Scaling</strong> (Week 7-12)</p><ul><li><strong>Phased rollout</strong> across departments and regions</li><li><strong>Change management</strong> support and user training</li><li><strong>Monitoring and optimization</strong> of system performance</li><li><strong>Feedback collection</strong> and feature customization</li><li><strong>Success measurement</strong> and ROI validation</li></ul><p><strong>💎 Enterprise Features:</strong></p><ul><li><strong>Unlimited usage</strong> with volume discount pricing</li><li><strong>99.99% uptime SLA</strong> with financial penalties</li><li><strong>Dedicated infrastructure</strong> with single-tenant options</li><li><strong>24/7 priority support</strong> with 15-minute response times</li><li><strong>Custom feature development</strong> with engineering team access</li><li><strong>Global deployment</strong> across multiple regions and data centers</li></ul><h3 id="implementation-timeline-support">Implementation Timeline &amp; Support</h3><h4 id="%E2%8F%B1%EF%B8%8F-typical-implementation-timelines">⏱️ <strong>Typical Implementation Timelines</strong></h4><p><strong>Developer Integration:</strong></p><ul><li><strong>Simple video calling</strong>: 1-3 hours</li><li><strong>Customer support widget</strong>: 1-2 days</li><li><strong>Full communication platform</strong>: 1-2 weeks</li><li><strong>Enterprise customization</strong>: 2-4 weeks</li></ul><p><strong>Business Deployment:</strong></p><ul><li><strong>Basic setup</strong>: Same day</li><li><strong>Team onboarding</strong>: 3-5 days</li><li><strong>Workflow integration</strong>: 1-2 weeks</li><li><strong>Full optimization</strong>: 4-6 weeks</li></ul><p><strong>Enterprise Rollout:</strong></p><ul><li><strong>Pilot program</strong>: 2-4 weeks</li><li><strong>Department-wide</strong>: 6-8 weeks</li><li><strong>Organization-wide</strong>: 12-16 weeks</li><li><strong>Global deployment</strong>: 16-24 weeks</li></ul><h4 id="%F0%9F%86%98-support-success-resources">🆘 <strong>Support &amp; Success Resources</strong></h4><p><strong>📚 Learning Resources:</strong></p><ul><li><strong>Video tutorials</strong> covering every feature and use case</li><li><strong>Best practices guides</strong> based on successful implementations</li><li><strong>Webinar series</strong> with industry experts and power users</li><li><strong>Certification programs</strong> for developers and administrators</li><li><strong>Community forum</strong> with peer-to-peer support</li></ul><p><strong>🎯 Success Management:</strong></p><ul><li><strong>Dedicated success managers</strong> for business and enterprise customers</li><li><strong>Regular check-ins</strong> to ensure optimal platform utilization</li><li><strong>Performance reviews</strong> with improvement recommendations</li><li><strong>Feature updates</strong> and beta access to new capabilities</li><li><strong>Business review meetings</strong> with ROI measurement and optimization</li></ul><hr><h2 id="future-roadmap-and-ai-integration-future-roadmap">Future Roadmap and AI Integration {#future-roadmap}</h2><h3 id="the-ai-powered-communication-future">The AI-Powered Communication Future</h3><p>Samvyo v3.0 is just the beginning. Our roadmap focuses on making communication not just connected, but intelligent—transforming every interaction into actionable business intelligence.</p><h4 id="%F0%9F%A4%96-q3-2026-advanced-ai-intelligence">🤖 <strong>Q3 2026: Advanced AI Intelligence</strong></h4><p><strong>🧠 Conversation Intelligence Engine</strong></p><ul><li><strong>Multi-language transcription</strong> with 99.5% accuracy across 50+ languages</li><li><strong>Real-time sentiment analysis</strong> with emotional state tracking</li><li><strong>Intent recognition</strong> predicting customer needs before they're expressed</li><li><strong>Key phrase extraction</strong> automatically identifying critical discussion points</li><li><strong>Action item detection</strong> with automatic follow-up scheduling</li></ul><p><strong>📊 Predictive Analytics Platform</strong></p><ul><li><strong>Customer churn prediction</strong> based on communication patterns and sentiment trends</li><li><strong>Sales opportunity scoring</strong> using conversation quality and engagement metrics</li><li><strong>Support ticket volume forecasting</strong> for optimal resource allocation</li><li><strong>Team performance prediction</strong> identifying training needs before issues arise</li><li><strong>Revenue correlation modeling</strong> connecting communication quality to business outcomes</li></ul><p><strong>🎯 Personalization Engine</strong></p><ul><li><strong>Dynamic conversation routing</strong> matching customers to optimal agents</li><li><strong>Personalized communication recommendations</strong> based on individual customer history</li><li><strong>Adaptive UI/UX</strong> adjusting interface based on user behavior patterns</li><li><strong>Content customization</strong> showing relevant information during conversations</li><li><strong>Proactive engagement</strong> suggesting optimal times and methods for outreach</li></ul><h4 id="%F0%9F%94%97-q4-2026-unified-business-intelligence">🔗 <strong>Q4 2026: Unified Business Intelligence</strong></h4><p><strong>🏢 Enterprise CRM Integration Suite</strong></p><p><strong>Salesforce Deep Integration:</strong></p><ul><li><strong>Automatic opportunity updates</strong> based on video call outcomes</li><li><strong>Lead scoring enhancement</strong> using communication engagement metrics</li><li><strong>Contact enrichment</strong> with conversation insights and preferences</li><li><strong>Pipeline management</strong> with communication-driven stage progression</li><li><strong>Revenue attribution</strong> tracking communication impact on deals</li></ul><p><strong>HubSpot Comprehensive Connector:</strong></p><ul><li><strong>Marketing automation triggers</strong> based on support conversation topics</li><li><strong>Customer journey mapping</strong> incorporating video interaction touchpoints</li><li><strong>Content personalization</strong> using communication preference data</li><li><strong>Lead nurturing optimization</strong> with video engagement scoring</li><li><strong>Attribution reporting</strong> connecting communication to marketing ROI</li></ul><p><strong>Custom CRM Adaptability:</strong></p><ul><li><strong>API-first integration</strong> supporting any CRM system</li><li><strong>Webhook-based automation</strong> for real-time data synchronization</li><li><strong>Custom field mapping</strong> aligning communication data with business processes</li><li><strong>Bi-directional sync</strong> ensuring data consistency across platforms</li><li><strong>Compliance-aware integration</strong> maintaining security and privacy standards</li></ul><p><strong>📈 Business Intelligence Dashboard</strong></p><p><strong>Executive Command Center:</strong></p><ul><li><strong>Real-time KPI monitoring</strong> across all communication channels</li><li><strong>Predictive business insights</strong> with 90-day forecasting</li><li><strong>Competitive intelligence</strong> gathered from customer conversations</li><li><strong>Market sentiment tracking</strong> identifying trends and opportunities</li><li><strong>ROI measurement</strong> quantifying communication platform business impact</li></ul><p><strong>Operational Intelligence:</strong></p><ul><li><strong>Resource optimization</strong> recommendations based on usage patterns</li><li><strong>Quality assurance automation</strong> with AI-powered conversation scoring</li><li><strong>Training need identification</strong> using performance gap analysis</li><li><strong>Process improvement suggestions</strong> derived from communication flow analysis</li><li><strong>Cost optimization insights</strong> maximizing value from platform investment</li></ul><h4 id="%F0%9F%8C%90-2027-global-scale-innovation">🌐 <strong>2027: Global Scale &amp; Innovation</strong></h4><p><strong>🚀 Next-Generation Features</strong></p><p><strong>Immersive Communication:</strong></p><ul><li><strong>Virtual reality meeting spaces</strong> for enhanced collaboration</li><li><strong>Augmented reality overlays</strong> providing contextual information during calls</li><li><strong>3D product demonstrations</strong> within video conversations</li><li><strong>Spatial audio</strong> creating realistic meeting environments</li><li><strong>Holographic projection</strong> support for premium enterprise clients</li></ul><p><strong>Advanced AI Capabilities:</strong></p><ul><li><strong>Real-time language translation</strong> with cultural context awareness</li><li><strong>Emotion recognition</strong> with appropriate response suggestions</li><li><strong>Voice cloning</strong> for multilingual customer support</li><li><strong>Automated meeting summaries</strong> with action item assignment</li><li><strong>Predictive conversation routing</strong> optimizing outcomes before calls begin</li></ul><p><strong>Blockchain Integration:</strong></p><ul><li><strong>Immutable conversation records</strong> for compliance and legal requirements</li><li><strong>Smart contracts</strong> for automated billing and service level agreements</li><li><strong>Decentralized identity verification</strong> enhancing security and privacy</li><li><strong>Token-based incentive systems</strong> rewarding quality interactions</li><li><strong>Distributed infrastructure</strong> for enhanced reliability and privacy</li></ul><h3 id="platform-evolution-strategy">Platform Evolution Strategy</h3><h4 id="%F0%9F%94%84-continuous-innovation-methodology">🔄 <strong>Continuous Innovation Methodology</strong></h4><p><strong>User-Driven Development:</strong></p><ul><li><strong>Monthly feature releases</strong> based on community feedback</li><li><strong>A/B testing framework</strong> for all new capabilities</li><li><strong>Beta user programs</strong> providing early access to innovations</li><li><strong>Customer advisory boards</strong> guiding product direction</li><li><strong>Open source contributions</strong> from community developers</li></ul><p><strong>Data-Driven Optimization:</strong></p><ul><li><strong>Performance monitoring</strong> across all platform components</li><li><strong>Usage pattern analysis</strong> informing feature prioritization</li><li><strong>Success metric tracking</strong> ensuring business value delivery</li><li><strong>Predictive capacity planning</strong> maintaining optimal performance</li><li><strong>Security threat modeling</strong> staying ahead of emerging risks</li></ul><p><strong>Ecosystem Expansion:</strong></p><ul><li><strong>Partner integration marketplace</strong> with third-party solutions</li><li><strong>Developer tool ecosystem</strong> supporting custom extensions</li><li><strong>Industry-specific solutions</strong> for healthcare, finance, education</li><li><strong>Regional customization</strong> meeting local compliance requirements</li><li><strong>White-label partnerships</strong> enabling reseller opportunities</li></ul><hr><h2 id="frequently-asked-questions-faq">Frequently Asked Questions {#faq}</h2><h3 id="%F0%9F%94%A7-technical-integration-questions">🔧 <strong>Technical Integration Questions</strong></h3><p><strong>Q: How quickly can we integrate Samvyo into our existing application?</strong> A: Integration time depends on complexity:</p><ul><li><strong>Basic video calling</strong>: 1-3 hours using our React SDK</li><li><strong>Custom UI implementation</strong>: 1-2 days with our JavaScript SDK</li><li><strong>Full platform integration</strong>: 1-2 weeks including CRM connections</li><li><strong>Enterprise customization</strong>: 2-4 weeks with dedicated support</li></ul><p>Our SDKs are designed for rapid integration with comprehensive documentation and live examples.</p><p><strong>Q: What programming languages and frameworks do you support?</strong> A: We provide native SDKs for:</p><ul><li><strong>JavaScript/TypeScript</strong> (vanilla and all major frameworks)</li><li><strong>React</strong> (hooks, components, and Next.js support)</li><li><strong>React Native</strong> (iOS and Android)</li><li><strong>REST APIs</strong> for any backend language</li><li><strong>Webhooks</strong> for real-time event handling</li></ul><p>Additional SDK requests are evaluated based on community demand.</p><p><strong>Q: How does Samvyo handle scaling and performance?</strong> A: Our platform is built for global scale:</p><ul><li><strong>Auto-scaling infrastructure</strong> handling traffic spikes automatically</li><li><strong>Global CDN</strong> with 40+ edge locations worldwide</li><li><strong>Adaptive bitrate streaming</strong> optimizing for connection quality</li><li><strong>Load balancing</strong> distributing traffic across multiple regions</li><li><strong>99.9% uptime SLA</strong> with redundant failover systems</li></ul><p><strong>Q: Can we customize the UI/UX to match our brand?</strong> A: Absolutely! Samvyo offers multiple customization levels:</p><ul><li><strong>Theme customization</strong> with colors, fonts, and logos</li><li><strong>Component-level styling</strong> using CSS or styled-components</li><li><strong>Custom component development</strong> using our SDK building blocks</li><li><strong>White-label solutions</strong> with complete brand control</li><li><strong>API-first architecture</strong> enabling fully custom interfaces</li></ul><h3 id="%F0%9F%94%92-security-compliance-questions">🔒 <strong>Security &amp; Compliance Questions</strong></h3><p><strong>Q: What security certifications does Samvyo have?</strong> A: We maintain the highest security standards:</p><ul><li><strong>SOC 2 Type II</strong> certified by independent auditors</li><li><strong>GDPR compliant</strong> with data residency options</li><li><strong>HIPAA compliant</strong> for healthcare applications</li><li><strong>PCI-DSS certified</strong> for payment-related communications</li><li><strong>ISO 27001</strong> information security management</li><li><strong>Regular penetration testing</strong> by third-party security firms</li></ul><p><strong>Q: How is our data protected and where is it stored?</strong> A: Data protection is our top priority:</p><ul><li><strong>End-to-end encryption</strong> for all communications</li><li><strong>Zero-knowledge architecture</strong> - we cannot access your content</li><li><strong>Regional data storage</strong> options for compliance requirements</li><li><strong>Automatic data retention</strong> policies with customizable periods</li><li><strong>Encryption at rest</strong> using AES-256 standards</li><li><strong>In-transit encryption</strong> using TLS 1.3</li></ul><p><strong>Q: Can we control where our data is processed and stored?</strong> A: Yes, we offer flexible data residency options:</p><ul><li><strong>Single region deployment</strong> for strict compliance requirements</li><li><strong>Multi-region replication</strong> for performance and redundancy</li><li><strong>On-premises deployment</strong> for maximum control (enterprise only)</li><li><strong>Hybrid cloud</strong> options combining cloud efficiency with local control</li><li><strong>Data sovereignty</strong> compliance with local regulations</li></ul><h3 id="%F0%9F%92%B0-pricing-business-questions">💰 <strong>Pricing &amp; Business Questions</strong></h3><p><strong>Q: How does pay-per-use pricing work?</strong> A: Our transparent pricing model charges only for actual usage:</p><ul><li><strong>Per-minute billing</strong> for video/voice calls</li><li><strong>Per-participant calculation</strong> for fair multi-user pricing</li><li><strong>Volume discounts</strong> automatically applied as usage increases</li><li><strong>Predictable costs</strong> with usage monitoring and alerts</li><li><strong>No seat licenses</strong> - pay only for active communication time</li><li><strong>Real-time billing</strong> dashboard showing current usage and costs</li></ul><p><strong>Q: What's included in the free tier?</strong> A: Our free tier includes:</p><ul><li><strong>100 minutes monthly</strong> of video/voice calling</li><li><strong>Unlimited development</strong> in sandbox environment</li><li><strong>Full API access</strong> with reasonable rate limits</li><li><strong>Community support</strong> via Discord and forums</li><li><strong>Basic analytics</strong> and usage monitoring</li><li><strong>No credit card required</strong> for signup</li></ul><p><strong>Q: How do you compare to competitors on cost?</strong> A: Samvyo typically costs 40-60% less than traditional solutions:</p><ul><li><strong>Zoom/Teams</strong>: $15-25 per user monthly vs. our usage-based model</li><li><strong>Custom development</strong>: $50K-200K+ vs. hours of integration</li><li><strong>Contact center solutions</strong>: $100-300 per agent monthly vs. our per-minute pricing</li><li><strong>Enterprise savings</strong>: Often exceed $100K annually for medium-sized businesses</li></ul><h3 id="%F0%9F%9A%80-platform-features-questions">🚀 <strong>Platform &amp; Features Questions</strong></h3><p><strong>Q: What makes Samvyo different from Zoom, Teams, or Google Meet?</strong> A: Samvyo offers unique advantages:</p><ul><li><strong>Unified platform</strong> combining meetings, support, and integration APIs</li><li><strong>AI-first design</strong> with built-in intelligence across all features</li><li><strong>Unlimited customization</strong> including core media processing</li><li><strong>Pay-per-use pricing</strong> vs. expensive per-seat licensing</li><li><strong>Developer-friendly</strong> with comprehensive SDKs and APIs</li><li><strong>Business intelligence</strong> providing insights from all communications</li></ul><p><strong>Q: Can Samvyo replace our current contact center solution?</strong> A: Yes, Samvyo Meetnow is designed as a complete contact center replacement:</p><ul><li><strong>QR code calling</strong> eliminates phone trees and wait times</li><li><strong>AI-powered routing</strong> matches customers to optimal agents</li><li><strong>Video-first support</strong> resolves issues faster than voice-only</li><li><strong>Integrated analytics</strong> providing comprehensive performance insights</li><li><strong>CRM synchronization</strong> maintaining complete customer context</li><li><strong>60% lower costs</strong> compared to traditional contact center platforms</li></ul><p><strong>Q: How does the AI functionality work?</strong> A: Our AI operates across multiple dimensions:</p><ul><li><strong>Real-time transcription</strong> with context understanding</li><li><strong>Sentiment analysis</strong> tracking emotional state throughout conversations</li><li><strong>Intent recognition</strong> predicting customer needs and agent responses</li><li><strong>Conversation intelligence</strong> extracting key insights and action items</li><li><strong>Predictive analytics</strong> forecasting trends and recommending actions</li><li><strong>Privacy-preserving</strong> - AI processes metadata, not sensitive content</li></ul><p><strong>Q: What support do you provide during implementation?</strong> A: We offer comprehensive implementation support:</p><ul><li><strong>Dedicated success managers</strong> for business and enterprise customers</li><li><strong>Technical consulting</strong> for complex integrations</li><li><strong>Training programs</strong> for administrators and end users</li><li><strong>Migration assistance</strong> from existing platforms</li><li><strong>24/7 priority support</strong> for enterprise customers</li><li><strong>Regular check-ins</strong> ensuring optimal platform utilization</li></ul><h3 id="%F0%9F%8C%8D-global-accessibility-questions">🌍 <strong>Global &amp; Accessibility Questions</strong></h3><p><strong>Q: What regions and languages do you support?</strong> A: Samvyo provides global coverage:</p><ul><li><strong>40+ data centers</strong> across North America, Europe, Asia-Pacific</li><li><strong>50+ languages</strong> for transcription and translation</li><li><strong>Regional compliance</strong> meeting local data protection requirements</li><li><strong>Multi-timezone support</strong> with appropriate routing</li><li><strong>Cultural customization</strong> adapting features for regional preferences</li></ul><p><strong>Q: How do you ensure accessibility for users with disabilities?</strong> A: Accessibility is built into our platform:</p><ul><li><strong>WCAG 2.1 AA compliance</strong> for web interfaces</li><li><strong>Screen reader support</strong> with proper ARIA labeling</li><li><strong>Keyboard navigation</strong> for all functionality</li><li><strong>Closed captioning</strong> with real-time transcription</li><li><strong>High contrast modes</strong> and customizable text sizing</li><li><strong>Audio descriptions</strong> for visual elements when needed</li></ul><hr><h2 id="conclusion-transform-your-communication-today">Conclusion: Transform Your Communication Today</h2><p>The future of business communication isn't about having more tools—it's about having intelligent, unified, and customizable communication that drives real business outcomes. <strong>Samvyo v3.0 represents a fundamental shift</strong> from fragmented communication tools to an integrated intelligence platform. </p><h3 id="the-samvyo-advantage-three-pillars-of-success">The Samvyo Advantage: Three Pillars of Success</h3><p><strong>🎯 Unified Intelligence</strong>: Unlike competitors who treat meetings, support, and integration as separate products, Samvyo provides unified intelligence across all communication touchpoints. This holistic approach enables insights and automation impossible with fragmented solutions.</p><p><strong>⚡ Developer-First Innovation</strong>: Our comprehensive SDK suite and API-first architecture enable integration in hours, not months. Whether you're building a simple video chat or a complex multi-tenant platform, Samvyo provides the tools for rapid development and infinite customization.</p><p><strong>🤖 AI-Powered Insights</strong>: Built-in artificial intelligence transforms every conversation into actionable business intelligence. From predicting customer churn to optimizing team performance, Samvyo's AI provides the insights modern businesses need to stay competitive.</p><h3 id="ready-to-transform-your-communication">Ready to Transform Your Communication?</h3><p><strong>For Developers</strong>: Start building with our free tier and comprehensive SDKs. Join our developer community and see why thousands of developers choose Samvyo for real-time communication integration.</p><p><strong>For Businesses</strong>: Replace fragmented communication tools with Samvyo's unified platform. Reduce costs, improve customer experience, and gain unprecedented insights into your communication effectiveness.</p><p><strong>For Enterprises</strong>: Partner with us to transform your organization's communication infrastructure. Our enterprise team provides white-glove service ensuring successful deployment and ongoing optimization.</p><h3 id="take-action-today">Take Action Today</h3><p>🚀 <strong>Start Free</strong>: <a href="https://app.samvyo.com/registration?ref=samvyo.com" rel="noreferrer">Get your API keys</a> and begin building in minutes<br>📞 <strong>Schedule Demo</strong>: <a href="https://www.samvyo.com/contact?ref=samvyo.com" rel="noreferrer">Book a personalized demonstration</a> with our team<br>💼 <strong>Enterprise Inquiry</strong>: <a href="https://www.samvyo.com/contact?ref=samvyo.com" rel="noreferrer">Contact our enterprise team</a> for custom solutions<br>📖 <strong>Explore Documentation</strong>: <a href="https://www.samvyo.com/docs?ref=samvyo.com" rel="noreferrer">Dive deep into our APIs</a> and capabilities</br></br></br></p><p>The communication revolution starts now. <strong>Join thousands of developers and hundreds of businesses</strong> who have chosen Samvyo as their communication platform.</p><p><em>Transform your communication. Transform your business. Transform your future.</em></p><hr><h3 id="about-samvyo-technologies">About Samvyo Technologies</h3><p>Samvyo Technologies is a leading provider of real-time communication solutions, serving developers, businesses, and enterprises worldwide. Founded by veterans of the telecommunications and software industry, we combine a decade of enterprise experience with startup innovation to deliver the future of intelligent communication.</p><p><strong>Contact Information:</strong></p><ul><li><strong>Website</strong>: <a href="https://www.samvyo.com/?ref=samvyo.com">https://www.samvyo.com</a></li><li><strong>Documentation</strong>: <a href="https://www.samvyo.com/docs?ref=samvyo.com" rel="noreferrer">https://docs.samvyo.com</a></li><li><strong>Developer Community</strong>: <a href="https://discord.gg/aAfkS2DKVm?ref=samvyo.com" rel="noreferrer">https://discord.gg/samvyo</a></li><li><strong>Enterprise Sales</strong>: <a href="mailto:sales@samvyo.com" rel="noreferrer">enterprise@samvyo.com</a></li><li><strong>Technical Support</strong>: <a href="mailto:support@samvyo.com">support@samvyo.com</a></li></ul><p><strong>Follow Us:</strong></p><ul><li><strong>LinkedIn</strong>: <a href="https://linkedin.com/company/samvyo?ref=samvyo.com" rel="noreferrer">@samvyo-technologies</a></li><li><strong>Twitter</strong>: <a href="https://twitter.com/SamvyoTech?ref=samvyo.com">@SamvyoTech</a></li><li><strong>GitHub</strong>: <a href="https://github.com/samvyo?ref=samvyo.com">@samvyo</a></li><li><strong>YouTube</strong>: <a href="https://youtube.com/@samvyotech?ref=samvyo.com">Samvyo Technologies</a></li></ul>
<!--kg-card-begin: html-->
<!-- FAQ Schema Markup for AI Crawling -->
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "How quickly can we integrate Samvyo into our existing application?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Integration time depends on complexity: Basic video calling takes 1-3 hours using our JS SDK, custom UI implementation takes 2-7 days with our JavaScript SDK, full platform integration takes 1-2 weeks including CRM connections, and enterprise customization takes 2-4 weeks with dedicated support."
      }
    },
    {
      "@type": "Question",
      "name": "What makes Samvyo different from Zoom, Teams, or Google Meet?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Samvyo offers unique advantages: unified platform combining meetings, support, and integration APIs, AI-first design with built-in intelligence, unlimited customization including core media processing, pay-per-use pricing vs expensive per-seat licensing, developer-friendly comprehensive SDKs and APIs, and business intelligence providing insights from all communications."
      }
    },
    {
      "@type": "Question",
      "name": "How does pay-per-use pricing work?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Our transparent pricing model charges only for actual usage: per-minute billing for video/voice calls, per-participant calculation for fair multi-user pricing, volume discounts automatically applied as usage increases, predictable costs with usage monitoring and alerts, no seat licenses, and real-time billing dashboard showing current usage and costs."
      }
    },
    {
      "@type": "Question",
      "name": "What security certifications does Samvyo have?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "We maintain the highest security standards: SOC 2 Type II certified by independent auditors, GDPR compliant with data residency options, HIPAA compliant for healthcare applications, PCI-DSS certified for payment-related communications, ISO 27001 information security management, and regular penetration testing by third-party security firms."
      }
    },
    {
      "@type": "Question",
      "name": "Can Samvyo replace our current contact center solution?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Yes, Samvyo Meetnow is designed as a complete contact center replacement: QR code calling eliminates phone trees and wait times, AI-powered routing matches customers to optimal agents, video-first support resolves issues faster than voice-only, integrated analytics provide comprehensive performance insights, CRM synchronization maintains complete customer context, and costs 60% lower than traditional contact center platforms."
      }
    }
  ]
}
</script>

<!-- Visible FAQ Section -->
<div style="background: #f8f9fa; padding: 20px; border-radius: 8px; margin: 20px 0;">
  <h3>🔍 Frequently Asked Questions</h3>
  <details style="margin: 10px 0;">
    <summary style="font-weight: bold; cursor: pointer;">How quickly can we integrate Samvyo into our existing application?</summary>
    <p style="margin-top: 10px;">Integration time depends on complexity: Basic video calling (1-3 hours), Custom UI implementation (1-2 days), Full platform integration (1-2 weeks), Enterprise customization (2-4 weeks with dedicated support).</p>
  </details>
  
  <details style="margin: 10px 0;">
    <summary style="font-weight: bold; cursor: pointer;">What makes Samvyo different from Zoom, Teams, or Google Meet?</summary>
    <p style="margin-top: 10px;">Unified platform combining meetings, support, and integration APIs • AI-first design with built-in intelligence • Unlimited customization • Pay-per-use pricing • Developer-friendly SDKs • Business intelligence insights</p>
  </details>
  
  <details style="margin: 10px 0;">
    <summary style="font-weight: bold; cursor: pointer;">How does pay-per-use pricing work?</summary>
    <p style="margin-top: 10px;">Per-minute billing for actual usage • Per-participant calculation • Volume discounts automatically applied • No seat licenses • Real-time billing dashboard with usage monitoring</p>
  </details>
  
  <details style="margin: 10px 0;">
    <summary style="font-weight: bold; cursor: pointer;">How can I contact Samvyo sales team?</summary>
    <p style="margin-top: 10px;"><strong>Enterprise:</strong> sales@samvyo.com, +91-6362814071 (9:00 to 19:00 CET) • <strong>Business:</strong> sales@samvyo.com,  +91-6362814071 • <strong>Developer:</strong> sales@samvyo.com, Discord community • Also available via WhatsApp, live chat, and scheduled demos</p>
  </details>
  
  <details style="margin: 10px 0;">
    <summary style="font-weight: bold; cursor: pointer;">What support do you provide during implementation?</summary>
    <p style="margin-top: 10px;">Dedicated success managers • Technical consulting • Training programs • Migration assistance • 24/7 priority support for enterprise • Regular optimization check-ins</p>
  </details>
</div>
<!--kg-card-end: html-->
</hr></hr></hr></hr></hr></hr></hr></hr></hr></hr></hr></hr>]]></content:encoded></item><item><title><![CDATA[Rethinking Elevator safety with Embedded WebRTC]]></title><description><![CDATA[Enhancing Elevator Safety with WebRTC, A white paper to showcase why a better system for emergency response and rescue is the need of the hour for the elevator industry and how  WebRTC can provide the right tools for efficient response and rescue efforts in case of a stalled elevator.]]></description><link>https://samvyo.com/blog/enhancing-elevator-safety-with-webrtc</link><guid isPermaLink="false">67d2d233aeb302628d2915a8</guid><category><![CDATA[Embedded WebRTC]]></category><category><![CDATA[WebRTC on ARM]]></category><category><![CDATA[Real-Time Voice/Video]]></category><category><![CDATA[Elevator Safety with WebRTC]]></category><dc:creator><![CDATA[Saurav K. Panda]]></dc:creator><pubDate>Mon, 06 Jan 2025 10:45:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1562654501-9a587e8638d8?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDR8fGVsZXZhdG9yfGVufDB8fHx8MTc0MTg3MTgxNXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<h3 id="introduction"><strong>Introduction</strong></h3><img src="https://images.unsplash.com/photo-1562654501-9a587e8638d8?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDR8fGVsZXZhdG9yfGVufDB8fHx8MTc0MTg3MTgxNXww&ixlib=rb-4.0.3&q=80&w=2000" alt="Rethinking Elevator safety with Embedded WebRTC"/><p>As urban landscapes continue to evolve with the rise of high-rise buildings, elevators have become an essential part of modern infrastructure. With millions relying on these systems daily, ensuring passenger safety has never been more critical. This white paper delves into the evolution of safety elevators, the current market landscape, and how WebRTC technology is revolutionizing safety standards through real-time, two-way video communication.</p><h3 id="the-evolution-of-safety-elevators"><strong>The Evolution of Safety Elevators</strong></h3><p>The invention of the safety elevator transformed urban architecture, making skyscrapers and high-rise buildings feasible. In 1852, Elisha Otis introduced the first safety elevator, incorporating a fail-safe brake mechanism that prevented free-fall in case of a rope failure. Since then, elevators have become an indispensable part of city life, evolving from manually operated systems to highly automated units with advanced safety features.</p><h3 id="the-rising-importance-of-elevator-safety"><strong>The Rising Importance of Elevator Safety</strong></h3><p>As cities continue to expand vertically, the global demand for safety elevators is accelerating. Market research indicates that the elevator industry will reach <strong>$135 billion by 2030</strong>, driven by increased construction of high-rise structures and stricter safety regulations. In this rapidly urbanizing world, ensuring passenger safety in emergency situations is a top priority for manufacturers and regulatory bodies alike.</p><h3 id="rethinking-elevator-safety-the-need-for-two-way-video-communication"><strong>Rethinking Elevator Safety: The Need for Two-Way Video Communication</strong></h3><p>While traditional safety measures such as alarms and emergency stop buttons have been effective, they often fail to address real-time emergencies like medical crises or mechanical failures. <strong>Two-way video calling systems</strong> offer a game-changing solution, allowing direct communication between passengers and emergency responders. This technology closes crucial gaps in emergency response by providing live visual and audio information, enabling faster and more effective rescue operations.</p><h3 id="existing-emergency-response-systems-in-elevators"><strong>Existing Emergency Response Systems in Elevators</strong></h3><p>Most modern elevators are equipped with:</p><ul><li><strong>Emergency intercoms</strong> for voice communication</li><li><strong>Alarm buttons</strong> to alert building security</li><li><strong>Automatic emergency braking systems</strong> to prevent mechanical failures</li></ul><p>However, these traditional systems lack real-time visual data, which is essential for making quick, informed decisions in complex emergency scenarios.</p><h3 id="webrtc-elevating-safety-through-real-time-video-communication"><strong>WebRTC: Elevating Safety Through Real-Time Video Communication</strong></h3><p><strong>WebRTC (Web Real-Time Communication)</strong> introduces a breakthrough in elevator safety by enabling high-quality, low-latency video and audio calls between passengers and rescue teams. Key benefits include:</p><p>✅ <strong>Enhanced Situational Awareness</strong> – Live video feeds provide real-time insights into emergency situations.<br>✅ <strong>Faster Emergency Response</strong> – Rescue teams can assess incidents instantly and react accordingly.<br>✅ <strong>Increased Passenger Confidence</strong> – Clear visual communication reduces panic and reassures passengers.</br></br></p><p>Unlike traditional systems, WebRTC-based solutions function efficiently <strong>without</strong> relying on centralized servers, ensuring seamless performance even in challenging network environments.</p><h3 id="challenges-in-hardware-integration"><strong>Challenges in Hardware Integration</strong></h3><p>Deploying WebRTC-powered video calling in elevator systems presents unique challenges:</p><p>🔹 <strong>Limited Processing Power:</strong> Elevator control units typically run <strong>lightweight Linux-based OS</strong> with minimal CPU resources.<br>🔹 <strong>No Browser Environment:</strong> Many systems lack built-in web browsers required for running WebRTC applications.<br>🔹 <strong>Hardware Limitations:</strong> Restricted support for real-time video and audio processing, leading to potential performance bottlenecks.</br></br></p><h3 id="developing-a-native-webrtc-solution-for-elevators"><strong>Developing a Native WebRTC Solution for Elevators</strong></h3><p>To overcome these hurdles, <strong>Samvyo</strong> engineered an optimized WebRTC solution tailored for elevator hardware:</p><p>✔ <strong>Custom WebRTC Build:</strong> Compiled WebRTC libraries optimized for embedded hardware.<br>✔ <strong>C++ Application:</strong> Built using <strong>RTC peer connection</strong> for establishing seamless video calls.<br>✔ <strong>Media Capture:</strong> Developed <strong>browser-equivalent getUserMedia</strong> functionality for accessing cameras and microphones.<br>✔ <strong>Efficient Rendering:</strong> Leveraged <strong>GStreamer and libgtk</strong> for optimized video/audio processing.<br>✔ <strong>Hardware Acceleration:</strong> Utilized available <strong>GPU resources</strong> to reduce CPU load.<br>✔ <strong>Multithreading:</strong> Distributed workloads across multiple threads to maintain smooth, uninterrupted communication.</br></br></br></br></br></p><h3 id="beyond-elevators-expanding-webrtc-applications"><strong>Beyond Elevators: Expanding WebRTC Applications</strong></h3><p>The same WebRTC-based solutions are transforming workflows across various industries:</p><p>🏭 <strong>Industry 4.0:</strong> Real-time video monitoring in manufacturing processes.<br>🚗 <strong>Automotive Sector:</strong> <strong>Video telematics</strong> for driver assistance and remote diagnostics.<br>⛏ <strong>Industrial Safety:</strong> Enhanced emergency communication in <strong>mines, oil rigs, and remote construction sites.</strong></br></br></p><h3 id="case-study-transforming-emergency-response-for-a-leading-elevator-manufacturer"><strong>Case Study: Transforming Emergency Response for a Leading Elevator Manufacturer</strong></h3><p>Recently, <strong>Samvyo</strong> partnered with one of the world’s top elevator manufacturers to develop an advanced emergency response system powered by WebRTC. By following the principles outlined above, we successfully implemented a <strong>two-way video calling system</strong> that:</p><p>🔹 <strong>Operates efficiently on low-powered hardware</strong> – The solution was optimized for a <strong>900MHz dual-core NXP i.MX6 processor</strong>, responsible for running both the elevator’s core operating system and application layer. The target was to keep CPU usage <strong>below 70%</strong> while supporting a high-quality video call alongside other elevator processes. We achieved this with a <strong>CPU utilization of just 62%</strong> while running a smooth WebRTC-powered video call.</p><p>🔹 <strong>Delivers crystal-clear video and audio</strong> – Extensive testing revealed that a <strong>320x240 resolution at 10fps</strong> strikes the perfect balance between video clarity and CPU efficiency, ensuring optimal two-way communication while maintaining system performance.</p><p>🔹 <strong>Meets stringent safety and compliance standards</strong> – The solution underwent rigorous testing under <strong>real-world conditions</strong> to proactively identify and resolve any potential issues before deployment.</p><p>This WebRTC-powered innovation significantly improved emergency response times, enhancing passenger safety across multiple high-rise installations.</p><hr><h3 id="webrtc-and-elevator-safety-a-new-standard"><strong>WebRTC and Elevator Safety: A New Standard</strong></h3><p>As the demand for <strong>real-time safety communication</strong> continues to grow, <strong>Samvyo’s customizable WebRTC-based solutions</strong> are setting new benchmarks in emergency response. Whether in elevators, industrial settings, or the automotive sector, our technology is designed to adapt and excel across diverse environments.</p><p>If your organisation is looking to implement <strong>enterprise-grade real-time audio/video solutions</strong> with <strong>seamless hardware integration</strong>, we can help.</p><p>📩 <strong>Get in Touch:</strong> Schedule a <strong>free 30-minute strategy session</strong> with us to discuss your specific needs and discover the best approach for integrating WebRTC into your critical business workflows. Reach out to us at <a rel="noopener"><strong>hello@samvyo.com</strong></a> or visit our [services page] for more details.</p><p>Looking to speed up your development process? <strong>Explore the Samvyo Video API/SDK</strong> – deploy a ready-to-use backend for global operations in less than a week!</p></hr>]]></content:encoded></item><item><title><![CDATA[Staying on ACS Calling Can Mean Buying Teams Licences: What That Actually Costs]]></title><description><![CDATA[Staying on an ACS Calling path does not automatically mean licensing every caller. Learn how ACS user-minute pricing, Teams identities and external participants change the cost model for a white-labelled product.]]></description><link>https://www.samvyo.com/blog/staying-on-acs-calling-means-buying-teams-licences-what-that-actually-costs</link><guid isPermaLink="false">6ae81e348b45c3f0cd63aec2</guid><category><![CDATA[CPAAS]]></category><category><![CDATA[video api pricing]]></category><category><![CDATA[Migration]]></category><category><![CDATA[Vendor Lock-in]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Mon, 02 Nov 2026 05:29:34 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/11/attempt-465.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/11/attempt-465.jpg" alt="Staying on ACS Calling Can Mean Buying Teams Licences: What That Actually Costs"/><p>A product team can keep its calling interface, preserve its customer workflows and still face a different bill after an infrastructure retirement. The reason is that the cost may move from an ACS consumption meter to a Teams-aligned licensing model, while the people using the product are customers your company does not control.</p><p>That is the important qualification in the title. Staying on an ACS Calling path does not automatically mean buying one Teams licence for every person who joins a call. The applicable model depends on how the workload identifies users, whether they participate as Teams users or external meeting participants, which Teams-aligned service is involved and which Microsoft terms apply.</p><p>The commercial decision is therefore straightforward: first classify the calling scenario, then compare its unavoidable licence and usage meters. A per-minute ACS price can look inexpensive until the required identity or Teams product changes who carries the cost.</p><h2 id="start-with-the-retirement-boundary">Start with the retirement boundary</h2><p>Microsoft’s <a href="https://learn.microsoft.com/en-us/azure/communication-services/acs-retirement-and-breaking-changes-guide?ref=samvyo.com">Azure Communication Services retirement and breaking-changes guide</a>, checked on October 29, 2026, gives September 30, 2028 as the retirement date for the affected standalone services. Microsoft defines retirement as permanent removal from Azure; after retirement, a retired service is unsupported and cannot be used.</p><p>That date matters because it prevents a misleading comparison. You cannot evaluate a future Teams-aligned path by looking only at today’s ACS usage charge. You need to establish which part of your implementation remains available, which product or service it must align with and whether that alignment introduces a separate licensing requirement.</p><p>For a white-labelled product, this classification is more consequential than it is for an internal company application. An internal deployment can usually identify its users, assign the relevant licences and pass the cost to one operating budget. A product sold to other organisations has a different boundary: its users belong to customers, may have different identities and may join through different meeting or calling paths.</p><p>That brings the analysis to the meter you can verify today.</p><h2 id="the-acs-usage-meter-is-clear">The ACS usage meter is clear</h2><p>Microsoft’s <a href="https://learn.microsoft.com/en-us/azure/communication-services/concepts/pricing/teams-interop-pricing?ref=samvyo.com">Teams interop pricing page</a> lists ACS consumption for a Teams user participating through ACS APIs or SDKs at <strong>$0.004 per user minute</strong>. The unit is a user minute, so the charge follows the participating user minutes recorded through that ACS path.</p><p>The same pricing material shows native Teams-client participation at <strong>$0 per minute</strong> because that participation is covered by the applicable Teams licence. Those are different billing situations. One is an ACS consumption charge for a user participating through ACS APIs or SDKs; the other is participation through the Teams client under its applicable licence.</p><p>Microsoft’s <a href="https://learn.microsoft.com/en-us/azure/communication-services/concepts/pricing?ref=samvyo.com">Calling and Chat pricing page</a> also lists an ACS over-IP calling rate of <strong>$0.004 per user minute</strong> for VoIP calling and video or audio participant legs. The page notes that a total bill can contain other meters, including recording, PSTN, direct routing, chat and storage.</p><p>The useful conclusion is limited but important. ACS gives you a visible variable charge for the ACS portion of the call. It does not tell you the total cost of a future Teams-aligned architecture, because the future model may add a licence, change the user identity model or introduce other service charges.</p><p>Before comparing totals, separate those units instead of treating them as interchangeable.</p><h2 id="three-user-models-produce-three-different-cost-questions">Three user models produce three different cost questions</h2><p>The first model is an ACS application serving users through ACS APIs or SDKs. In that case, the directly documented consumption input is the ACS user-minute rate. Your forecast needs the number of participating user minutes, the call types that use ACS and any additional meters attached to the workload.</p><p>The second model is a Teams-aligned application in which participants are Teams users. Here, the question is whether each relevant user has the required Teams identity and licence for the specific product configuration. The answer cannot be inferred from the ACS rate alone. It must be confirmed against the applicable Microsoft product terms and the exact calling scenario.</p><p>The third model is a Teams-meeting arrangement in which people join as external participants. This can avoid additional Teams licences for those external participants, depending on the meeting and integration model. It also changes the product. Your application may have less control over identity, meeting policy, user experience and calling features than it had when the product owned the interaction through ACS.</p><p>These models are not interchangeable ways to buy the same thing. A lower apparent licence burden can come with a narrower integration surface, while a richer application experience can place more responsibility on the product owner to resolve identity, licensing and usage costs.</p><h2 id="the-third-party-product-problem">The third-party product problem</h2><p>For a product sold to third parties, the hard question is who is expected to hold the licence. If the Teams-aligned scenario requires licensed Teams users, the product owner must determine whether those users are its own employees, the customer’s employees or people invited into a customer-controlled meeting.</p><p>That distinction changes the feasibility of the model. A company can budget for licences assigned to its staff. It has a much harder commercial and operational problem when every customer organisation must provide appropriately licensed users, or when the product owner is expected to account for users it does not administer.</p><p>Do not turn that problem into a universal rule. Some external-participant models may avoid additional Teams licences for those participants. They may also fail to provide the same product capabilities as a Teams-user or ACS SDK integration. The buyer needs Microsoft to confirm the permitted identity and licensing arrangement for the exact flow before treating the model as a migration plan.</p><p>This is why “the Teams licence costs less than the ACS minutes” is an incomplete conclusion. The licence may attach to a different population, and the product may have to change to qualify for that treatment.</p><h2 id="why-the-0004-rate-is-useful-but-insufficient">Why the $0.004 rate is useful but insufficient</h2><p>The verified $0.004 rate gives you a starting point for the variable side of the comparison. For example, a call with 10 participating user minutes would produce a $0.04 ACS consumption charge before any other applicable meter. That calculation uses only the published per-user-minute rate and the stated 10-minute workload assumption.</p><p>It does not establish a break-even point against a Teams plan. A break-even calculation requires a readable, current price for the applicable Teams product, the licence population, the billing period and the exact relationship between that licence and the calling workload. Those inputs vary by scenario, and a single Teams price would misrepresent the decision.</p><p>Once those inputs are confirmed, the method in <a href="https://samvyo.com/blog/usage-based-vs-flat-licensing-showing-the-crossover-math?ref=samvyo.com">the usage-based versus flat licensing crossover analysis</a> applies directly.</p><p>The practical comparison should therefore be built as a model rather than a headline number:</p>
<!--kg-card-begin: html-->
<table><thead><tr><th>Cost question</th><th>What to measure</th><th>Why it matters</th></tr></thead><tbody><tr><td>ACS consumption</td><td>ACS user minutes through APIs or SDKs</td><td>Applies the documented $0.004 per-user-minute rate to the relevant ACS path.</td></tr><tr><td>Teams-aligned licensing</td><td>Which users need which Teams identity or product licence</td><td>Determines whether the cost sits with your company, your customer or the participant’s existing organisation.</td></tr><tr><td>External participation</td><td>Which users join as external meeting participants</td><td>May avoid additional Teams licences while changing the available integration and product experience.</td></tr><tr><td>Additional service meters</td><td>Recording, PSTN, direct routing, chat, storage and other applicable services</td><td>Prevents the ACS or licence figure from being mistaken for the complete bill.</td></tr></tbody></table>
<!--kg-card-end: html-->
<p>Use the table for a workload-specific forecast. Record the user population, identity path, participant type, minutes and additional services separately. Then ask Microsoft to confirm which product terms apply to that exact configuration.</p><h2 id="what-a-buyer-should-verify-before-staying">What a buyer should verify before staying</h2><p>Ask five questions before treating the existing ACS Calling implementation as the low-risk option.</p><ol><li><strong>Which service supports this workload after the retirement boundary?</strong> Record the Microsoft product name and the dated documentation that covers your particular API, SDK and participant flow.</li><li><strong>Who is a licensed user in this design?</strong> Separate your employees, your customer’s employees, Teams users and external meeting participants.</li><li><strong>What happens when a customer has no suitable Teams licence?</strong> Confirm whether the user can join through an external-participant path and which application capabilities would change.</li><li><strong>Which costs remain usage-based?</strong> Apply the ACS user-minute rate where it still applies, then add the documented rates for recording, PSTN, direct routing, chat, storage or other services in scope.</li><li><strong>Who owns the commercial obligation?</strong> Put the answer in the contract and operating model. A technically valid flow can still be unsuitable if the product owner cannot administer or recover the required licensing cost.</li></ol><p>Microsoft may revise retirement and product documentation before September 30, 2028, so recheck the guide and the applicable pricing and licensing pages before committing to the path. Base the decision on the current documented scenario, and treat continuity of the existing ACS user experience and billing model as something to verify.</p><h2 id="bottom-line">Bottom Line</h2><p>Staying on an ACS Calling path does not automatically create a Teams licence obligation for every caller. The cost depends on whether the workload uses ACS consumption, licensed Teams identities or an external-participant meeting model, and those choices affect the product experience as well as the bill.</p><p>For a third-party white-labelled product, the safest recommendation is to model the user and identity path before comparing prices. Use the documented ACS rate of $0.004 per user minute as one input, obtain written confirmation of the applicable Teams licensing scenario and reject any forecast that assigns one unverified seat price to every customer user.</p><h2 id="whats-next">What's Next</h2><p>Cost is only one part of the replacement decision. The companion guide, <a href="https://samvyo.com/blog/choosing-an-acs-replacement-what-to-check-before-you-commit-again?ref=samvyo.com">Choosing an ACS Replacement: What to Check Before You Commit Again</a>, turns the retirement into a broader evaluation of roadmap durability, deployment control and the ability to leave later.</p><p>Read it after you have mapped your current users, identities and billing meters, because those details determine which replacement options are genuinely comparable.</p><h2 id="faqs">FAQs</h2><h3 id="does-staying-on-acs-calling-always-require-a-teams-licence-for-every-user">Does staying on ACS Calling always require a Teams licence for every user?</h3><p>No. Licensing depends on the Teams-aligned scenario, the identity model and whether people participate as Teams users or external meeting participants. Confirm the exact configuration and applicable Microsoft terms before assigning a licence obligation to every caller.</p><h3 id="what-is-the-acs-price-for-a-teams-user-participating-through-an-acs-sdk">What is the ACS price for a Teams user participating through an ACS SDK?</h3><p>Microsoft lists ACS consumption for a Teams user participating through ACS APIs or SDKs at $0.004 per user minute. The rate applies to that ACS consumption path and does not represent the total cost of every Teams-aligned design.</p><h3 id="can-external-participants-avoid-additional-teams-licences">Can external participants avoid additional Teams licences?</h3><p>Some Teams-meeting integration models allow external participants to join without additional Teams licences for those participants. That model can have different identity, control and feature constraints, so it should be evaluated as a different product flow rather than treated as a like-for-like replacement.</p><h3 id="can-i-calculate-the-break-even-point-between-acs-minutes-and-teams-licences">Can I calculate the break-even point between ACS minutes and Teams licences?</h3><p>Only after you have a verified price for the applicable Teams product, the licence population and the relevant billing terms. The $0.004 ACS rate alone is insufficient to produce a valid break-even point.</p><h3 id="what-else-can-appear-on-an-acs-calling-bill">What else can appear on an ACS calling bill?</h3><p>Microsoft’s Calling pricing documentation identifies additional possible meters, including recording, PSTN, direct routing, chat and storage. Forecast each applicable service separately instead of treating the user-minute rate as the complete bill.</p><h3 id="when-should-a-company-recheck-the-acs-retirement-information">When should a company recheck the ACS retirement information?</h3><p>Recheck Microsoft’s retirement and breaking-changes guide before committing to a migration or long-term licensing model. The guide currently gives September 30, 2028 as the retirement date for the affected services, and product documentation can change before that date.</p>]]></content:encoded></item><item><title><![CDATA[Azure Communication Services Is Retiring: What Actually Goes, What Survives, and What It Costs You]]></title><description><![CDATA[Microsoft is retiring standalone Azure Communication Services on September 30, 2028. Some services disappear, some continue only through Teams-aligned scenarios, and others move to Microsoft 365, Dynamics 365, telephony products or partners. Here is how to classify the change and its cost.]]></description><link>https://www.samvyo.com/blog/azure-communication-services-is-retiring-what-actually-goes-what-survives-and-what-it-costs-you</link><guid isPermaLink="false">6ae81e328b45c3f0cd63aea8</guid><category><![CDATA[CPAAS]]></category><category><![CDATA[Migration]]></category><category><![CDATA[Vendor Lock-in]]></category><category><![CDATA[News]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Mon, 02 Nov 2026 05:29:30 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/11/attempt-462.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/11/attempt-462.jpg" alt="Azure Communication Services Is Retiring: What Actually Goes, What Survives, and What It Costs You"/><p>A team can still be running Azure Communication Services today and discover that its next product decision has already been made for it. Microsoft’s guide says the standalone Azure Communication Services offering retires on <a href="https://learn.microsoft.com/en-us/azure/communication-services/acs-retirement-and-breaking-changes-guide?ref=samvyo.com">September 30, 2028</a>. That date does not describe one uniform migration to Teams. Microsoft has separated ACS capabilities into services that retire, services that continue only in supported Teams-aligned scenarios, and integrated solutions or alternative destinations that follow their own path.</p><p>The practical recommendation is to inventory your ACS dependencies by service and classify each one before choosing a replacement. A product using ACS Rooms or the Web UI Library has a different problem from a calling application that can operate through Teams interoperability. A business using ACS Email, SMS, WhatsApp, or Job Router may be looking at a different destination altogether. Treating every workload as a Teams migration creates the wrong project plan.</p><h2 id="what-microsoft-is-actually-retiring">What Microsoft is actually retiring</h2><p>Microsoft defines retirement as permanent removal from Azure. Once the retirement date arrives, the affected service, feature, model, or SDK will no longer be available or supported under ACS. The authoritative ACS retirement and breaking-changes guide identifies the following services and SDKs as retired:</p><ul><li>ACS Email</li><li>ACS SMS</li><li>ACS Advanced Messaging with WhatsApp</li><li>ACS Chat</li><li>ACS Chat for Teams Meeting Interop</li><li>ACS Rooms</li><li>ACS Number Management (Direct Offer)</li><li>ACS Direct Routing</li><li>ACS Job Router</li><li>ACS Web UI Library SDK</li><li>ACS Mobile UI Library SDK</li></ul><p>These entries belong to the retirement category. Microsoft’s guide points to different destinations depending on the workload. Email customers are directed toward options including Microsoft 365 High Volume Email, Exchange Online, and Marketplace partners. Job Router guidance points toward Dynamics 365 Contact Center and named partners. Direct Routing and number-management workloads have Teams and telephony destinations. Those recommendations describe possible paths for individual services; they do not turn the ACS portfolio into a single Teams product.</p><p>The distinction matters for planning. An application that uses several ACS services may have several migration tracks, each with a different identity model, API surface, operational owner, and commercial structure. ACS Chat also has separate Microsoft guidance stating that Graph Chat is not a drop-in replacement and brings Teams identities, licensing, tenant policies, and governance into the design. The replacement question therefore starts with the service your application actually uses.</p><h2 id="what-continues-with-a-new-condition">What continues, with a new condition</h2><p>Microsoft classifies several capabilities as affected by breaking changes rather than as outright retirements. Those services remain available after the retirement date, but continued support requires use with a supported Teams-aligned service. Microsoft specifically lists Teams Phone Extensibility, Microsoft Teams Meeting Interoperability, and Microsoft Teams Click-2-Call for Teams Voice Apps as the relevant Teams-aligned services in its guide.</p><p>The affected ACS capabilities include:</p><ul><li>Voice and Video Calling SDK</li><li>Call Recording</li><li>Closed Captions</li><li>Call Automation</li></ul><p>The Calling SDK illustrates the boundary. Microsoft says existing calling workloads continue through September 30, 2028, while support after that date requires a supported Teams-aligned scenario. The migration table identifies Teams Meeting Interoperability and says an applicable Teams licence is required. That preserves a supported route for some calling applications, while changing the environment in which those applications operate.</p><p>Recording, captions, and automation have their own eligibility conditions. A Teams-aligned integration does not establish feature parity for every ACS capability. Microsoft says recording remains supported only for documented eligible Teams scenarios, captions depend on SDK capabilities and meeting or calling policies, and Call Automation continues after the retirement date only for capabilities documented for eligible Teams scenarios. Each workload needs a feature-level check before anyone treats the Calling SDK as a complete continuation.</p><p>Microsoft also warns that supported services may introduce additional service costs, licensing costs, or both. The guide gives no universal per-user amount. That cost question deserves its own model because a Teams-aligned route can change who must be licensed and how the application is sold.</p><h2 id="what-remains-supported-as-an-integrated-solution">What remains supported as an integrated solution</h2><p>Microsoft identifies supported integrated scenarios including Microsoft Teams interoperability, Teams Phone, Teams Phone Extensibility, and Microsoft Foundry Speech. This is the third part of the status map. These references describe supported Microsoft solutions and integrations; they are not a blanket statement that every ACS capability outside the retirement list remains unchanged.</p><p>That qualification is important for teams that depend on a surrounding ACS component. A calling workload may have a supported Teams route while its existing UI layer is separately listed for retirement. A speech workflow may remain associated with a supported integrated solution while another communications service in the same product follows a different destination. Read the service entry and the supported-scenario entry together.</p><p>The safest interpretation is therefore service-specific:</p>
<!--kg-card-begin: html-->
<table><thead><tr><th>ACS status</th><th>What it means</th><th>Planning implication</th></tr></thead><tbody><tr><td>Retired</td><td>The service or SDK is permanently removed from Azure after September 30, 2028.</td><td>Plan a replacement or a rebuild for that dependency.</td></tr><tr><td>Breaking change</td><td>The capability remains available when used with a supported Teams-aligned service.</td><td>Validate the Teams scenario, licensing, policies, and feature coverage.</td></tr><tr><td>Supported integrated solution</td><td>Microsoft identifies the solution or integration as supported.</td><td>Confirm that each ACS component your product uses is covered.</td></tr></tbody></table>
<!--kg-card-end: html-->
<p>The table classifies each dependency; every retired one still needs its own migration plan. ACS Rooms, for example, is retired, and Microsoft has separately stated that it has no migration path to Teams meetings.</p><h2 id="the-dates-that-affect-your-project">The dates that affect your project</h2><p>The final retirement date is September 30, 2028. Microsoft says existing ACS resources remain available from the September 2026 notification through that date, subject to the restrictions and support limits described in the guide. Availability during the transition does not mean that retiring services will receive new features or normal product investment.</p><p>The earlier operational date is October 23, 2026. Beginning then, Microsoft says it will limit onboarding to and expansion of retiring ACS services. Customers without an ACS resource created before that date will not be able to acquire phone numbers for retiring telephony workloads, including PSTN calling and SMS. Microsoft also says that additional measures limiting expansion of other retiring services may be introduced after the date.</p><p>Existing customers should therefore separate three questions. Can the current resource continue operating during the transition? Can the team add new numbers, users, or workload capacity? Will the same architecture remain supported after September 30, 2028? A “yes” to the first question does not answer the other two.</p><p>For teams starting a new project, the onboarding restriction is the immediate constraint. For teams with an existing resource, the retirement date is the architectural deadline. Both dates belong in the delivery plan, even when the current application appears stable.</p><h2 id="what-the-retirement-costs-you">What the retirement costs you</h2><p>The cost is determined by the dependency you carry forward. A service that retires outright creates replacement work. A capability that continues through a Teams-aligned scenario can add licensing or service charges. A workload directed to Dynamics 365, Microsoft 365, Microsoft Foundry, or a Marketplace partner may move into a different commercial and operational model.</p><p>Microsoft’s guide explicitly warns that customers may incur additional service costs, licensing costs, or both. It does not publish a universal per-user price for the surviving ACS scenarios, so this article does not attach a dollar amount to staying supported. The correct calculation needs the actual Teams-aligned scenario, the people or identities covered by it, the service meters involved, and the way your product is delivered to its users.</p><p>The economic decision is especially different for an internal application and a product sold to third parties. An internal team can evaluate the licensing model against its own workforce and tenant policies. A software company must also determine whether the required licensing model fits a product whose end users belong to customer organisations. That distinction can change the apparent cost of retaining the Calling SDK, even before engineering work is priced.</p><p>The detailed economics belong in <a href="https://samvyo.com/blog/staying-on-acs-calling-can-mean-buying-teams-licences-what-that-actually-costs?ref=samvyo.com" rel="noreferrer">the companion analysis of enterprise video pricing</a> and <a href="https://samvyo.com/blog/staying-on-acs-calling-means-buying-teams-licences-what-that-actually-costs?ref=samvyo.com">the Teams licensing analysis</a>. The reference decision here is simpler. Do not assume that keeping an ACS API means keeping the same bill.</p><h2 id="how-to-classify-your-acs-dependency">How to classify your ACS dependency</h2><ol><li><strong>List every ACS service and SDK in production.</strong> Include communication features that are hidden behind an internal wrapper or shared component. The Web and Mobile UI Library SDKs, for example, may be doing work that product teams do not count as a separate dependency.</li><li><strong>Assign each dependency to Microsoft’s status category.</strong> Mark it as retired, breaking-change affected, or part of a supported integrated solution. Do not infer the category from the product’s marketing name.</li><li><strong>Record the required destination.</strong> A service may point toward Teams, Dynamics 365, Microsoft 365, Microsoft Foundry, a telephony route, or a Marketplace partner. Capture the specific destination named for that workload.</li><li><strong>Test the product boundary.</strong> Check identity, tenant policy, permissions, SDK support, recording or caption behaviour, call state, and administration. A supported destination can still require product changes.</li><li><strong>Model the commercial change.</strong> Include new licensing and service costs where Microsoft says they may apply. Use the actual scenario rather than a generic Teams price.</li><li><strong>Set the delivery order around the dates.</strong> Treat October 23, 2026 as the onboarding and expansion checkpoint for retiring services, and September 30, 2028 as the end of availability for the retired category.</li></ol><p>If the inventory contains Rooms or either UI Library SDK, the work is a rebuild of that dependency and deserves its own technical plan. If it contains the Calling SDK, the work begins with Teams-scenario eligibility and licensing. If it contains Email, SMS, WhatsApp, Chat, Job Router, Direct Routing, or Number Management, follow the destination Microsoft documents for that service rather than assuming a common Teams migration.</p><h2 id="bottom-line">Bottom Line</h2><p>Azure Communication Services is retiring as a standalone offering on September 30, 2028. The outcome varies by dependency: some services disappear, some continue only through supported Teams-aligned scenarios, and some workloads have destinations in Microsoft 365, Dynamics 365, Microsoft Foundry, telephony products, or the partner marketplace.</p><p>Start with a service-by-service inventory and price the route that Microsoft actually supports. The October 23, 2026 onboarding restriction makes that work an active planning task for new and expanding workloads.</p><h2 id="whats-next">What's Next</h2><p>Rooms is one of the clearest examples of why the status map needs to be read service by service. <a href="https://samvyo.com/blog/acs-rooms-has-no-migration-path-microsoft-said-so-what-that-leaves-you?ref=samvyo.com">The ACS Rooms analysis explains what Microsoft’s lack-of-migration-path statement means for a product built on Rooms</a>.</p><p>For the broader engineering question of what changes when a communications dependency moves, see <a href="https://samvyo.com/blog/what-happens-when-your-video-api-provider-gets-acquired-or-shuts-down?ref=samvyo.com">the guide to provider acquisition and shutdown risk</a>.</p><h2 id="faqs">FAQs</h2><h3 id="is-azure-communication-services-shutting-down-completely">Is Azure Communication Services shutting down completely?</h3><p>Microsoft is retiring ACS as a standalone offering on September 30, 2028. Some services are retired outright, while some capabilities continue only when used with supported Teams-aligned services or other documented integrated solutions.</p><h3 id="what-azure-communication-services-products-are-being-retired">What Azure Communication Services products are being retired?</h3><p>Microsoft lists ACS Email, SMS, Advanced Messaging with WhatsApp, Chat, Chat for Teams Meeting Interop, Rooms, Number Management Direct Offer, Direct Routing, Job Router, and the Web and Mobile UI Library SDKs for retirement. They are scheduled to become unavailable after September 30, 2028 under Microsoft’s retirement guide.</p><h3 id="does-the-acs-calling-sdk-survive">Does the ACS Calling SDK survive?</h3><p>The Voice and Video Calling SDK is classified as a breaking change rather than an outright retirement. Existing workloads continue through September 30, 2028, while continued support after that requires a supported Teams-aligned scenario and an applicable Teams licence.</p><h3 id="what-happens-to-acs-call-recording-and-captions">What happens to ACS Call Recording and captions?</h3><p>Call Recording and closed captions continue only in eligible, documented Teams scenarios after the retirement date. Microsoft says eligibility does not guarantee feature parity, and captions also depend on SDK capabilities, licensing, and meeting or calling policies.</p><h3 id="can-a-new-customer-still-start-using-retiring-acs-services">Can a new customer still start using retiring ACS services?</h3><p>Microsoft says it will begin limiting onboarding and expansion of retiring services on October 23, 2026. Customers without an ACS resource created before that date cannot acquire phone numbers for retiring telephony workloads such as PSTN calling and SMS, and Microsoft may introduce further restrictions on expansion.</p><h3 id="will-staying-on-acs-cost-more-after-the-retirement-announcement">Will staying on ACS cost more after the retirement announcement?</h3><p>It may. Microsoft warns that supported services can involve additional service costs, licensing costs, or both, but its retirement guide does not provide a universal per-user amount. The cost depends on the Teams-aligned scenario or alternative destination, the users and identities involved, and the services your application continues to consume.</p><h3 id="is-every-acs-workload-moving-to-microsoft-teams">Is every ACS workload moving to Microsoft Teams?</h3><p>No single Teams mapping covers the ACS portfolio. Microsoft documents Teams-aligned continuation for selected capabilities, while other workloads point toward Microsoft 365, Dynamics 365, Microsoft Foundry, telephony products, or Marketplace partners.</p>]]></content:encoded></item><item><title><![CDATA[ACS Rooms Has No Migration Path — Microsoft Said So. What That Leaves You]]></title><description><![CDATA[ACS Rooms migration is not an API endpoint swap. Microsoft says Rooms and Teams meetings exist in different environments without a migration path. Here is what a Rooms-based product must inventory and redesign before September 30, 2028.]]></description><link>https://www.samvyo.com/blog/acs-rooms-has-no-migration-path-microsoft-said-so-what-that-leaves-you</link><guid isPermaLink="false">6ae81e338b45c3f0cd63aeb1</guid><category><![CDATA[Migration]]></category><category><![CDATA[Video room api]]></category><category><![CDATA[Vendor Lock-in]]></category><category><![CDATA[video SDK architecture]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Mon, 02 Nov 2026 05:29:25 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/11/attempt-466.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/11/attempt-466.jpg" alt="ACS Rooms Has No Migration Path — Microsoft Said So. What That Leaves You"/><p>Microsoft’s wording leaves little room for a “lift and shift” interpretation: <a href="https://learn.microsoft.com/en-us/azure/communication-services/acs-retirement-and-breaking-changes-guide?ref=samvyo.com">“ACS Rooms and Teams meetings through the Microsoft Graph API offer similar functionality, but exist in two different environments and don't offer a migration path.”</a></p><p>That sentence changes the engineering plan. A product built around ACS Rooms should not treat Teams meetings or Graph online meetings as a replacement endpoint that accepts the same room IDs, participants, roles, and schedules. The practical task is to identify the Rooms control plane your product depends on, choose a target environment, and redesign that layer against the target’s identity, authorization, meeting, and lifecycle model.</p><p>Microsoft lists Teams Meeting interoperability and Microsoft Graph APIs as possible alternatives, but it does not describe either as a Rooms conversion process. The recommendation is therefore straightforward: start a bounded redesign of the Rooms-dependent control plane before the retirement deadline, and validate every assumed mapping instead of promising automatic continuity.</p><h2 id="what-acs-rooms-gave-your-application">What ACS Rooms gave your application</h2><p>ACS Rooms was more than a container around a video call. It provided a server-side model for structured meetings: your application could create and manage rooms, control who belonged to them, assign participant roles, apply schedules, and set room-level security limits.</p><p>Microsoft’s <a href="https://learn.microsoft.com/en-us/azure/communication-services/concepts/rooms/room-concept?ref=samvyo.com">Rooms API documentation</a> describes the model directly. The documented control-plane operations include:</p><ul><li>Creating, retrieving, updating, listing, and deleting Virtual Rooms.</li><li>Adding, updating, and removing users from a room.</li><li>Assigning and updating predefined participant roles.</li><li>Setting and updating a room’s schedule.</li><li>Applying security limits, including restrictions on PSTN dial-out.</li></ul><p>Those operations are the part of the product that needs the closest attention. They are separate from the client media experience and separate from the visual call interface. The Calling SDK and the Web and Mobile UI Library are separate dependencies with their own retirement terms.</p><h2 id="the-rooms-object-model-is-part-of-your-product">The Rooms object model is part of your product</h2><p>A Rooms-based application normally has its own records and workflows around the Microsoft resource. Microsoft’s Rooms quickstart says that, because rooms are server-side entities, developers should track and persist the <code>roomId</code> in their chosen storage medium. That guidance is documented in the <a href="https://learn.microsoft.com/en-us/azure/communication-services/quickstarts/rooms/get-started-rooms?ref=samvyo.com">ACS Rooms creation quickstart</a>.</p><p>That persisted identifier may appear in more places than the API call that created it. It can be associated with a customer, a scheduled session, a participant list, an access policy, an audit record, or an application-specific workflow. The retirement guide does not say that an existing Rooms identifier can be imported into a Graph online meeting. Treat that relationship as application data that needs a deliberate migration or replacement plan.</p><p>The same principle applies to participant identity. The Rooms quickstart states that ACS Communication Services Rooms currently support a participant of type <code>CommunicationUserIdentifier</code>; other Communication Identity types cause a runtime error. A move into the Teams and Graph environment introduces a different identity and authorization context. Existing participant records may still be useful to your application, but their meaning and authorization in the target system must be re-established.</p><h2 id="roles-and-schedules-do-not-carry-across-automatically">Roles and schedules do not carry across automatically</h2><p>The four predefined participant roles in ACS Rooms are Presenter, Collaborator, Attendee, and Consumer. They are documented in the Rooms API reference. These names should not be treated as a portable permission contract.</p><p>Microsoft documents Teams and Graph meetings through a different set of APIs and permissions. The retirement guide does not provide a one-to-one table that maps each ACS Rooms role to a Teams meeting role. The safe engineering assumption is that role intent must be re-evaluated in the target environment. For example, your product may use “Presenter” as a business permission, while the target meeting system may express the relevant capability through meeting options, participant policy, tenant settings, or a different role model.</p><p>Schedules require the same treatment. ACS Rooms lets an application set or update a room’s schedule with <code>validFrom</code> and <code>validUntil</code> values. Those fields describe the validity window of the Virtual Room. They are not evidence that the same values can be transferred into a Graph meeting resource with identical behavior.</p><p>Before choosing a target, document what each schedule field means in your product. A validity window may control when participants can use a room, when your application shows it as active, or when a server-side policy applies. Those are application decisions. The target API must be tested against each one rather than selected because its terminology appears similar.</p><h2 id="why-teams-interoperability-is-not-a-rooms-migration">Why Teams interoperability is not a Rooms migration</h2><p>ACS Rooms does not directly interoperate with Microsoft Teams. Microsoft marks Teams interoperability as unsupported in the Rooms API documentation. The retirement guide points workloads toward Teams Meeting interoperability and Teams-native meeting creation and management APIs depending on their requirements.</p><p>That recommendation identifies possible destinations. It does not establish feature parity, preserve Rooms state, or create a conversion procedure.</p><p>Microsoft’s wording matters here because it explicitly separates the two environments. The relevant systems may support overlapping meeting scenarios, but they do not expose the same operating model. A product that currently controls a Virtual Room through ACS APIs cannot assume that sending the same room record to a Teams or Graph endpoint will produce an equivalent meeting.</p><p>The broad provider-change questions are covered in <a href="https://samvyo.com/blog/the-switching-cost-what-you-actually-rewrite-to-move-video-providers?ref=samvyo.com">the general inventory of what changes when you move video providers</a>. For ACS Rooms, narrow that inventory to the control plane: resource identity, participant state, roles, schedule rules, authorization, and the server-side controls your product actually uses.</p><h2 id="graph-online-meetings-are-a-different-operating-environment">Graph online meetings are a different operating environment</h2><p>Microsoft Graph can create or join online meetings and return meeting coordinates. Participants can join through a <code>joinWebURL</code> or through the create-call API, according to Microsoft’s <a href="https://learn.microsoft.com/en-us/graph/cloud-communications-online-meetings?ref=samvyo.com">online meetings documentation</a>. That gives a product a way to work with online meetings, but it does not make Graph a Rooms-compatible API.</p><p>The authorization model is one visible difference. For an application to call <code>POST /users/{userId}/onlineMeetings</code>, Microsoft requires an application access policy granted by a tenant administrator. The API creates the meeting on behalf of a user. The requirement is described in Microsoft’s <a href="https://learn.microsoft.com/en-us/graph/api/application-post-onlinemeetings?view=graph-rest-1.0&ref=samvyo.com">Create onlineMeeting API reference</a>.</p><p>That changes the questions your product must answer. Which tenant authorizes the application? Which user is the meeting organizer? How are permissions granted and revoked? What happens when the organizer changes? Which part of the experience belongs to your application, and which part is governed by Teams and tenant policy?</p><p>Graph also has behavior that product teams must account for explicitly. Microsoft states that a meeting created through the online-meeting API is a standalone meeting and is not associated with an event on the user’s calendar. It therefore does not appear on that calendar unless the application uses a calendar API as well. A Rooms product that presents scheduled sessions inside its own interface cannot assume that creating a Graph meeting will reproduce the same calendar or scheduling behavior.</p><h2 id="what-the-redesign-should-inventory">What the redesign should inventory</h2><p>Microsoft does not publish a checklist of what a Rooms-based product must change, so bound the inventory by the Rooms capabilities your product actually uses.</p><h3 id="room-creation-and-persistence">Room creation and persistence</h3><p>Find every place where your application creates, stores, retrieves, updates, lists, or deletes a Rooms resource. Record whether the stored <code>roomId</code> is exposed to customers, embedded in URLs, used in webhooks, or joined to business records. Then decide whether the target system needs a new identifier, a translated internal identifier, or an application-owned session record that sits above the target meeting.</p><h3 id="participant-and-identity-handling">Participant and identity handling</h3><p>Document how your application creates a Communication User, adds that user to a room, removes the user, and decides whether the user can join. Compare that behavior with the identity and authorization requirements of the selected Teams or Graph design. Existing customer and participant data may remain valuable, but portability of the data does not prove portability of its permissions.</p><h3 id="roles-and-policy">Roles and policy</h3><p>List the business actions attached to Presenter, Collaborator, Attendee, and Consumer in your application. Do not migrate the labels without testing their meaning. Re-express the underlying business rules in the target environment, where the available meeting roles, policies, and administrative controls may differ.</p><h3 id="validity-and-scheduling">Validity and scheduling</h3><p>Separate the Rooms validity window from the customer-facing schedule. Determine whether your product uses the window to permit joining, to show availability, to enforce a session boundary, or to trigger another workflow. Then test how those behaviors will be implemented around the target meeting resource.</p><h3 id="server-side-controls">Server-side controls</h3><p>Record each control your application applies at room level, including restrictions such as PSTN dial-out. A target environment may offer a related policy, require tenant administration, or provide no equivalent control in the same API. The target decision is incomplete until each important control has a documented implementation or an accepted product change.</p><h2 id="what-to-do-before-the-retirement-date">What to do before the retirement date</h2><p>ACS Rooms will continue receiving security, compliance, and critical reliability updates during the retirement period, but Microsoft says that no new features or enhancements will be introduced. Microsoft defines retirement as permanent removal from Azure, and the guide gives the retirement date as <strong>September 30, 2028</strong>. After that date, retired services are not supported and cannot be used. Both points are stated in the ACS retirement and breaking changes guide.</p><p>That transition window is useful for discovery and validation. It is not a reason to defer the design. Start by capturing the Rooms contract your application relies on, then select the target scenario: Teams Meeting interoperability, Graph-based meeting creation, or another architecture that satisfies the product’s requirements. For each target, test identity, permissions, participant behavior, roles, schedules, meeting creation, and server-side controls with representative workflows.</p><p>Keep the existing Rooms path available while the replacement is being validated, subject to Microsoft’s published retirement terms. Do not describe the project internally as an API endpoint swap. The evidence supports a narrower and more accurate description: the Rooms control plane is moving between different environments, so the application must preserve the product behavior through a redesigned implementation.</p><h2 id="bottom-line">Bottom Line</h2><p>ACS Rooms is retired outright, and Microsoft explicitly says that Rooms and Teams meetings through Graph exist in different environments without a migration path. Teams interoperability and Graph APIs may be target environments, but neither should be treated as a direct import destination for Rooms resources.</p><p>The right first move is to inventory the Rooms control plane your product owns: room identity, participant state, roles, schedules, authorization, and server-side controls. Then validate a redesigned target implementation before the September 30, 2028 retirement date.</p><h2 id="what%E2%80%99s-next">What’s Next</h2><p>Once the Rooms dependency is clear, the next decision is broader than API compatibility. <a href="https://samvyo.com/blog/choosing-an-acs-replacement-what-to-check-before-you-commit-again?ref=samvyo.com">Choosing an ACS replacement</a> looks at the durability and deployment questions to test before committing to another provider.</p><h2 id="faqs">FAQs</h2><h3 id="does-acs-rooms-have-a-migration-path-to-microsoft-teams">Does ACS Rooms have a migration path to Microsoft Teams?</h3><p>No. Microsoft states that ACS Rooms and Teams meetings through the Microsoft Graph API exist in different environments and do not offer a migration path. Teams Meeting interoperability and Graph APIs are alternatives to evaluate, and Microsoft documents no conversion from Rooms to either.</p><h3 id="what-happens-to-acs-rooms-after-september-30-2028">What happens to ACS Rooms after September 30, 2028?</h3><p>Microsoft lists ACS Rooms as retired, with permanent removal from Azure on September 30, 2028. During the retirement period, Rooms receives security, compliance, and critical reliability updates, but Microsoft says no new features or enhancements will be introduced.</p><h3 id="can-existing-acs-room-ids-be-imported-into-graph-online-meetings">Can existing ACS room IDs be imported into Graph online meetings?</h3><p>Microsoft does not publish a procedure stating that ACS room IDs can be imported into Graph online meetings. Treat the existing <code>roomId</code> as application data and define how it relates to a new target meeting or an application-owned session record.</p><h3 id="are-acs-rooms-roles-equivalent-to-teams-meeting-roles">Are ACS Rooms roles equivalent to Teams meeting roles?</h3><p>No equivalence is established by Microsoft’s retirement guidance. ACS Rooms defines Presenter, Collaborator, Attendee, and Consumer, while Teams and Graph use a different API and permission environment, so the business meaning of each role must be re-evaluated.</p><h3 id="can-microsoft-graph-create-a-teams-meeting-for-an-application-user">Can Microsoft Graph create a Teams meeting for an application user?</h3><p>Microsoft Graph can create online meetings on behalf of a user, but the application needs the relevant permissions and an application access policy granted by a tenant administrator. That authorization model is part of why Graph online meetings should be designed as a different environment rather than treated as a Rooms endpoint.</p><h3 id="will-a-graph-created-meeting-automatically-appear-on-the-user%E2%80%99s-calendar">Will a Graph-created meeting automatically appear on the user’s calendar?</h3><p>No. Microsoft says that a meeting created through the online-meeting API is a standalone meeting and is not associated with a calendar event. If your product needs calendar visibility, it must account for calendar integration separately.</p><h3 id="what-should-a-team-built-on-acs-rooms-do-first">What should a team built on ACS Rooms do first?</h3><p>Start by documenting the Rooms operations and policies your product actually uses: room lifecycle, persisted identifiers, participants, roles, schedules, authorization, and server-side controls. Use that inventory to test a target design and to decide which product behavior remains unchanged, which must be redesigned, and which target capabilities are unavailable.</p>]]></content:encoded></item><item><title><![CDATA[The ACS UI Library Is Retiring With No Replacement. Here's What You Rebuild]]></title><description><![CDATA[Microsoft is retiring the ACS Web and Mobile UI Library SDKs after September 30, 2028, without naming a replacement. Here is what survives, what your team must rebuild against the Calling SDK, and why the work extends beyond frontend styling.]]></description><link>https://www.samvyo.com/blog/the-acs-ui-library-is-retiring-with-no-replacement-heres-what-you-rebuild</link><guid isPermaLink="false">6ae81e348b45c3f0cd63aeba</guid><category><![CDATA[Embedded Video]]></category><category><![CDATA[Video SDK]]></category><category><![CDATA[Migration]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Mon, 02 Nov 2026 05:29:20 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/11/attempt-463.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/11/attempt-463.jpg" alt="The ACS UI Library Is Retiring With No Replacement. Here's What You Rebuild"/><p>A prebuilt calling interface can disappear without taking the underlying media service with it. That is the position ACS customers now face: Microsoft's retirement guide lists the Azure Communication Services Web and Mobile UI Library SDKs among the retired services and SDKs, while the underlying Calling SDK remains a separate part of the ACS story.</p><p>The <a href="https://learn.microsoft.com/en-us/azure/communication-services/acs-retirement-and-breaking-changes-guide?ref=samvyo.com">Microsoft retirement and breaking-changes guide</a> says the ACS UI Library will no longer be available after <strong>September 30, 2028</strong>. The same guide names no replacement for the UI Library. That wording matters. It does not establish that no partner or third-party option exists; it tells you that Microsoft has not named a replacement in its current guidance.</p><p>The practical consequence is a product decision. Your application can continue using the existing library during the wind-down, or you can take ownership of the call interface before the support boundary arrives. The work is larger than changing a few buttons because the library sat between your product and the Calling SDK's device, participant, lifecycle, and accessibility details.</p><p>The trade-off between a prebuilt UI kit and a headless SDK, and what each costs later, is priced in <a href="https://samvyo.com/blog/embed-video-options-iframe-ui-kit-or-headless-sdk-and-what-each-costs-later?ref=samvyo.com">the guide to embed video options</a>. For ACS teams, the retirement makes the headless side of that trade-off compulsory.</p><h2 id="what-microsoft-is-retiring">What Microsoft is retiring</h2><p>The retirement applies to the ACS UI Library for web and mobile. Microsoft's overview describes the library as a set of production-ready UI components that developers could add to their applications. The retirement guide separately lists the Web UI Library SDK and Mobile UI Library SDK under retired services and SDKs.</p><p>This is a UI-layer retirement. It does not mean that every ACS calling capability disappears on the same date. The Calling SDK and the UI Library are different layers, so a team can still use the Calling SDK as the media and call-control foundation while replacing the interface that presents those capabilities to users.</p><p>Existing UI Library workloads remain available during the transition period. Support is limited to stability, security, compliance, and critical problems that block normal usage. Microsoft does not plan new features, UI modernisation, or proactive dependency upgrades during that period, so the interface may continue to work while becoming increasingly difficult to evolve safely.</p><p><em>That support boundary turns the retirement date into an engineering deadline, rather than a date to discover a broken application.</em></p><h2 id="what-the-ui-library-was-doing-for-your-product">What the UI Library was doing for your product</h2><p>The easiest way to underestimate this migration is to think of the UI Library as visual decoration. Its documented mobile CallComposite included a pre-call experience for configuring default audio and video devices, followed by an end-to-end call experience with a defined layout and participant video. Those are product behaviours as well as presentation choices.</p><p>A custom replacement therefore needs to make deliberate decisions about at least four areas:</p><ul><li><strong>Device setup:</strong> how people choose microphones, cameras, and speakers before joining, and what happens when permission is denied or a device cannot be read.</li><li><strong>Call presentation:</strong> how local and remote participants appear, how the layout changes as participants or media states change, and how speaker-related information is surfaced.</li><li><strong>Call state:</strong> how the product represents setup, waiting, joining, active calls, disconnection, call ending, and rejoining.</li><li><strong>Accessibility:</strong> how keyboard users, screen-reader users, users who zoom the interface, and users who rely on clear control labels operate the call.</li></ul><p>This is the rebuild surface relevant to the retirement. It is not a complete inventory of every Web, iOS, and Android component or edge case that the UI Library may have supported.</p><h2 id="first-responsibility-devices-and-permissions">First responsibility: devices and permissions</h2><p>A custom call screen has to earn access to the user's devices before it can offer a reliable call experience. Microsoft's <a href="https://learn.microsoft.com/en-us/azure/communication-services/resources/troubleshooting/voice-video-calling/device-issues/overview?ref=samvyo.com">device and permission guidance</a> explains that the Calling SDK requires browser and system permissions for audio and video devices. An application can use <code>DeviceManager.askDevicePermission</code> to trigger the permission prompt, and detailed device-list information also depends on permission.</p><p>That creates several states your UI must represent clearly:</p><ul><li>The user has granted microphone and camera access.</li><li>The user has denied one or both permissions.</li><li>The browser or operating system has blocked access.</li><li>The application cannot show detailed device information yet.</li><li>The selected device is unavailable when the call begins or changes during use.</li></ul><p>The Calling SDK gives you the mechanism. Your product still has to provide the explanation, retry path, device controls, and failure state. A permission prompt alone is not a device experience.</p><p><em>Once devices are available, the next problem is deciding how people and media should occupy the call surface.</em></p><h2 id="second-responsibility-layout-and-speaker-state">Second responsibility: layout and speaker state</h2><p>The UI Library overview describes the mobile CallComposite as providing a clean layout and participant video. Rebuilding that experience means defining how the interface behaves as the call changes, rather than drawing a fixed grid and hoping it remains usable.</p><p>The Calling SDK exposes an <code>isSpeaking</code> boolean for remote participants. Microsoft's <a href="https://learn.microsoft.com/azure/communication-services/how-tos/calling-sdk/manage-calls?pivots=platform-windows&ref=samvyo.com">call-management documentation</a> establishes the available speaker-state input, while the UI Library changelog records Speaker Mode and visual speaker-state behaviour in the video gallery. Your replacement must decide how that input affects presentation: whether the current speaker receives visual emphasis, how the local preview is handled, and what happens when several participants speak or nobody is speaking.</p><p>Those decisions should be explicit because the Calling SDK does not prescribe one universal active-speaker algorithm for every product. The SDK provides state; the application owns the presentation and the interaction model.</p><h2 id="third-responsibility-lifecycle-and-reconnection-states">Third responsibility: lifecycle and reconnection states</h2><p>A call interface is also a state machine. Microsoft's calling-widget tutorial models waiting, setup, and in-call states around the CallComposite. The UI Library changelog records additional behaviours involving disconnecting, call-ended, hold, and rejoining states.</p><p>A product-owned interface should make those states visible and actionable. At minimum, the user needs to understand whether the application is preparing to join, waiting for the call to begin, connected, attempting to recover, ending the call, or ready to rejoin. The exact screens depend on the product, but the responsibility does not disappear when the prebuilt component does.</p><p>Reconnection deserves particular care. A user who sees a frozen layout cannot tell whether the other participant stopped sending media, the network changed, or the application is recovering. The UI needs a coherent status message and a defined next action, even when the underlying SDK supplies only events and state changes.</p><p><em>Lifecycle handling is where a replacement stops being a visual exercise and becomes part of the product's reliability model.</em></p><h2 id="fourth-responsibility-accessibility-and-localisation">Fourth responsibility: accessibility and localisation</h2><p>Microsoft described the UI Library as being developed with usability, accessibility, and localisation in mind. The <a href="https://learn.microsoft.com/en-us/azure/communication-services/how-tos/ui-library-sdk/theming?ref=samvyo.com">UI Library theming documentation</a> and its associated changelog record work involving keyboard navigation, ARIA roles, screen-reader announcements, high-contrast borders, 400% zoom and reflow, and device-control labelling.</p><p>Those examples show the kind of engineering detail that a custom interface inherits. A replacement needs semantic controls, predictable focus movement, announcements for important state changes, usable contrast, layouts that survive zoom, and labels that make device controls understandable. It also needs a plan for translated labels and messages if the existing product serves more than one language.</p><p>The documentation supports accessibility as a responsibility, but it is not a complete WCAG conformance statement. Treat it as a rebuild workstream that requires testing with assistive technologies, rather than as a checklist that can be closed by copying the old visual design.</p><h2 id="what-to-do-during-the-transition">What to do during the transition</h2><p>The recommended path is to build a product-owned UI against the Calling SDK and begin with an inventory of the behaviours your current product actually uses. Record the join flow, device setup, participant presentation, speaker treatment, call controls, lifecycle states, error messages, keyboard paths, screen-reader announcements, and localisation requirements. Then implement and test those responsibilities in that order.</p><p>A fork can provide continuity when the existing UI Library is close to the product you need. Microsoft says customers who need ongoing evolution or dependency modernisation can fork and maintain the library independently. That makes a fork a bridge for preserving a known interface; it also transfers dependency, compatibility, security, and maintenance responsibility to your team. It should not be treated as a Microsoft-supported replacement product.</p><p>The limit is equally important: rebuilding the interface does not remove the need to review the Calling SDK's own lifecycle, permissions, browser, mobile-platform, and release behaviour. The UI Library retirement changes who owns the presentation layer. It does not turn the Calling SDK into a complete application interface.</p><h2 id="bottom-line">Bottom Line</h2><p>Microsoft's current retirement guide names no replacement for the ACS UI Library, and the Web and Mobile SDKs are scheduled to leave availability after September 30, 2028. The durable response is to own the call UI and build it against the Calling SDK, with a fork used only when short-term continuity is more valuable than long-term control.</p><p>The work covers device permissions, layout and speaker state, lifecycle and recovery states, and accessibility. Starting with those responsibilities gives the migration a concrete shape before the support window narrows.</p><h2 id="whats-next">What's Next</h2><p>Owning the UI answers how the product continues to function, but it does not answer whether the remaining ACS Calling path still fits the commercial model. <a href="https://samvyo.com/blog/staying-on-acs-calling-can-mean-buying-teams-licences-what-that-actually-costs?ref=samvyo.com" rel="noreferrer">The Teams licensing analysis</a> works through what staying on the ACS Calling path actually costs.</p><h2 id="faqs">FAQs</h2><h3 id="when-will-the-acs-ui-library-be-retired">When will the ACS UI Library be retired?</h3><p>The ACS Web and Mobile UI Library SDKs will no longer be available after September 30, 2028. Existing workloads remain available during the transition, with support focused on stability, security, compliance, and critical problems that block normal usage.</p><h3 id="does-acs-ui-library-retirement-mean-the-calling-sdk-is-also-retired">Does ACS UI Library retirement mean the Calling SDK is also retired?</h3><p>No. Microsoft's retirement guide lists the UI Library SDKs separately from the underlying Calling SDK. A team can use the Calling SDK as the foundation for a product-owned interface, subject to the separate support and product decisions that apply to that SDK.</p><h3 id="does-microsoft-provide-a-replacement-for-the-acs-ui-library">Does Microsoft provide a replacement for the ACS UI Library?</h3><p>Microsoft's current retirement guide names no replacement for the Web and Mobile UI Library. That statement describes Microsoft's published guidance; it does not establish that no third-party or partner option exists.</p><h3 id="what-has-to-be-rebuilt-when-the-acs-ui-library-retires">What has to be rebuilt when the ACS UI Library retires?</h3><p>The main responsibilities include device setup and permission handling, participant and speaker presentation, call lifecycle states, recovery and rejoining behaviour, and accessibility. The Calling SDK supplies relevant controls and state, while your application owns the screens, explanations, interaction rules, and testing.</p><h3 id="can-an-acs-customer-fork-the-ui-library">Can an ACS customer fork the UI Library?</h3><p>Yes, Microsoft says customers who need ongoing evolution or dependency modernisation can fork and maintain the library independently. A fork can preserve continuity, but your team then owns its dependencies, compatibility, security fixes, and future changes.</p><h3 id="is-rebuilding-the-acs-ui-library-a-small-frontend-change">Is rebuilding the ACS UI Library a small frontend change?</h3><p>It should be planned as a product workstream rather than a styling update. The documented device, layout, call-state, and accessibility responsibilities reach into permissions, asynchronous events, recovery states, assistive-technology behaviour, and platform-specific testing.</p>]]></content:encoded></item><item><title><![CDATA[Choosing an ACS Replacement: What to Check Before You Commit Again]]></title><description><![CDATA[Microsoft’s Azure Communication Services retirement changes the replacement decision. This guide explains how to assess an ACS alternative for roadmap durability, notice terms, portability and deployment control before committing to another provider.]]></description><link>https://www.samvyo.com/blog/choosing-an-acs-replacement-what-to-check-before-you-commit-again</link><guid isPermaLink="false">6ae81e358b45c3f0cd63aecb</guid><category><![CDATA[decision guide]]></category><category><![CDATA[video API provider]]></category><category><![CDATA[Vendor Lock-in]]></category><category><![CDATA[Migration]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Mon, 02 Nov 2026 05:29:16 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/11/attempt-464.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/11/attempt-464.jpg" alt="Choosing an ACS Replacement: What to Check Before You Commit Again"/><p>Your replacement decision changed the moment Microsoft announced that standalone Azure Communication Services will retire. The relevant question is no longer which API has the most attractive feature list. It is whether the next platform gives you enough roadmap clarity, portability, and deployment control to survive the next strategic change.</p><p>Microsoft announced the standalone ACS retirement on September 23, 2026, with the retirement taking effect on September 30, 2028, according to its <a href="https://learn.microsoft.com/en-us/azure/communication-services/acs-retirement-and-breaking-changes-guide?ref=samvyo.com">retirement and breaking-changes guide</a>. The guide separates services that will be permanently removed from services that remain available only in supported Teams-aligned scenarios. It also says that, after the retirement date, standalone ACS scenarios that do not integrate with Teams will no longer be supported.</p><p>That changes how you should evaluate an ACS alternative. The recommendation is to choose the platform that leaves your product with the clearest exit route, even when that means accepting fewer ready-made features today. Test every candidate against four questions: who controls the roadmap, how much notice the contract provides, what can move if the vendor changes direction, and which parts of the media system you can operate under your own control.</p><h2 id="start-with-the-failure-that-brought-you-here">Start with the failure that brought you here</h2><p>A provider exit is not only a migration exercise. It is a test of the assumptions you made when the product was first launched.</p><p>ACS gave many teams a convenient foundation for adding communications to an application. The difficult discovery comes later: the application may depend on the provider's room model, identity model, calling primitives, user interface, recording workflow, number management, or service-specific policy. When the provider retires the standalone product, those dependencies become part of the replacement decision.</p><p>Before reviewing vendors, write down the parts of the current product that users actually experience:</p><ul><li>How users join, authenticate, and receive permission to enter a call.</li><li>How rooms, meetings, participants, tracks, devices, and call state are represented.</li><li>How the product handles camera and microphone permissions, device changes, reconnection, active speaker state, and accessibility.</li><li>Where media travels and where TURN, recording, processing, and storage run.</li><li>Which functions are essential to the product and which were merely convenient additions from the original platform.</li></ul><p>The inventory tells you what the replacement must preserve. It also exposes the components that should belong to your own application rather than being hidden inside another provider's product model. The <a href="https://samvyo.com/blog/the-switching-cost-what-you-actually-rewrite-to-move-video-providers?ref=samvyo.com">switching-cost analysis</a> is useful for working through that inventory before you compare platforms.</p><h2 id="roadmap-durability-comes-before-feature-breadth">Roadmap durability comes before feature breadth</h2><p>A platform can have a strong feature set and still be a poor foundation for a product that must remain stable for years. The ACS retirement demonstrates why: the service can remain available during a transition period while the original standalone operating model loses its long-term support boundary.</p><p>Microsoft describes the ACS transition as a two-year retirement period after the September 2026 announcement. During that period, existing ACS resources and current workloads remain supported under the stated terms, while Microsoft's focus is existing functionality and critical security and stability updates. The guide says Microsoft cannot commit to new feature development for services affected by the retirement.</p><p>Ask each candidate to explain four things in writing:</p><ol><li>Which product and APIs are strategic for the provider.</li><li>Which capabilities are in maintenance mode, preview, or subject to a separate product direction.</li><li>How the provider announces breaking changes, product withdrawals, and ownership changes.</li><li>What happens to your application if a capability is retired without a feature-equivalent successor.</li></ol><p>Do not treat a public roadmap as a guarantee. Treat it as evidence to compare with the contract, service terms, release history, and the provider's behaviour when products change direction. The key distinction is whether the platform's future is aligned with your product's future, rather than whether its current checklist is long.</p><h2 id="read-the-notice-terms-as-an-engineering-requirement">Read the notice terms as an engineering requirement</h2><p>Notice gives you time, but notice alone does not give you continuity.</p><p>Microsoft's <a href="https://learn.microsoft.com/en-us/lifecycle/faq/azure-infrastructure?ref=samvyo.com">Azure infrastructure lifecycle FAQ</a> says the typical notice period for Azure infrastructure retirement is at least 12 months. It also explains that, after retirement, features may be removed, disabled, automatically migrated, or require manual action, and that service-level agreements may no longer apply. Microsoft describes that period as typical rather than a guaranteed minimum for every Azure service.</p><p>Other major cloud terms use their own conditions. The <a href="https://aws.amazon.com/agreement?ref=samvyo.com">AWS Customer Agreement</a> says AWS may provide at least 12 months' prior notice before discontinuing a material functionality of a generally available service that the customer is using, subject to stated exceptions. The <a href="https://cloud.google.com/terms?ref=samvyo.com">Google Cloud Platform Terms of Service</a> describes at least 12 months' notice before discontinuing a service or associated material functionality, unless an exception applies or a materially similar replacement is provided.</p><p>These provisions are useful reference points, but they do not promise feature parity or a migration that preserves your architecture. When you evaluate a replacement, ask the provider to identify the notice period, the exceptions, the treatment of data and recordings, the support available during the transition, and what happens to your application after the end date. Have legal and engineering review the same language. A notice clause that looks acceptable to procurement may still leave engineering with a rewrite.</p><h2 id="measure-portability-at-the-boundaries-that-matter">Measure portability at the boundaries that matter</h2><p>Portability is often discussed as though moving a video product means changing one SDK import. In practice, the difficult boundaries are the ones that connect the provider to the rest of your product.</p><p>Evaluate portability across these surfaces:</p>
<!--kg-card-begin: html-->
<table><thead><tr><th>Boundary</th><th>What to examine</th></tr></thead><tbody><tr><td>Application model</td><td>Whether rooms, meetings, participants, permissions, tracks, and tokens map to concepts your application can own.</td></tr><tr><td>Client experience</td><td>Whether your interface controls device selection, layout, active speaker behaviour, call state, reconnection, and accessibility.</td></tr><tr><td>Media operations</td><td>Where the media path, TURN, recording, processing, and storage run, and how those functions can be moved or retained.</td></tr><tr><td>Data and records</td><td>How recordings, metadata, transcripts, audit information, and user relationships are exported and reconstructed.</td></tr><tr><td>Operations</td><td>Which monitoring, incident response, scaling, and deployment responsibilities remain with your team.</td></tr></tbody></table>
<!--kg-card-end: html-->
<p>Then run a small exit exercise before signing. Model how you would create a room, issue access, establish a call, record it, retrieve the result, and close the session on a second platform. You are testing the seams between your product and the provider. A candidate that leaves those seams in your code gives you more control when the provider changes its terms.</p><p>This is also where the choice between an embedded interface, a UI kit, and a headless SDK matters. The <a href="https://samvyo.com/blog/embed-video-options-iframe-ui-kit-or-headless-sdk-and-what-each-costs-later?ref=samvyo.com">video embed options guide</a> explains why a faster initial integration can leave more product behaviour inside the provider's layer.</p><h2 id="deployment-control-reduces-dependence-within-limits">Deployment control reduces dependence, within limits</h2><p>Deployment control is valuable when it covers the parts of the system that affect data location, network policy, operational continuity, and replacement work. It does not automatically give you independence from the vendor.</p><p>Ask whether you can control the media path, TURN, recording, processing, and storage. Ask which components require the vendor's service, credentials, support, or proprietary control plane. Ask for the answer in deployment documentation and contract terms rather than relying on a sales description.</p><p>A customer-controlled deployment can reduce the amount of infrastructure that must move during a provider change. It cannot establish source-code escrow, perpetual licence rights, independent support, or a guarantee that the complete system will continue operating if the vendor stops providing service. Those protections require explicit contractual and operational arrangements.</p><p>The right criterion is therefore narrower and more useful: choose a platform that gives you meaningful control over the system boundaries you care about, then verify what that control permits in practice.</p><h2 id="build-buy-or-deploy-the-replacement">Build, buy, or deploy the replacement</h2><p>There are three practical paths after an exit. Each places a different amount of responsibility in your organisation. The architectures themselves are compared in depth in <a href="https://samvyo.com/blog/build-buy-or-embed-the-technical-decision-guide-for-video-infrastructure?ref=samvyo.com">the technical decision guide</a> and <a href="https://samvyo.com/blog/white-label-video-infrastructure-build-buy-or-embed-a-decision-guide?ref=samvyo.com">the white-label decision guide</a>; the notes below cover how each path looks after a provider exit.</p><h3 id="build-on-open-source">Build on open source</h3><p>Building on an open-source media stack can give your team greater control over the media layer and the ability to shape the product around your own abstractions. It also makes your team responsible for integration, upgrades, security response, deployment, observability, capacity planning, and the surrounding product experience.</p><p>This path fits an organisation that wants to own the engineering and operations of the communication system as a long-term capability. It is a poor fit when the team wants a finished service and has no capacity to operate the underlying components.</p><h3 id="buy-a-cloud-video-api">Buy a cloud video API</h3><p>A cloud API can shorten the first release and place more of the infrastructure operation with the provider. The trade-off is that your application becomes dependent on the provider's APIs, service terms, pricing model, roadmap, and export capabilities.</p><p>This path fits a product whose requirements align closely with a stable, documented service and whose team has verified the exit terms. It is a weak choice when the provider's abstraction becomes the product's domain model or when a future provider change would require rewriting the client and backend together.</p><h3 id="deploy-a-commercial-platform">Deploy a commercial platform</h3><p>A commercial platform can occupy the middle ground: embeddable SDKs and product components, combined with greater control over deployment and the boundary between your application and the media system. The evaluation must still distinguish a platform that is merely hosted from one that gives you meaningful control over the media path, TURN, and recording.</p><p>Samvyo is one option in this category. Its documented model is based on SFU architecture and provides embeddable SDKs, OEM and white-label depth, and a managed-service option. It describes customer-controlled deployment for the media path, TURN, and recording, including on-premise or managed-cloud arrangements, as set out in its <a href="https://samvyo.com/blog/video-deployment-models-on-prem-managed-cloud-or-saas-and-your-data-story?ref=samvyo.com">deployment-model overview</a>.</p><p>That description does not establish an ACS migration path, Teams interoperability, source-code escrow, perpetual licences, or a guarantee that the complete platform will operate without vendor support. Samvyo also states that it is not the fit when a buyer's needs are already met by a certified SaaS provider's standard terms, or when the buyer needs to operate and modify every layer itself. Those limits belong in the evaluation rather than being hidden behind the deployment model.</p><p>Choose the path whose responsibilities match your organisation. The safest selection is the one you can explain in an exit plan before you sign, including what your team would own if the provider changed direction.</p><h2 id="bottom-line">Bottom Line</h2><p>Choose an ACS replacement for its durability and exit structure before you choose it for its feature list. The provider should give you clear notice terms, a roadmap you can assess, portable application boundaries, and deployment control over the media functions that matter to your product.</p><p>A commercial platform can reduce provider dependence when its deployment model and contract give you real control, but that control has limits. Verify those limits before committing, and keep the application boundary yours from the first release.</p><h2 id="whats-next">What's Next</h2><p>The companion guide, <a href="https://samvyo.com/blog/azure-communication-services-is-retiring-what-actually-goes-what-survives-and-what-it-costs-you?ref=samvyo.com">Azure Communication Services Is Retiring: What Actually Goes, What Survives, and What It Costs You</a>, maps the ACS services that retire, the capabilities that remain in Teams-aligned scenarios, and the dates that shape the decision.</p><p>Read it before turning this selection framework into a migration plan, because the right replacement depends on which part of ACS your product actually uses.</p><p>To make the next exit cheaper whichever platform you choose, <a href="https://samvyo.com/blog/the-seam-abstracting-video-behind-your-own-interface-so-you-can-leave-later?ref=samvyo.com">The Seam</a> shows how to put video behind your own interface so the provider can be swapped later.</p><h2 id="faqs">FAQs</h2><h3 id="what-should-i-look-for-in-an-acs-alternative">What should I look for in an ACS alternative?</h3><p>Look for roadmap durability, clear retirement and breaking-change terms, portable application boundaries, and control over the media path, TURN, and recording. Evaluate those criteria against the specific dependencies in your product rather than comparing feature lists alone.</p><h3 id="when-does-azure-communication-services-retire">When does Azure Communication Services retire?</h3><p>Microsoft's retirement and breaking-changes guide states that the standalone Azure Communication Services offering retires on September 30, 2028. Microsoft also describes an onboarding restriction beginning October 23, 2026 for retiring services, with specific treatment for existing resources and Teams-aligned services.</p><h3 id="does-a-longer-retirement-notice-make-a-video-platform-durable">Does a longer retirement notice make a video platform durable?</h3><p>No. Notice gives your team time to respond, but it does not guarantee a replacement, feature parity, or continued support for the original architecture. Review the notice clause together with export capability, contractual rights, deployment control, and the provider's product direction.</p><h3 id="should-a-company-build-its-own-video-infrastructure-after-the-acs-retirement">Should a company build its own video infrastructure after the ACS retirement?</h3><p>Build on open source when your organisation is prepared to own the media stack, deployment, upgrades, monitoring, and security response as a long-term engineering capability. Buy or deploy a commercial platform when those responsibilities would distract from the product, while checking exactly which parts remain under your control.</p><h3 id="can-samvyo-replace-azure-communication-services-directly">Can Samvyo replace Azure Communication Services directly?</h3><p>Do not assume a direct ACS replacement or Teams interoperability from Samvyo's documented deployment model. Samvyo describes a platform based on SFU architecture with embeddable SDKs, OEM and white-label depth, and customer-controlled options for the media path, TURN, and recording; the buyer must separately validate product fit, migration work, and contractual continuity.</p><h3 id="what-does-deployment-control-protect-against">What does deployment control protect against?</h3><p>Deployment control can reduce the amount of media infrastructure that must move when a provider changes direction, especially when the media path, TURN, recording, processing, and storage are under customer control. It does not by itself provide source-code escrow, perpetual licences, independent support, or a guarantee that every component will keep operating without the vendor.</p><h3 id="how-can-i-test-a-video-platforms-portability-before-signing">How can I test a video platform's portability before signing?</h3><p>Run an exit exercise using a representative workflow: create a room, authenticate a participant, establish a call, handle a device or network change, record the session, retrieve the result, and close the session. Document which data, application code, infrastructure, credentials, and provider services the workflow depends on, then ask the candidate to explain how each dependency would move.</p>]]></content:encoded></item><item><title><![CDATA[School and Campus Video: When the Response Is Lockdown, Not Intervention]]></title><description><![CDATA[In a school emergency the response is usually a lockdown, decided by the school. The video system's job is to tell the people deciding on a lockdown what is happening, and to give responders a live view fast. The harder design problem is everyone else who should not be watching.]]></description><link>https://www.samvyo.com/blog/school-and-campus-video-when-the-response-is-lockdown-not-intervention</link><guid isPermaLink="false">6ad85c888b45c3f0cd63ae72</guid><category><![CDATA[Proactive Surveillance]]></category><category><![CDATA[Ed Surveillance]]></category><category><![CDATA[School Campuses]]></category><category><![CDATA[video compliance]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 21 Oct 2026 06:44:34 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/10/Midnight-Watch-in-the-Security-Room.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/10/Midnight-Watch-in-the-Security-Room.png" alt="School and Campus Video: When the Response Is Lockdown, Not Intervention"/><p>In 2023 the Delhi High Court declined to halt a plan to install nearly 1.5 lakh (about 150,000) cameras in government school classrooms and live-stream them to parents, <a href="https://www.barandbench.com/news/litigation/cctv-cameras-in-delhi-government-schools-delhi-high-court-refuses-to-stay-live-streaming-for-now?ref=samvyo.com"><u>Bar &amp; Bench reported</u></a>. The petitioners, a parents' association and a teachers' association, argued that students had not been consulted and that live footage could reach people who should never see it. The court called the challenge premature and asked the government for its operating procedures.</p><p>That case puts the central design question of school video surveillance in the open. A school's cameras exist for a few minutes of real emergency and thousands of hours of ordinary days, and almost every hard decision is about who may see children on video, and when.</p><h2 id="why-the-response-in-a-school-is-different"><strong>Why the Response in a School Is Different</strong></h2><p>Our pillar post on <a href="https://samvyo.com/blog/proactive-vs-reactive-surveillance-what-proactive-actually-means-and-whos-really-doing-it?ref=samvyo.com"><u>proactive and reactive surveillance</u></a> describes response as the step where someone acts on what the cameras detected. In most commercial settings that means intervening: a voice from a speaker, a guard, a patrol.</p><p>A school's emergency response usually runs the other way. Its emergency plan decides when to lock down, shelter or evacuate, and the job of everyone involved is to make that decision quickly and get it to every classroom. In a building full of children, the response is set by that plan, and a remote operator confronting an intruder is not what it is built around.</p><p>That changes what the video system is for in an emergency. Its job is to:</p><ul><li><strong>Inform the decision.</strong> Show the people who call a lockdown what is happening, where, and how it is moving, within seconds.</li><li><strong>Reach outside responders.</strong> Give arriving police or emergency services a live view of the building they are about to enter, for as long as the incident lasts.</li><li><strong>Record what happened.</strong> Preserve a reliable account for the investigation that follows.</li></ul><p>The CISA's <a href="https://www.cisa.gov/sites/default/files/2024-07/CISA%20K-12%20School%20Security%20Guide%20Companion%20Product%20for%20School-Based%20Law%20Enforcement%20and%20School%20Resource%20Officers_508c.pdf?ref=samvyo.com"><u>K-12 security guidance for school-based law enforcement</u></a> treats monitored CCTV as a detection measure and expects school policies to cover how CCTV feeds are monitored. The protocol belongs to the school; the video system's role is to serve it.</p><h2 id="who-may-watch-children-the-law-behind-school-video-surveillance"><strong>Who May Watch Children: The Law Behind School Video Surveillance</strong></h2><p>On ordinary days the same cameras raise a different question. Children's data is treated more strictly than adults' almost everywhere, and the two regimes most of our readers face draw the lines in specific places. What follows describes what the texts say about processing and access. It is not a statement of what any school is required to install.</p><p><strong>India.</strong>&nbsp; Section 9 of the <a href="https://dpdpa.com/dpdpa2023/chapter-2/section9.html?ref=samvyo.com"><u>Digital Personal Data Protection Act, 2023</u></a> requires verifiable parental consent before processing a child's personal data, and states that a data fiduciary "shall not undertake tracking or behavioural monitoring of children." The <a href="https://dpdp.myndsolution.com/wiki/rules/schedule-4-classes-of-data-fiduciaries-in-respect-of-whom-provisions-of/?ref=samvyo.com"><u>DPDP Rules notified in November 2025</u></a> exempt educational institutions from both requirements, but only where processing is "restricted to tracking and behavioural monitoring" for the institution's educational activities or "in the interests of safety of children enrolled." Law-firm summaries of the Rules, such as <a href="https://www.amsshardul.com/insight/enforcement-of-the-dpdp-act-and-notification-of-the-dpdp-rules/?ref=samvyo.com"><u>AMS Shardul's</u></a>, place the children's consent requirements in the phase that commences on 14 May 2027.</p><p>The exemption is a purpose limit. Cameras for safety sit inside it; the same footage used for something else may not. For a video system, purpose limits turn into access rules: which roles can view which cameras, for what reason, and with a record of who looked.</p><p><strong>United States.</strong>&nbsp; Under FERPA, the US Department of Education's <a href="https://studentprivacy.ed.gov/faq/faqs-photos-and-videos-under-ferpa?ref=samvyo.com"><u>FAQ on photos and videos</u></a> says a video is an education record when it is "directly related to a student" and maintained by the school. Its example is a hallway surveillance video of two students fighting, used in a disciplinary action. Parents may generally inspect such a record, and footage of other students must be redacted first where that can be done without destroying its meaning. Video created and kept by a school's law enforcement unit for a law enforcement purpose falls outside the definition, until a copy is shared into, for example, a disciplinary file.</p><p>Both regimes connect to the general rules covered in our post on <a href="https://samvyo.com/blog/video-recording-compliance-across-the-eu-us-and-india-what-each-regime-demands?ref=samvyo.com"><u>recording rules across the EU, US and India</u></a>. For schools, the common thread is that the purpose and the holder of the footage decide what may be done with it.</p><h2 id="designing-live-access-before-the-incident"><strong>Designing Live Access Before the Incident</strong></h2><p>The access model has to be built in advance, because there is no time to set permissions during a lockdown. Four roles cover most schools:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="95"><col width="110"><col width="227"><col width="216"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Role</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Live view on an ordinary day</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">During an emergency</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Recorded footage</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Safety or security lead</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Entrances, corridors, grounds</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">All cameras</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes, with logged access</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Front office or reception</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Entrance cameras</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Entrances and the affected area</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No by default</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Outside responders</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">None</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Time-limited access to the affected building, ending when the incident closes</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Through a formal request</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Parents</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">None by default</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">None</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Inspection under the applicable law, with others redacted</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The responder row is the one most systems get wrong. A permanent login for the local police is convenient and is also standing access to children on video that nobody reviews. A better design issues access at the moment of the incident, scoped to the cameras that matter and expiring automatically, which is the same principle as issuing <a href="https://samvyo.com/blog/video-sdk-token-auth-keep-the-signing-secret-out-of-the-browser?ref=samvyo.com"><u>short-lived access tokens</u></a> for any video room.</p><h2 id="what-school-video-surveillance-needs-from-the-video-layer"><strong>What School Video Surveillance Needs From the Video Layer</strong></h2><p>The emergency and the ordinary day produce one set of requirements:</p><ul><li><strong>Live views that open in seconds, in a browser.</strong> Decision-makers and responders can't wait for software installs or a recorder interface that loads slowly. A live view on a phone or laptop, opened from an alert, is the useful form.</li><li><strong>Fine-grained, logged access.</strong> Per-role and per-camera permissions, time-limited sharing, and an audit log of who watched what. Purpose limits are only real if the system can enforce and prove them.</li><li><strong>Recording held under the school's control.</strong> Where the footage is stored, and who operates the servers it passes through, decide who else could see it. A school or district answering a parent or a regulator needs to be able to say.</li><li><strong>Retention and redaction that work.</strong> Keep footage for a defined period, then delete it, and be able to redact other children before an inspection. Whether that is practical depends on <a href="https://samvyo.com/blog/composite-vs-per-track-recording-the-choice-that-decides-whether-you-can-redact?ref=samvyo.com"><u>whether a recording can be redacted at all</u></a> in the format it was made in.</li></ul><h2 id="where-live-monitoring-isnt-the-answer"><strong>Where Live Monitoring Isn't the Answer</strong></h2><p>Live-streaming classrooms to parents is the clearest example of a design that maximises viewing and minimises control, and it is the one the Delhi petitioners challenged. More viewers don't make children safer if nobody is responsible for acting on what they see. For most schools, a small number of trained viewers, a clear emergency procedure and well-controlled recording achieve more than wide live access.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>In a school the response is a decision, usually a lockdown, made quickly and communicated to everyone. School video surveillance serves it by putting a live view in front of the decision-makers and responders within seconds, and by keeping everyone else out. Children's data rules in India and the US make access a design requirement: decide in advance who may see what, for what purpose, for how long, and keep the record.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>A school is full of people and the response is to protect them in place. A substation is empty and the response has to travel. Next: why <a href="https://samvyo.com/blog/substation-and-unmanned-site-video-detection-is-worthless-without-a-response-path?ref=samvyo.com"><u>detection is worthless without a response path</u></a> at unmanned sites.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What is school video surveillance used for in an emergency?</strong></p><p>To inform the lockdown or evacuation decision and to give outside responders a live view of the building. The school's emergency plan decides what to do; the video system's job is to show the decision-makers what is happening within seconds and to record it.</p><p><strong>Is CCTV in schools allowed under India's DPDP Act?</strong></p><p>The Act bars tracking or behavioural monitoring of children and requires verifiable parental consent, but the 2025 Rules exempt educational institutions where the processing is for educational activities or the safety of enrolled children. The exemption is purpose-limited, and law-firm summaries place the children's consent obligations from 14 May 2027. Take legal advice on a specific deployment.</p><p><strong>Can parents see school CCTV footage of their child in the US?</strong></p><p>Generally, yes. Under FERPA, a video directly related to a student and maintained by the school is an education record that parents can generally inspect, with other students redacted where feasible. Footage kept by a school's law enforcement unit for a law enforcement purpose is excluded.</p><p><strong>Should police have live access to school cameras?</strong></p><p>During an incident, a live view helps responders. Standing access is harder to justify, because it gives permanent visibility of children without review. Time-limited access issued when an incident starts and revoked when it ends is the safer pattern.</p><p><strong>Should schools live-stream classrooms to parents?</strong></p><p>It widens who can see children without making anyone more able to act. The Delhi government's classroom live-streaming plan was challenged on privacy grounds in the Delhi High Court; as of the January 2023 hearing the court had asked for operating procedures. Most safety goals are met with fewer, trained viewers.</p><p><strong>What should a school look for in a video platform?</strong></p><p>Fast browser-based live views, per-role and time-limited access with an audit log, recording kept under the school's control, and practical retention and redaction. Samvyo, which is based on SFU architecture, delivers live camera feeds to browsers at sub-second latency and supports on-premise deployment, so the media path and recording stay on infrastructure the school or district controls.</p>]]></content:encoded></item><item><title><![CDATA[Substation and Unmanned Site Video: Detection Is Worthless Without a Response Path]]></title><description><![CDATA[At a substation there is nobody to intervene and nobody who can arrive before the event ends. The first response is a decision made far away: is this worth a truck at 3am, the police, or both? Substation video surveillance is the evidence that decision rests on.]]></description><link>https://www.samvyo.com/blog/substation-and-unmanned-site-video-detection-is-worthless-without-a-response-path</link><guid isPermaLink="false">6ad857458b45c3f0cd63ae38</guid><category><![CDATA[Proactive Surveillance]]></category><category><![CDATA[Remote Care]]></category><category><![CDATA[live monitoring]]></category><category><![CDATA[video surveillance]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 21 Oct 2026 06:44:29 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Substation-Road-at-Midnight.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Substation-Road-at-Midnight.png" alt="Substation and Unmanned Site Video: Detection Is Worthless Without a Response Path"/><p>North America's grid security information-sharing centre logged more than 3,500 physical security incidents in 2025, according to the <a href="https://www.nerc.com/globalassets/programs/electricity-isac/2025-e-isac-end-of-year-report.pdf?ref=samvyo.com"><u>E-ISAC's end-of-year report</u></a>. Three percent of them caused an operational disruption. The other 97%, more than 3,300 incidents, still each needed someone to decide whether it was worth sending a crew, calling the police, or doing nothing.</p><p>That decision is what substation video surveillance is for. Our pillar post on <a href="https://samvyo.com/blog/proactive-vs-reactive-surveillance-what-proactive-actually-means-and-whos-really-doing-it?ref=samvyo.com"><u>proactive and reactive surveillance</u></a> describes proactive monitoring as a loop of detect, classify, verify, respond and resolve. At an unmanned site, the respond step starts as a decision made far away, and the video system exists to give that decision good evidence quickly.</p><h2 id="why-nobody-on-site-changes-the-problem"><strong>Why Nobody on Site Changes the Problem</strong></h2><p>At a guarded warehouse or a staffed store, detection can trigger someone nearby. At a substation, a telecom tower or a pumping station there is nobody nearby. The nearest crew may be a long drive away, at night.</p><p>Our post on perimeter detection sets out <a href="https://samvyo.com/blog/perimeter-intrusion-detection-catching-the-loiter-and-probe-before-the-breach?ref=samvyo.com"><u>the race between detection and response</u></a>: the response has to arrive before the intruder finishes. At a remote unmanned site, that race usually can't be won by arrival. Someone stripping copper or cutting through a fence will often be gone before any vehicle gets there.</p><p>So the response path changes shape. It becomes two steps:</p><p>1. <strong>A remote decision.</strong> Someone in a control room looks at the site and decides what is happening and what it warrants.</p><p>2. <strong>A dispatch sized to that decision.</strong> A crew in the morning, a crew now, the police now, or nothing.</p><p>Proactive is the only mode here, because there is no one on site to be reactive with. But the thing it buys is a better decision, made in time to send the right response.</p><h2 id="what-the-15-minutes-in-cip-006-is-for"><strong>What the 15 Minutes in CIP-006 Is For</strong></h2><p>North American utilities have a written deadline for the first step. <a href="https://www.nerc.com/pa/Stand/Reliability%20Standards/CIP-006-6.pdf?ref=samvyo.com"><u>NERC CIP-006-6</u></a>, requirement R1.5, says a utility must "issue an alarm or alert in response to detected unauthorized access" into a physical security perimeter to the people named in its incident response plan "within 15 minutes of detection."</p><p>Two details matter for the video system:</p><ul><li><strong>It is an alert deadline.</strong> The standard puts a clock on getting the right people informed. It says nothing about anyone arriving.</li><li><strong>Its scope is narrow.</strong> It covers physical perimeters around high-impact systems, and medium-impact systems with external routable connectivity. The separate physical-security standard for transmission stations, CIP-014, doesn't apply below 200 kV, as <a href="https://www.rfirst.org/wp-content/uploads/2023/09/Physical-Security-Substations-April-2023.pdf?ref=samvyo.com"><u>ReliabilityFirst's substation security briefing</u></a> notes. Many substations fall under neither.</li></ul><p>So many unmanned sites have no regulatory clock at all, and the ones that do have a 15-minute window to inform people. Video either makes that window useful or wastes it. A raw alarm reaching a control room says that a door contact opened. A live view reaching the same room says who opened it, what they are doing, and whether anyone is in danger.</p><h2 id="triage-at-a-distance-the-job-substation-video-surveillance-does"><strong>Triage at a Distance: The Job Substation Video Surveillance Does</strong></h2><p>The same ReliabilityFirst briefing describes the expected response: the control centre or security operations centre assesses rapidly, then notifies dispatch to contact law enforcement. That assessment is the step most unmanned-site video is not designed for.</p><p>The operator is sorting events into categories that need different responses:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="198"><col width="202"><col width="247"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What the operator is looking at</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What it usually warrants</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What the video must show to decide</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Animal, weather, debris, a sensor fault</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Log it; no dispatch</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A clear view of the alarm zone within seconds</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Vandalism or someone at the fence line, now gone</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A crew in daylight; evidence preserved</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Recorded footage of what happened, and a live view confirming the site now</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Theft in progress (cable, copper, equipment)</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Police now; crew to follow</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Number of people, vehicles, which part of the yard they are in</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A person inside an energised yard</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Police and the utility's own operations, urgently</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Exactly where the person is relative to live equipment</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The last row is about life, as well as assets. Substations are lethal to people who don't know what they are touching. In April 2023 two men died at a substation in Gainesville, Georgia, while trying to steal copper and electrical components, <a href="https://www.cbsnews.com/amp/news/shane-joseph-long-christopher-blair-wood-died-electrocution-breaking-into-power-substation-gainesville-georgia?ref=samvyo.com"><u>CBS News reported</u></a> from the police account. A control room that can see where an intruder is standing can tell responders what they are walking into.</p><p>The volume makes the sorting the main cost. Reporting also varies: the <a href="https://feature.wecc.org/soti2025/soti2025/security/index.html?ref=samvyo.com"><u>WECC's 2025 security review</u></a> counted 220 physical security incidents reported on the federal DOE-417 form in the Western Interconnection in 2024, up from 107 in 2023, and attributes much of the rise to minor incidents reported by a single entity. Either way, most events are minor, and each one costs an operator's attention. Video that lets the operator dismiss the minor ones in seconds is what keeps the control room able to act on the serious ones.</p><h2 id="what-substation-video-surveillance-has-to-survive"><strong>What Substation Video Surveillance Has to Survive</strong></h2><p>Unmanned sites have the worst conditions for live video: thin backhaul, no local IT staff, darkness, and weather. A design that ignores them produces a control room that receives alarms and then waits for video that never loads.</p><p>The requirements follow from the triage job:</p><ul><li><strong>A live substream that fits the link.</strong> Many remote sites connect over cellular or a narrow utility WAN. Across India, average upload speeds in late 2025 ranged from about 2.5 to 8.4 Mbps depending on the operator, per <a href="https://insights.opensignal.com/reports/2026/02/india/mobile-network-experience?ref=samvyo.com"><u>Opensignal's national figures</u></a>, and remote locations sit below the average. A low-bitrate live view that opens instantly is worth more to triage than a full-resolution stream that buffers.</li><li><strong>Full-resolution recording kept on site.</strong> Record at full quality locally, send the live substream to the control room, and pull high-resolution clips only when an incident needs them.</li><li><strong>Camera control that responds.</strong> An operator triaging an event wants to pan, tilt and zoom to the alarm zone. Delay in that loop makes the camera overshoot, which is why <a href="https://samvyo.com/blog/ptz-over-the-web-why-steering-a-camera-is-harder-than-streaming-it?ref=samvyo.com"><u>steering a camera over the web</u></a> is harder than streaming it.</li><li><strong>One control room, many sites.</strong> A utility's sites report into one place. Our post on <a href="https://samvyo.com/blog/multi-site-video-surveillance-architecture-why-connecting-50-sites-to-one-soc-isnt-a-bandwidth-problem?ref=samvyo.com"><u>connecting dozens of sites to one control room</u></a> covers why that is an architecture problem more than a bandwidth one.</li><li><strong>The alarm and the view arrive together.</strong> The operator should never have to find the camera that matches an alarm. The alert should open the right live view, already pointed at the zone.</li></ul><p>Latency matters, but in a specific way. A talk-down needs sub-second audio and video. Triage can tolerate a second or two of delay in the live view, but it can't tolerate the view taking 30 seconds to start, or a PTZ control loop so slow the operator can't frame the scene.</p><h2 id="evidence-for-whoever-arrives-later"><strong>Evidence for Whoever Arrives Later</strong></h2><p>Because the dispatched response arrives after the event, the second job of the video is evidence. The crew needs to know what was damaged and where to look. The police need footage they can use. The utility needs a record for its incident report.</p><p>That means the recording has to survive the incident. Intruders who know where the recorder is can damage it, so footage should leave the site promptly once an event is confirmed, and the copy that matters should be held somewhere the intruder can't reach. Recording, export and retention belong in the response design from the start.</p><h2 id="where-video-doesnt-help"><strong>Where Video Doesn't Help</strong></h2><p>Video doesn't make the drive shorter. If the decision is right and the crew is still far away, the cable is still gone. What video changes is how many trucks roll for nothing, how quickly the right people learn about the serious events, and what they know when they arrive.</p><p>It is also easy to overbuild. If 97% of incidents cause no disruption, a small distribution site may not justify a live-monitored system at all. Recording with a daily review, or alarms with on-demand video, may be proportionate. The design question for each site is what decision someone needs to make about it, and how fast.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>At an unmanned site nobody can intervene in the moment, so the first response is a decision made at a distance. Substation video surveillance earns its cost by making that decision fast and well: a live view that opens with the alarm, a camera the operator can steer, full-resolution evidence kept safe, and a control room that can dismiss the minor events quickly enough to act on the serious ones.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>Unmanned sites are permanent. The opposite problem is a site whose boundary changes as the work progresses. Next: watching <a href="https://samvyo.com/blog/construction-site-surveillance-watching-a-perimeter-that-moves-every-three-months?ref=samvyo.com"><u>a perimeter that moves every three months</u></a> on a construction site.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What is substation video surveillance used for?</strong></p><p>It is mainly for remote triage. Nobody is on site and responders are far away, so video lets a control room operator decide whether an alarm is a false trip, vandalism, theft in progress or a person in danger, and send the right response. It also provides evidence for the crew and the police who arrive later.</p><p><strong>How quickly must a utility respond to a substation intrusion?</strong></p><p>For high-impact and some medium-impact systems in North America, NERC CIP-006-6 requires an alarm or alert to reach the people in the incident response plan within 15 minutes of detection. That is a deadline for informing people. It sets no arrival time, and many substations fall outside its scope.</p><p><strong>Can you do a talk-down at an unmanned substation?</strong></p><p>You can, but it isn't the core response. Talk-down needs sub-second audio and video and works best where a verbal warning is likely to end the event. At a remote substation the main job is deciding what to send, and that depends on a fast-opening live view and camera control more than on audio.</p><p><strong>How much bandwidth does remote site video need?</strong></p><p>Far less than full resolution. A low-bitrate live substream is enough for an operator to triage an event, while full-resolution video is recorded on site and retrieved when needed. Size the live stream to the worst link, because remote sites often run on cellular or narrow utility networks.</p><p><strong>Should substation video be recorded on site or in the cloud?</strong></p><p>Ideally both, in sequence. Record locally at full quality so nothing depends on the link, then move confirmed incident footage off site promptly so an intruder can't destroy it. Platforms such as Samvyo, based on SFU architecture, keep the media path and recording on infrastructure the operator controls, on premises or in its own cloud.</p><p><strong>What does a control room need from unmanned site video?</strong></p><p>An alert that opens the right live view, a camera it can steer without lag, a feed that loads over a thin link, and recorded evidence it can export. Samvyo is one option for the live delivery layer, carrying camera feeds to browser-based control rooms at sub-second latency while the operator keeps control of the media path.</p>]]></content:encoded></item><item><title><![CDATA[Construction Site Surveillance: Watching a Perimeter That Moves Every Three Months]]></title><description><![CDATA[A construction site is a perimeter that gets redrawn every few months, guarded by cameras that run on temporary power and a cellular link. Construction site surveillance only works if the kit can move with the build and the response can reach a site where nobody lives.]]></description><link>https://www.samvyo.com/blog/construction-site-surveillance-watching-a-perimeter-that-moves-every-three-months</link><guid isPermaLink="false">6ad85a408b45c3f0cd63ae59</guid><category><![CDATA[Proactive Surveillance]]></category><category><![CDATA[live monitoring]]></category><category><![CDATA[video surveillance]]></category><category><![CDATA[Remote Care]]></category><category><![CDATA[Remote Monitoring]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 21 Oct 2026 06:44:25 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Night-Construction-Site-and-Surveillance-Tower.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Night-Construction-Site-and-Surveillance-Tower.png" alt="Construction Site Surveillance: Watching a Perimeter That Moves Every Three Months"/><p>On day one, a construction site is a fenced field with a site cabin. Three months later it has a basement, a tower crane and a compound full of plant. Six months after that the scaffold is coming down and the fit-out crews are moving copper pipe and cable into finished floors. The boundary, the valuables and the blind spots change with every phase.</p><p>That is the problem construction site surveillance has to solve, and it changes both halves of the response model in our pillar post on <a href="https://samvyo.com/blog/proactive-vs-reactive-surveillance-what-proactive-actually-means-and-whos-really-doing-it?ref=samvyo.com"><u>proactive and reactive surveillance</u></a>. Detection has to come from cameras that run on temporary power and a cellular link, in positions that will be wrong next quarter. The response has to reach a site where nobody lives, through deterrence first and a call-out second.</p><h2 id="why-construction-site-surveillance-is-a-different-problem"><strong>Why Construction Site Surveillance Is a Different Problem</strong></h2><p>Most surveillance is designed for a building that will look the same in five years. A construction site is the opposite in four ways:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="121"><col width="128"><col width="398"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Property</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Permanent site</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Construction site</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Lifetime</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Years to decades</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Months to a few years</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Power</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Building supply</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Temporary supply, generator, or none at the camera position</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Network</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Fixed line or fibre</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Usually cellular, sometimes nothing</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Perimeter</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Fixed</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Redrawn as each phase starts</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Each row pushes the design the same way. The surveillance system becomes temporary infrastructure, like the hoarding and the site cabin, and has to be planned as kit that gets installed, moved and taken away.</p><p>The target also changes. Early on the risk is plant and fuel. Later it is materials: cable, pipe, fixtures and tools, small enough to carry and worth enough to resell. A camera position chosen for the compound in month two is looking at an empty corner by month eight.</p><h2 id="the-detection-half-power-uplink-and-positions-that-move"><strong>The Detection Half: Power, Uplink and Positions That Move</strong></h2><p>Three practical constraints decide what construction site surveillance can detect and send.</p><p><strong>Power.</strong>&nbsp; Camera positions on a site's edge rarely have a supply. Self-contained towers with solar panels and batteries exist for exactly this, and they trade continuous operation for energy budget. Analytics on the camera, a live stream on demand rather than always on, and infrared that only lights when needed all extend how long a tower runs between visits.</p><p><strong>Uplink.</strong>&nbsp; Most sites send video out over cellular, and upload is the scarce direction. Across India, national average upload speeds in late 2025 ranged from about 2.5 to 8.4 Mbps by operator, according to <a href="https://insights.opensignal.com/reports/2026/02/india/mobile-network-experience?ref=samvyo.com"><u>Opensignal's national figures</u></a>, and coverage drops sharply away from towns. In <a href="http://www.trai.gov.in/sites/default/files/2026-01/PR_No.04of2026.pdf?ref=samvyo.com"><u>TRAI's November 2025 drive tests</u></a>, 21 to 25% of highway samples on the two largest networks had poor signal, against under 3.2% in the city tested. Edge-of-town sites sit somewhere between. Our post on <a href="https://samvyo.com/blog/fleet-video-bandwidth-how-many-camera-feeds-actually-fit-down-a-moving-4g-link?ref=samvyo.com"><u>how many feeds fit down a 4G uplink</u></a> does the arithmetic for vehicles; a site has the same uplink with fewer cameras and more time.</p><p><strong>Positions.</strong>&nbsp; Cameras get moved as the perimeter moves. That means mounts and towers that a site team can relocate, a record of which camera covers what this phase, and a monitoring setup that doesn't break when a camera's location changes.</p><p>The design that fits all three sends a low-bitrate live view only when an event needs a human, and records at full quality on the tower itself. Full-resolution footage crosses the cellular link only when an incident calls for it, an approach covered in <a href="https://samvyo.com/blog/store-and-forward-for-fleet-video-keeping-the-footage-the-network-drops?ref=samvyo.com"><u>keeping the footage the network drops</u></a>.</p><h2 id="the-response-half-deterrence-then-a-call-out"><strong>The Response Half: Deterrence, Then a Call-Out</strong></h2><p>Nobody is resident on most sites out of hours, and the response that works reflects that. It has two steps.</p><p><strong>Deterrence comes first.</strong>&nbsp; A remote operator who sees someone climbing the hoarding at night can light the area and speak to them through a speaker on the tower. On a construction site that can end the event, because an intruder who knows they are being watched has lost the cover the empty site gave them. Deterrence only works if the voice arrives while the person is still deciding, which is why <a href="https://samvyo.com/blog/talk-down-at-ten-seconds-is-theater-the-surveillance-intervention-latency-budget?ref=samvyo.com"><u>the talk-down latency budget</u></a> matters here: audio that lands ten seconds late is talking to someone who already has the cable.</p><p><strong>The call-out comes second.</strong>&nbsp; If deterrence fails, someone has to go. On a construction site that is usually a keyholder, a mobile security patrol, or the police. Each costs money and goodwill, so the operator's job is to call out only when the evidence justifies it, and to tell the responder what they will find: how many people, where on the site, with or without a vehicle.</p><p>That second step is where monitoring economics bite. Every false call-out costs a patrol visit, and every unwatched alert risks a real loss. Our post on <a href="https://samvyo.com/blog/the-operator-to-camera-ratio-that-decides-whether-proactive-monitoring-pays?ref=samvyo.com"><u>what one operator can actually watch</u></a> covers how detection quality sets the number of sites an operator can cover.</p><h2 id="why-the-money-argument-is-about-redeployment"><strong>Why the Money Argument Is About Redeployment</strong></h2><p>A construction site's surveillance has a fixed end date, so the cost question differs from a permanent building's. Buying cameras for one project means writing them off over months. Renting monitoring per site means paying a recurring fee for a system whose positions keep changing.</p><p>The contractor that runs many projects has a third option: own the kit and move it. Towers, cameras and recorders that come off one site at handover and go onto the next turn surveillance into a reusable asset, spread across many projects. That only works if the system was designed to move: self-contained power, cellular rather than site-specific networking, and a monitoring setup where adding and retiring sites is routine.</p><p>Whether that beats renting depends on how many projects a contractor runs at once and how long each lasts. Published figures on construction theft don't settle it either. Registers such as the UK's <a href="https://www.hae.org.uk/wp-content/uploads/2024/06/CESAR-Report-2024.pdf?ref=samvyo.com"><u>CESAR and NCATT reports</u></a> publish recoveries (127 items worth £1.72 million in the first quarter of 2024), not the number of thefts, so the loss side of the calculation has to come from a contractor's own claims history.</p><h2 id="what-construction-site-surveillance-needs-from-the-video-layer"><strong>What Construction Site Surveillance Needs From the Video Layer</strong></h2><p>Put the detection and response halves together and the video requirements are specific:</p><ul><li><strong>Live video that starts fast over cellular.</strong> The operator deciding whether to speak or call out needs a view within seconds of the alert, at a bitrate the uplink can carry at night.</li><li><strong>Two-way audio with low delay.</strong> Deterrence is the first response, and it works only if the voice reaches the person in time.</li><li><strong>Recording that survives the link.</strong> Footage recorded locally and pushed off site once an incident is confirmed, so a stolen or smashed tower doesn't take the evidence with it.</li><li><strong>Sites as a fleet.</strong> Many sites, each changing, monitored from one place, where adding or retiring a site and moving a camera are routine operations.</li></ul><h2 id="where-it-doesnt-pay"><strong>Where It Doesn't Pay</strong></h2><p>Not every site needs live monitoring. A small, short project with little plant and few materials on site may be better served by recording, good lighting and secure storage containers. Live construction site surveillance pays where the value at risk overnight is high, the site is exposed, and a call-out can arrive while it still matters.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>A construction site is temporary, so its surveillance has to be temporary infrastructure too: self-powered, cellular, and easy to move as the perimeter is redrawn. The response is deterrence first and a call-out second, and both depend on live video and audio that reach the operator quickly over a thin link. Kit that moves from project to project is what makes the economics work.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>Deterrence and call-out assume the system should interrupt an intruder. Some sites need the opposite. Next: school and campus video, <a href="https://samvyo.com/blog/school-and-campus-video-when-the-response-is-lockdown-not-intervention?ref=samvyo.com"><u>when the response is lockdown</u></a> and the system's job is to inform a decision.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What is construction site surveillance?</strong></p><p>It is security monitoring for a temporary site whose layout changes as the build progresses. It usually means self-powered camera towers on cellular links, monitored remotely out of hours, with a response of audio deterrence first and a call-out to a keyholder, patrol or police if that fails.</p><p><strong>How do construction site cameras get power and internet?</strong></p><p>Usually through self-contained towers with solar panels and batteries, and a cellular router for connectivity. That makes energy and upload bandwidth the main design limits, so cameras record locally and send live video only when an event needs a human.</p><p><strong>Does talk-down work on construction sites?</strong></p><p>It can, because an intruder who knows they are being watched has lost the cover an empty site gave them. It only works if the operator's voice arrives within a few seconds, which needs low-latency audio and video over the site's cellular link.</p><p><strong>Should a contractor buy or rent construction site surveillance?</strong></p><p>It depends on how many projects run at once and for how long. Contractors with a steady pipeline can own the kit and redeploy it from site to site; occasional projects often suit rented, monitored systems. The kit has to be designed to move either way.</p><p><strong>How much bandwidth does a construction site camera need?</strong></p><p>Far less for live viewing than for recording. Record at full quality on the tower, send a low-bitrate live view only when an operator needs it, and pull full-resolution clips after an incident. Platforms such as Samvyo, based on SFU architecture, deliver live camera feeds to browser-based monitoring at sub-second latency while the operator keeps control of the media path.</p><p><strong>How many construction sites can one monitoring operator cover?</strong></p><p>It depends mainly on how many false alerts each site generates. Better detection lets one operator cover more sites. A video layer that opens a live view in seconds over cellular, such as the one Samvyo provides, shortens each check, but the alert quality sets the ratio.</p>]]></content:encoded></item><item><title><![CDATA[SFU Observability: What to Alert On Before a Call Goes Bad]]></title><description><![CDATA[A user says the call was bad. Their browser stats show one side of one connection. The media server sees every sender and every receiver, which makes it the only place that can say whose network failed. What each SFU exposes, which signals lead, and what a page should contain.]]></description><link>https://www.samvyo.com/blog/sfu-observability-what-to-alert-on-before-a-call-goes-bad</link><guid isPermaLink="false">6ad855f38b45c3f0cd63ae1d</guid><category><![CDATA[Observability]]></category><category><![CDATA[live monitoring]]></category><category><![CDATA[Self-hosted Video]]></category><category><![CDATA[SFU guide]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 21 Oct 2026 06:44:20 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Midnight-Motorway-Traffic.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Midnight-Motorway-Traffic.png" alt="SFU Observability: What to Alert On Before a Call Goes Bad"/><p>A customer reports that yesterday's all-hands was unwatchable. You pull the browser stats from one attendee and find high packet loss on the video they received. That tells you the stream arrived damaged. It can't tell you whether the presenter's uplink failed, the attendee's Wi-Fi did, or the media server between them was overloaded.</p><p>Client-side collection, covered in our post on getStats, stops at exactly that point, and its section on <a href="https://samvyo.com/blog/collecting-webrtc-getstats-evidence-in-production?ref=samvyo.com"><u>what client stats cannot tell you</u></a> says so. SFU observability is the other half. The media server is the only component that sees every sender's uplink and every receiver's downlink at once, which makes it the only place that can say whose network failed.</p><h2 id="what-the-media-server-sees-that-clients-cant"><strong>What the Media Server Sees That Clients Can't</strong></h2><p>An SFU holds a separate connection to every participant, so it measures each direction independently. That gives you five levels of evidence, each answering a different question.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="115"><col width="266"><col width="266"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Level</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What it measures</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The question it answers</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Producer (incoming stream)</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Loss, jitter, NACKs, keyframe requests, bitrate per simulcast layer</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Is this sender's uplink healthy?</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Consumer (outgoing stream)</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Loss and round-trip time to one receiver, the layer being sent</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Is this receiver's downlink healthy?</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Transport</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Estimated available outgoing bitrate, ICE and DTLS state</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">How much can this connection carry, and is it connected at all?</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Worker or node</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">CPU, process health, streams forwarded</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Is the server itself the bottleneck?</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Room and session</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Join latency, participants, failed subscriptions</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Is the service working for people trying to use it?</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The first two rows are what a client can never get. The presenter's browser knows its own uplink, and each viewer knows their own downlink, but only the server holds both for the same stream.</p><h2 id="sfu-observability-in-livekit-mediasoup-and-janus"><strong>SFU Observability in LiveKit, mediasoup and Janus</strong></h2><p>The common open-source SFUs expose this evidence very differently, and that decides how much of your observability is configuration and how much is code.</p><p><strong>LiveKit</strong>&nbsp; ships a Prometheus endpoint. Its <a href="https://github.com/livekit/livekit/blob/master/config-sample.yaml?ref=samvyo.com"><u>sample configuration</u></a> notes that, when enabled, "LiveKit will expose prometheus metrics on :6789/metrics"; it is commented out by default. The <a href="https://github.com/livekit/livekit/tree/master/pkg/telemetry/prometheus?ref=samvyo.com"><u>metric definitions in its source</u></a> cover rooms, participants and tracks, session join latency, NACK, PLI and FIR counts, packet loss, jitter, round-trip time, forwarding latency and a connection quality score. They carry node labels and no room or participant labels, which keeps the metric count manageable and means Prometheus can tell you a node is unhealthy but not which call suffered.</p><p><strong>mediasoup</strong>&nbsp; gives you the raw material and no exporter. Its <a href="https://mediasoup.org/documentation/v3/mediasoup/rtc-statistics?ref=samvyo.com"><u>RTC statistics</u></a> are returned by getStats() on each producer, consumer and transport, including fraction lost, NACK and PLI counts, round-trip time, bitrate per layer and available outgoing bitrate. Events report score changes, layer changes and a worker process dying. Turning that into time series is code you write.</p><p><strong>Janus</strong>&nbsp; offers two routes. Its Admin API is, in the project's own words, "a poll-based protocol," so you query it on a schedule. Its <a href="https://janus.conf.meetecho.com/docs/eventhandlers.html?ref=samvyo.com"><u>event handlers</u></a> push events instead, covering sessions, handles, SDP negotiation, ICE and DTLS state, media statistics and plugin events, to whatever backend you plug in.</p><p>With mediasoup or Janus, that collector is part of <a href="https://samvyo.com/blog/self-hosted-video-cost-what-running-it-yourself-actually-costs?ref=samvyo.com"><u>the running cost inside engineering time</u></a> when you self-host. Whichever stack you run, the useful design splits two jobs. Low-cardinality metrics per node drive alerts. Per-session events and logs, keyed by room and participant, drive the investigation that follows.</p><h2 id="whose-network-failed-sender-receiver-or-server"><strong>Whose Network Failed: Sender, Receiver or Server</strong></h2><p>This is the first question of every call-quality incident, and the server can answer it if you keep sender and receiver quality apart.</p><p>mediasoup makes the split explicit. Each consumer reports a <a href="https://mediasoup.org/documentation/v3/mediasoup/api/?ref=samvyo.com#ConsumerScore"><u>score from 0 to 10</u></a> for the stream it is sending to its receiver, a separate producerScore for the sender's stream it is forwarding, and per-layer scores when the sender uses simulcast. Where a stack doesn't package it as a score, loss and round-trip time measured separately on the incoming and outgoing streams give the same split.</p><p>Read together, the scores point at the failure:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="315"><col width="332"/></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Pattern</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Most likely cause</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Producer score low; every consumer of that stream low too</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The sender's uplink, since every receiver gets the damaged stream</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Producer score healthy; one consumer low</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">That receiver's downlink, since nobody else is affected</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Many consumers low across unrelated rooms on one node</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The server or its network</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Scores healthy, users still complain</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A client-side problem (device, decoder, CPU), so take it to getStats</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The last row matters as much as the first three. A healthy server-side picture rules out the media path quickly, which is often the most useful thing an on-call engineer can establish in the first five minutes.</p><h2 id="signals-that-lead-and-signals-that-lag"><strong>Signals That Lead and Signals That Lag</strong></h2><p>Google's SRE book frames monitoring around <a href="https://sre.google/sre-book/monitoring-distributed-systems/?ref=samvyo.com"><u>four golden signals</u></a>: latency, traffic, errors and saturation. "If you can only measure four metrics of your user-facing system, focus on these four." Mapped onto a media server, they become concrete.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="84"><col width="281"><col width="281"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Signal</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">On an SFU</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Leads or lags?</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Latency</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Join latency (how long until a participant is connected and receiving); forwarding latency through the server</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Leads; the SRE book notes latency increases are "often a leading indicator of saturation"</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Traffic</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Participants, published and subscribed tracks, egress bitrate</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Context for the other three</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Errors</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Failed ICE or DTLS, failed subscriptions, peer connections that never reach connected, worker or process deaths</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A worker death is immediate; a rising failure rate leads</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Saturation</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">CPU per worker, egress against interface capacity, streams per worker</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Leads, if alerted before the ceiling</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Two media-specific signals lead the generic ones. The first is layer downgrades. When <a href="https://samvyo.com/blog/webrtc-bandwidth-estimation-why-your-call-downgrades-before-it-drops?ref=samvyo.com"><u>bandwidth estimation reacts before the user notices</u></a>, the server switches a receiver to a lower simulcast layer, and mediasoup emits a layerschange event when it does. A rising rate of downgrades across a node means quality is being traded away before anyone complains. The second is the keyframe request rate. PLI and FIR counts climb when receivers lose enough packets to need a fresh picture, and a jump across many consumers is an early sign of loss somewhere shared.</p><p>The lagging signals are the ones users produce: participants leaving and rejoining, low scores that have persisted for minutes, support tickets. They confirm an incident and are worth dashboards, but by the time they move, the call already went bad.</p><p>For saturation, our post on SFU scaling covers <a href="https://samvyo.com/blog/sfu-scaling-clustering-cascading-and-where-the-bottleneck-moves?ref=samvyo.com"><u>the capacity ceilings worth alerting on</u></a> in detail and why bitrate and round-trip time make poor alert triggers on their own.</p><h2 id="what-sfu-observability-should-page-on"><strong>What SFU Observability Should Page On</strong></h2><p>The SRE book's rule is that "every page should be actionable." For a media server that excludes most single-participant problems. One attendee on a weak hotel network is real, but nobody on call can fix it at 2am, so it belongs on a dashboard or in a support ticket.</p><p>Page on conditions that affect many people and that an engineer can act on. No published thresholds exist for these, so the numbers below are <strong>design choices to tune against your own baseline</strong>:</p><ul><li><strong>A worker or media process dies.</strong> Page immediately. Every call on it has just dropped or is about to.</li><li><strong>Join failures rise.</strong> For example, more than a few percent of join attempts failing over five minutes.</li><li><strong>Join latency climbs at the high percentile.</strong> For example, the 99th percentile of join latency doubling against the same hour last week. It leads saturation.</li><li><strong>A node approaches a hard ceiling.</strong> For example, sustained CPU per worker or egress above roughly 80% of what you have measured it can carry, so there is time to drain it before calls degrade.</li><li><strong>Many consumers degrade on one node at once.</strong> For example, the share of consumers with a low score or a recent downgrade crossing a set level across unrelated rooms. One room is a participant problem; many rooms on one node is yours.</li></ul><p>Everything else, from single bad consumers to elevated loss in one room, goes to dashboards and to the investigation trail.</p><h2 id="what-the-2am-page-should-contain"><strong>What the 2am Page Should Contain</strong></h2><p>A page that says "SFU node 3 unhealthy" sends the engineer hunting. A useful one arrives with the first answers attached:</p><ul><li><strong>Scope.</strong> The node, how many rooms and participants are on it, and how many are affected.</li><li><strong>Direction.</strong> Whether producer scores, consumer scores or both have dropped, which tells the reader whether to look at senders, receivers or the server.</li><li><strong>Recent change.</strong> Deploys, configuration changes or certificate renewals on that node in the last hour.</li><li><strong>Saturation context.</strong> CPU, egress and streams per worker against their ceilings at the time of the alert.</li><li><strong>The trail.</strong> Links to the per-session events and to the matching client-side getStats records, joined on room and participant IDs.</li></ul><p>That last item is why the identifiers matter. If the server logs and the client collector use the same room and participant IDs, an engineer can go from the alert to the affected sessions to the browser's own view of them in a few clicks.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>The media server is the only place that sees both directions of every stream, so it is where you find out whose network failed. Keep sender and receiver quality apart, watch the signals that lead (join latency, layer downgrades, keyframe requests and saturation), and page only on conditions that affect many people and that someone can act on. Treat every threshold as a design choice and tune it against your own traffic.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>Knowing what to alert on is half the job; knowing who answers is the other. See <a href="https://samvyo.com/blog/who-gets-paged-at-2am-the-failure-modes-of-build-buy-and-embed?ref=samvyo.com"><u>who gets paged at 2am</u></a> under build, buy and embed.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What is SFU observability?</strong></p><p>It is monitoring a selective forwarding unit from the server side: the quality of every incoming and outgoing stream, the health of each server process, and how quickly people can join. It complements client-side getStats, which only sees one connection from one participant's point of view.</p><p><strong>What metrics should I alert on for a media server?</strong></p><p>Worker or process deaths, join failure rate, high-percentile join latency, saturation against measured ceilings, and widespread consumer degradation on one node. Single participants with poor networks belong on dashboards rather than pages.</p><p><strong>How can I tell if a call problem is the sender or the receiver?</strong></p><p>Compare sender-side and receiver-side quality for the same stream. If the incoming stream is degraded, every receiver suffers and the sender's uplink is the cause. If the incoming stream is healthy and one receiver is degraded, the problem is that receiver's downlink.</p><p><strong>Does LiveKit expose Prometheus metrics?</strong></p><p>Yes, when enabled in its configuration it serves Prometheus metrics on port 6789. The metrics are labelled per node, so they are suited to alerting, while per-room investigation needs session-level events or logs.</p><p><strong>Are there standard alert thresholds for WebRTC servers?</strong></p><p>No published standard exists. Treat any threshold as a design choice: measure your own baseline, alert on sustained changes relative to it, and tune after real incidents.</p><p><strong>Can I see server-side media metrics if I use a hosted video API?</strong></p><p>Usually only what the provider chooses to expose. Platforms that keep the media path on infrastructure you control, such as Samvyo, which is based on SFU architecture, let you collect server-side metrics yourself and put them next to client stats for the same session.</p>]]></content:encoded></item><item><title><![CDATA[Internal Certificate Authority for Real-Time Media: Roots, Rotation and Revocation]]></title><description><![CDATA[An internal certificate authority for real-time media has three jobs: get a root onto every device, issue certificates the platforms accept, and take them away again. The third is where most designs fail, because browsers barely check revocation. Short lifetimes do the work instead.]]></description><link>https://www.samvyo.com/blog/internal-certificate-authority-for-real-time-media-roots-rotation-and-revocation</link><guid isPermaLink="false">6ad8552c8b45c3f0cd63ae08</guid><category><![CDATA[Self-hosted Video]]></category><category><![CDATA[Internal Certificate]]></category><category><![CDATA[On-prem Video Conferencing]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 21 Oct 2026 06:44:15 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/10/Dissolving-Key-on-a-Rainy-Workbench.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/10/Dissolving-Key-on-a-Rainy-Workbench.png" alt="Internal Certificate Authority for Real-Time Media: Roots, Rotation and Revocation"/><p>Revoke a certificate on your internal certificate authority, publish the new revocation list, and Chrome will carry on accepting the certificate. According to the US Defense Department's <a href="https://trial.stigviewer.com/stigs/google_chrome_current_windows/2025-05-15/finding/V-221579?ref=samvyo.com"><u>Chrome security checklist</u></a>, if the online-checking policy "is not set, or is set to false, then Chrome will not perform online revocation checks." Most of the revocation machinery a textbook PKI describes is never consulted by the clients that matter most in a video estate.</p><p>Our post on air-gapped video covers <a href="https://samvyo.com/blog/air-gapped-video-conferencing-what-zero-internet-actually-requires?ref=samvyo.com"><u>why an isolated network needs one at all</u></a>: browsers only open cameras on secure pages, and no public CA will vouch for an internal hostname. This post is the operating manual. It covers which endpoints need the CA, how to get its root onto every device, which certificates the platforms will accept, and why rotation does the job revocation was supposed to do.</p><h2 id="what-in-a-video-estate-actually-needs-the-internal-certificate-authority"><strong>What in a Video Estate Actually Needs the Internal Certificate Authority</strong></h2><p>Start by scoping the CA to the endpoints that need it. Fewer certificates means fewer expiry dates, and one category of certificate in a video system never needed a CA at all.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="223"><col width="106"><col width="318"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Endpoint</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Needs the CA?</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Why</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Web app and signalling (HTTPS, WSS)</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Browsers require a trusted certificate before they expose the camera</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">TURN over TLS</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Clients validate the relay's certificate like any TLS server</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Media between client and SFU (DTLS-SRTP)</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Self-signed certificates, verified by a fingerprint carried in signalling</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Recording uploads, webhooks, internal APIs</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Service-to-service TLS; optionally mutual TLS</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Native mobile and desktop apps</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes, with extra work</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Each platform decides separately whether to trust a private root</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Most of these sit at <a href="https://samvyo.com/blog/self-hosted-video-architecture-what-you-actually-run-to-self-host-real-time-video?ref=samvyo.com"><u>the network edge of a self-hosted deployment</u></a>, and the relay is the one teams forget. Clients on restrictive networks fall back to <a href="https://samvyo.com/blog/why-webrtc-breaks-behind-corporate-firewalls-and-the-turn-tcp-fallback-that-fixes-it?ref=samvyo.com"><u>TURN over TLS on port 443</u></a>, and that connection fails silently if the relay's certificate comes from a root the client doesn't trust. The calls that break are exactly the ones on the most locked-down networks.</p><p>The media row is the one that saves work. <a href="https://datatracker.ietf.org/doc/html/rfc5763.html?ref=samvyo.com"><u>RFC 5763</u></a>, which defines how DTLS-SRTP keys are set up, says the certificates "can be self-signed and completely self-generated." The binding comes from a fingerprint of that certificate sent in the SDP. Browsers already generate their own, and media servers can too. Leave media certificates out of the CA's scope.</p><p>That has a consequence worth stating. The fingerprint travels over signalling, so the TLS certificate on your signalling endpoint is what stops someone substituting their own DTLS certificate in the middle. The CA doesn't encrypt the media, but it protects the channel that vouches for the media's keys.</p><h2 id="the-root-offline-constrained-and-distributed"><strong>The Root: Offline, Constrained and Distributed</strong></h2><p>A sound shape for a video estate is two tiers. The root signs an issuing intermediate and is then switched off and stored offline. The intermediate does the daily issuing. If the intermediate is compromised you revoke and replace it with the root, which nobody could reach.</p><p>Constrain the intermediate to your own names. <a href="https://www.rfc-editor.org/rfc/rfc5280.html?ref=samvyo.com"><u>RFC 5280</u></a> defines a name constraints extension that limits which hostnames a CA may issue for, and requires conforming software to recognise it. Put the constraint on the intermediate as well as, or instead of, the root: enforcement of constraints placed on a root has varied, and independent testing found that <a href="https://alexsci.com/blog/name-non-constraint/?ref=samvyo.com"><u>Chrome only began enforcing root name constraints in version 112</u></a> in 2023. With a constrained intermediate, a leaked issuing key can only mint certificates for names under video.corp.example.</p><p>Distribution is where the hours go, because every platform has its own trust store and its own rules.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="84"><col width="281"><col width="281"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Platform</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">How a private root becomes trusted</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The catch</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Windows</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Group Policy or MDM into the machine store</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Chrome and Edge read it; per the </span><a href="https://chromium.googlesource.com/chromium/src/+/main/net/data/ssl/chrome_root_store/faq.md?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Chrome Root Store FAQ</span></a><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> they consider local trust for TCP-based TLS</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">macOS</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Configuration profile into the System keychain, set to Always Trust</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Same FAQ: trust is read from the keychain's SSL setting</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">iOS and iPadOS</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">MDM or Configurator profile</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Manually installed profiles are not trusted for TLS until the user enables them under Certificate Trust Settings, per </span><a href="https://support.apple.com/en-in/102390?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Apple's guidance</span></a></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Android</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Device policy or user install</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Apps targeting API level 24 or later ignore user-added CAs unless their network security config opts in, as the </span><a href="https://android-developers.googleblog.com/2016/07/changes-to-trusted-certificate.html?hl=tr&ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Android team announced</span></a><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> in 2016</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Firefox</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Enterprise roots from the OS store, or the ImportEnterpriseRoots policy</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">On Linux it needs its own import, per </span><a href="https://support.mozilla.org/en-US/kb/setting-certificate-authorities-firefox?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Mozilla's CA guide</span></a></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The Android row matters most if you ship a native app. A browser on the device may trust your root while your own app, built against a modern SDK, rejects the same server. The fix belongs in your app's network security config, so it ships with every build of the app.</p><h2 id="leaf-certificates-the-platforms-will-accept"><strong>Leaf Certificates the Platforms Will Accept</strong></h2><p>Apple publishes explicit requirements, and <a href="https://support.apple.com/103769?ref=samvyo.com"><u>they apply to all TLS server certificates</u></a> on iOS 13, macOS 10.15 and later, with no exception carved out for private CAs:</p><ul><li>RSA keys of at least 2,048 bits, and SHA-2 signatures.</li><li>Hostnames in the Subject Alternative Name. Names in the Common Name are no longer trusted.</li><li>For certificates issued after 1 July 2019, the serverAuth extended key usage, and a validity period of <strong>825 days or fewer</strong>.</li></ul><p>Internal CAs that issue five-year certificates, a common default in older templates, produce certificates that iPhones and Macs refuse. Build your issuing templates to Apple's rules from the start, so no certificate has to be reissued when the first iPhone joins.</p><h2 id="rotation-is-the-control-that-works"><strong>Rotation Is the Control That Works</strong></h2><p>Revocation is a list of certificates to stop trusting. Expiry stops trusting a certificate without anyone needing to check a list. That is why the stronger design for an internal CA leans on short lifetimes and automated renewal.</p><p><a href="https://prof.infra.smallstep.com/docs/step-ca/renewal?ref=samvyo.com"><u>step-ca</u></a>, an open-source CA, issues 24-hour certificates by default and renews them when about two-thirds of the lifetime has passed, retrying every minute if renewal fails. Its documentation calls short lifetimes "passive revocation." A stolen 24-hour certificate is useless by tomorrow, whether or not any client checks a list. It also supports ACME, the protocol public CAs use for automated issuance, so the same tooling that renews public certificates can renew internal ones.</p><p>For an isolated network this settles a real tension. Short lifetimes are only safe if renewal never depends on reaching outside, so the CA and its ACME endpoint must sit inside the boundary along with everything else. Once they do, renewal is routine and expiry stops being a scheduled outage.</p><p>Three rotations need planning beyond the leaves:</p><ul><li><strong>Intermediate.</strong> Issue the new intermediate from the root while the old one is still valid, deploy the new chain to servers, then let the old intermediate's leaves age out. With 24-hour leaves that takes a day.</li><li><strong>Root.</strong> Distribute the new root to every device well before anything chains to it. This is the slow one, because it runs at the speed of your MDM and your least-managed device.</li><li><strong>Server reload.</strong> Check that each component reloads a renewed certificate without a restart. A TURN server or media server that only reads its certificate at startup turns a routine renewal into a dropped call.</li></ul><p>Short lifetimes have one gap. Renewal lets anyone holding a private key keep extending the certificate, so step-ca's documentation warns that a retired certificate still has to be explicitly revoked on the CA, to stop it renewing.</p><h2 id="revocation-what-actually-checks-it"><strong>Revocation: What Actually Checks It</strong></h2><p>The opening line was not an exaggeration. Chromium-based browsers stopped making online OCSP and CRL checks for most certificates years ago; Microsoft Edge aligned with Chrome in 2018, as Eric Lawrence's <a href="https://textslashplain.com/2022/08/01/certificate-revocation-in-microsoft-edge/?ref=samvyo.com"><u>account of Edge's revocation behaviour</u></a> explains. What Chrome does check by default is CRLSet, a list Google pushes for publicly trusted CAs. A certificate from your internal CA will never be on it.</p><p>Online checks for private roots exist, but only by policy. Edge's RequireOnlineRevocationChecksForLocalAnchors <a href="https://learn.microsoft.com/en-ie/deployedge/microsoft-edge-browser-policies/requireonlinerevocationchecksforlocalanchors?ref=samvyo.com"><u>policy</u></a> makes it "always" check certificates from locally installed CAs, and its description says certificates whose status can't be fetched are treated as revoked. It is supported on Windows only. That is a defensible setting for a managed Windows fleet, and an outage risk if the CRL host ever goes down.</p><p>So publish a CRL, for the clients and services that do check it: your own backend services, recording and storage components, and anything you configure to verify. Point its distribution URL inside your network, which RFC 5280's CRL distribution points extension supports. Skip OCSP. The public ecosystem is retreating from it, and <a href="https://letsencrypt.org/2024/12/05/ending-ocsp/?ref=samvyo.com"><u>Let's Encrypt switched its OCSP responders off</u></a> on 6 August 2025, citing privacy and the cost of running them. An internal responder is one more service to keep available, for clients that mostly won't ask it.</p><p>The practical order of defences is short lifetimes first, then an explicit revoke on the CA so the certificate can't renew, then a CRL for the components that read one.</p><h2 id="where-the-internal-certificate-authority-stops-and-media-keys-begin"><strong>Where the Internal Certificate Authority Stops and Media Keys Begin</strong></h2><p>The CA authenticates servers and protects the signalling that carries DTLS fingerprints. It doesn't make the media private from the media server, because every hop's encryption ends at the SFU. If the threat is the server operator, that is a separate layer with its own keys, covered in our post on <a href="https://samvyo.com/blog/end-to-end-encryption-for-group-video-what-sframe-protects-and-what-it-breaks?ref=samvyo.com"><u>end-to-end encryption for group video</u></a>.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Scope the internal certificate authority to the endpoints that need it, keep the root offline and the intermediate constrained, and build leaf templates to Apple's rules. Then treat rotation as your main control, because the browsers your users run will not consult your revocation list unless you force them to.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>A CA that renews certificates every day needs someone watching when renewal fails. Next: <a href="https://samvyo.com/blog/sfu-observability-what-to-alert-on-before-a-call-goes-bad?ref=samvyo.com"><u>what to alert on before a call goes bad</u></a> on the server side of a video estate.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>Why do I need an internal certificate authority for self-hosted video?</strong></p><p>Browsers only allow camera and microphone access on secure pages, so the web app and signalling endpoint need certificates the browser trusts. On an internal or isolated network no public CA will issue those, so an internal certificate authority issues them and its root is installed on every device.</p><p><strong>Does WebRTC media need certificates from my CA?</strong></p><p>No. DTLS-SRTP uses self-signed certificates, and RFC 5763 binds them with a fingerprint sent in the SDP. What the CA secures is the signalling channel that carries the fingerprint.</p><p><strong>Does Chrome check my internal CA's revocation list?</strong></p><p>Not by default. Chrome makes no online OCSP or CRL checks unless a policy enables them, and its built-in CRLSet only covers publicly trusted CAs. Short certificate lifetimes are the more reliable control.</p><p><strong>How long should internal certificates last?</strong></p><p>As short as your renewal automation can sustain. step-ca defaults to 24 hours and renews automatically, and Apple rejects any TLS server certificate valid for more than 825 days. Hours to days is a good target where renewal runs inside your network.</p><p><strong>Why does my mobile app reject a certificate the phone's browser accepts?</strong></p><p>On Android, apps targeting API level 24 or later don't trust user-added CAs unless their network security config opts in. On iOS, a manually installed root has to be enabled under Certificate Trust Settings; MDM-installed roots are trusted automatically.</p><p><strong>Who owns the certificates in an on-premise video deployment?</strong></p><p>You do, for every endpoint inside your network. With an on-premise deployment of a platform based on SFU architecture, such as Samvyo, the media servers, TURN relays and recording run on infrastructure you control, so their TLS certificates come from your CA and your renewal schedule.</p>]]></content:encoded></item><item><title><![CDATA[End-to-End Encryption for Group Video: What SFrame Protects, and What It Breaks]]></title><description><![CDATA[End-to-end encryption for group video means the server forwarding your call cannot read it. SFrame makes that possible, but the server still sees who is talking and when, and anything that needs the media must hold a key. The claim is only as strong as whoever hands the keys out.]]></description><link>https://www.samvyo.com/blog/end-to-end-encryption-for-group-video-what-sframe-protects-and-what-it-breaks</link><guid isPermaLink="false">6ad853fe8b45c3f0cd63adf0</guid><category><![CDATA[E2EE]]></category><category><![CDATA[Encryption]]></category><category><![CDATA[WebRTC]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 21 Oct 2026 06:44:11 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/10/Midnight-Meeting-Behind-Frosted-Glass.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/10/Midnight-Meeting-Behind-Frosted-Glass.png" alt="End-to-End Encryption for Group Video: What SFrame Protects, and What It Breaks"/><p>Turn on end-to-end encryption in a Zoom meeting and its own <a href="https://support.zoom.com/hc/en/article?id=zm_kb&sysparm_article=KB0065408&ref=samvyo.com"><u>support documentation</u></a> lists what switches off: cloud recording, live transcription, live streaming, the AI features, polling and the whiteboard. Phone and SIP participants can't join, nor can its Web App and Web SDK clients, and the meeting is capped at 1,000 people.</p><p>That list is the visible price of end-to-end encryption for group video, and our post on video deployment architecture <a href="https://samvyo.com/blog/video-deployment-architecture-where-the-media-flows-and-what-you-can-prove?ref=samvyo.com"><u>already lists what that costs</u></a> in general terms. This post covers the less visible part: what the server forwarding your call can still see, which features keep working, and the question that decides whether the claim is true at all, namely who holds the key.</p><h2 id="why-an-sfu-gets-in-the-way-of-ordinary-encryption"><strong>Why an SFU Gets in the Way of Ordinary Encryption</strong></h2><p>Every WebRTC call is already encrypted. DTLS-SRTP protects each hop, but an SFU sits at the end of a hop. Media arrives at the server, is decrypted, and is re-encrypted for every subscriber. In a two-person call that terminates at the other browser; in a group call through an SFU it terminates at the server.</p><p>The server needs that access for ordinary work. It reads RTP headers to route packets, reads RTCP feedback to manage bandwidth, and drops layers when a subscriber's link is weak. The <a href="https://www.rfc-editor.org/rfc/rfc9605.html?ref=samvyo.com"><u>SFrame specification, RFC 9605</u></a>, exists because full encryption would blind the server to exactly the information it needs to forward media.</p><p>SFrame's answer is a second layer. The sender encrypts each media frame with a key the server never receives, then hands the encrypted frame to the normal WebRTC stack, which wraps it in SRTP as usual. The server removes the outer layer and finds a frame it cannot read.</p><h2 id="what-sframe-encrypts-and-what-the-sfu-still-sees"><strong>What SFrame Encrypts, and What the SFU Still Sees</strong></h2><p>SFrame encrypts the media payload. Almost everything around it stays visible to the server, and some of it says a lot about the call.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="181"><col width="186"><col width="279"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Item</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Visible to the SFU?</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What it reveals</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Media payload (the audio and video)</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Nothing; this is what SFrame protects</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">SFrame header: key ID and counter</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes, authenticated but not encrypted</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Which participants are sending, and at what frame rate</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">RTP headers and timestamps</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Stream structure, timing, packet sizes</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Audio level header extension</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Who is speaking, packet by packet</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Signalling and room events</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Depends on the platform</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Who joined, when, and from where</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>RFC 9605 is direct about the header: an observer can learn "which parties are sending media" from the key IDs and at what rates from the counters, and the key-ID structure can expose epoch counts and sender identifiers. The audio level extension is the sharper leak. <a href="https://www.rfc-editor.org/rfc/rfc6464.html?ref=samvyo.com"><u>RFC 6464</u></a> notes that because SRTP authenticates header extensions without encrypting them, "audio levels are therefore visible on a packet-by-packet basis," and an observer "might be able to infer information about the conversation." An SFU uses that extension to pick the active speaker, so it keeps receiving it.</p><p>Put together, end-to-end encryption for group video hides what was said. It does not hide who was in the call, who spoke, for how long, or when. For many threat models that is enough. For some, the metadata is the secret.</p><p>There is a second limit the specification states plainly: SFrame does not provide per-sender authentication. Every participant holds the keys needed to encrypt as any sender, so a malicious participant can impersonate another inside the call. The server is locked out; the other participants are trusted completely.</p><h2 id="what-keeps-working-forwarding-and-layer-selection"><strong>What Keeps Working: Forwarding and Layer Selection</strong></h2><p>A common assumption is that encryption stops the SFU from adapting quality. It doesn't, provided the stream is built for it.</p><p>RFC 9605 requires each simulcast layer to be encrypted separately, and each scalable (SVC) layer to be its own SFrame ciphertext, so that the SFU can still drop layers it doesn't need to forward. The server reads layer information from RTP headers and header extensions, never from the payload. If you want a refresher on <a href="https://samvyo.com/blog/what-is-simulcast-and-when-does-it-save-or-waste-bandwidth?ref=samvyo.com"><u>how simulcast layers work</u></a>, that is the mechanism being preserved.</p><p>The <a href="https://aomediacodec.github.io/av1-rtp-spec/?ref=samvyo.com"><u>AV1 RTP payload specification</u></a> goes further. Its Dependency Descriptor header extension was designed so an intermediary can forward frames "when the RTP payload is encrypted end-to-end," without parsing the bitstream at all.</p><p>What does break is any server logic that peeks into the codec payload. Some SFUs detect keyframes or read codec-specific descriptors from inside the frame, and that information is now ciphertext. Mozilla's WebRTC team describes the practical consequence in its <a href="https://blog.mozilla.org/webrtc/end-to-end-encrypt-webrtc-in-all-browsers/?ref=samvyo.com"><u>guide to end-to-end encryption in all browsers</u></a>: applications must know which bytes to leave unencrypted so the packetizer keeps working, and for some codecs, H.264 among them, that takes trial and error.</p><p>Two smaller costs come from encrypting whole frames. A receiver can't decode part of a frame, because the frame only authenticates once all of it has arrived. And key rotation can delay video for someone who has just joined, because they have to wait for a keyframe encrypted under a key they hold.</p><h2 id="what-stops-working-anything-that-needs-to-see-the-media"><strong>What Stops Working: Anything That Needs to See the Media</strong></h2><p>The list in Zoom's documentation has one cause. Every feature on it needs the server to see or hear the media, and under end-to-end encryption the server can't.</p><ul><li>Recording on the server produces ciphertext. A useful recording has to come from something that holds a key.</li><li>Transcription, captions, noise processing in the cloud and any <a href="https://samvyo.com/blog/on-prem-ai-video-running-inference-without-sending-media-to-a-third-party?ref=samvyo.com"><u>AI that has to read the media</u></a> lose their input.</li><li>Phone and SIP gateways have to decrypt to translate media into a format the other network understands, so a gateway becomes a participant with a key, or the call excludes it.</li><li>Live streaming to a CDN needs decoded media at some point, with the same consequence.</li></ul><p>The honest workaround is to make the component a participant. A compliance recorder that joins the call, holds the key and records it is legitimate, as long as everyone can see it is there. It also means the call is end-to-end encrypted <em>between the participants, one of which is a recorder</em>, which is a weaker sentence than most marketing pages use.</p><h2 id="end-to-end-encryption-is-a-key-management-claim"><strong>End-to-End Encryption Is a Key-Management Claim</strong></h2><p>SFrame encrypts frames. It deliberately says nothing about where the keys come from. RFC 9605 puts key exchange out of scope and describes two patterns an application can use: sender keys distributed over an existing end-to-end secure channel, or keys derived from an MLS group.</p><p>That gap is where most of the security lives. LiveKit's <a href="https://docs.livekit.io/transport/encryption/?ref=samvyo.com"><u>encryption documentation</u></a> is a clear example: its built-in key provider uses "a single shared key for the whole room," which the server typically generates when the room is created and distributes <a href="https://samvyo.com/blog/video-sdk-token-auth-keep-the-signing-secret-out-of-the-browser?ref=samvyo.com"><u>the same way the platform hands out access tokens</u></a>. Per-participant keys and rotation need a custom key provider. The documentation is careful to say LiveKit does not store or transport keys itself, and that signalling is still readable by the server.</p><p>That design is reasonable for keeping media unreadable to a cloud SFU operated by someone else. But if the same organisation runs the SFU and the service that generates keys, it can read the media by design. The test for any group-video encryption claim is one sentence long. Can the party that operates the media server obtain the key?</p><p>A strong answer to that question needs three properties:</p><ul><li><strong>Keys are agreed between clients.</strong> No server generates the media key or sees it in transit.</li><li><strong>Keys change when membership changes.</strong> RFC 9605 says clients should rekey when participants join or leave, so a new joiner can't decrypt earlier media and a departed one can't decrypt later media.</li><li><strong>Identity is verified out of band.</strong> Otherwise the server can add a participant it controls, and that participant receives the key legitimately.</li></ul><p><a href="https://datatracker.ietf.org/doc/rfc9420/?ref=samvyo.com"><u>Messaging Layer Security, RFC 9420</u></a>, is the IETF standard built for the first two. It gives a group forward secrecy and post-compromise security, and its key operations cost scales "as the log of the group size," which is what makes rekeying on every join practical for groups ranging "from two to thousands." The third property is a product decision: safety numbers, verified devices, or an identity provider the server can't impersonate.</p><h2 id="the-browser-side-in-2026"><strong>The Browser Side in 2026</strong></h2><p>The browser API this depends on is now available everywhere. RTCRtpScriptTransform, which lets a worker see and rewrite each encoded frame, is <a href="https://developer.mozilla.org/docs/Web/API/RTCRtpScriptTransformer?ref=samvyo.com"><u>Baseline on MDN since October 2025</u></a>, after Chrome shipped WebRTC Encoded Transform in <a href="https://developer.chrome.com/release-notes/141?ref=samvyo.com"><u>Chrome 141</u></a> on 30 September 2025. Safari and Firefox had already implemented it natively.</p><p>What browsers don't give you is SFrame itself. The native SFrameTransform interface was still "in limbo" when Mozilla's team wrote its guide in February 2024, so applications implement SFrame in script inside the transform. That puts the cryptography, the key handling and the packetizer details in your code.</p><p>The bandwidth overhead is small for video and noticeable for audio. RFC 9605 assumes 22 bytes per encrypted frame. The arithmetic, at 1,000 bits per kilobit:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="243"><col width="125"><col width="125"><col width="153"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Stream</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Frames per second</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Added bitrate</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Share of codec bitrate</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Video at 1,500 kbps</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">30</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">5.3 kbps</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">0.4%</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Video at 300 kbps</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">30</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">5.3 kbps</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1.8%</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Opus audio at 32 kbps, 20 ms frames</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">50</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">8.8 kbps</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">27.5%</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Audio sends more frames than video and each one is small, so the fixed per-frame cost weighs more. On a constrained link that is worth budgeting for.</p><h2 id="when-end-to-end-encryption-is-the-wrong-tool"><strong>When End-to-End Encryption Is the Wrong Tool</strong></h2><p>End-to-end encryption answers one threat: the operator of the media server reading your media. If that operator is a vendor you would rather not trust, it is the right answer, and its costs are the price of that guarantee.</p><p>If the server operator is you, the calculation changes. A regulated organisation that must record and retain calls, transcribe them, or run analytics needs a server that can see the media. Encrypting the media end to end and then adding a recorder that holds the key gives you most of the costs and a weaker version of the claim. Running the media server, relay and recorder inside your own boundary keeps every feature and keeps the media away from any third party, without pretending the server is blind.</p><p>The question to ask is who you are protecting the media from. The answer picks the architecture.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>SFrame lets an SFU forward media it can't read, and layer selection and active-speaker detection survive. What it doesn't hide is who spoke and when, and what it can't protect is a key that the operator generated. An end-to-end encryption claim is only as strong as the answer to one question, which is whether whoever runs the media server can get the key.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>Keys aren't the only trust root a self-hosted media estate has to run. Next: <a href="https://samvyo.com/blog/internal-certificate-authority-for-real-time-media-roots-rotation-and-revocation?ref=samvyo.com"><u>running your own certificate authority</u></a> for real-time media, from root distribution to rotation.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>Does end-to-end encryption for group video work with an SFU?</strong></p><p>Yes. SFrame, defined in RFC 9605, encrypts each media frame with a key the SFU never receives, while leaving the headers the SFU needs for forwarding and layer selection readable. The server can route the media but can't decode it.</p><p><strong>What can the server still see in an end-to-end encrypted call?</strong></p><p>Who is sending media and at what rate, packet timing and sizes, and the audio level of each packet, which reveals who is speaking. Signalling such as joins and leaves is usually visible to the platform too. The content of the audio and video is what stays hidden.</p><p><strong>Can you record an end-to-end encrypted video call?</strong></p><p>Only with something that holds a key. A server-side recorder sees ciphertext, so the recording has to come from a client or a recorder that joins the call as a participant. That makes the recorder a party to the encryption, and it should be visible to everyone in the call.</p><p><strong>Is SFrame the same as WebRTC Insertable Streams?</strong></p><p>No. Insertable Streams, now standardised as WebRTC Encoded Transform, is the browser API that lets your code see and modify each encoded frame. SFrame is the encryption format you can implement with that API. Browsers ship the API; most applications still implement SFrame themselves.</p><p><strong>Who should generate the keys for end-to-end encrypted video?</strong></p><p>The clients, ideally. If the server that runs the media also generates or distributes the media key, it can decrypt the call. Group key agreement such as MLS, RFC 9420, lets clients agree keys among themselves and rekey whenever someone joins or leaves.</p><p><strong>Do I need end-to-end encryption if I self-host the media server?</strong></p><p>Often not. End-to-end encryption protects media from whoever operates the media server. If you need recording, transcription or analytics and want media kept away from third parties, running the media path inside your own network may serve better. Samvyo, which is based on SFU architecture, supports on-premise deployment where the media path, TURN and recording run on infrastructure you control. End-to-end encryption is available as an option, off by default and configured for customers who need it, so a deployment can choose which guarantee it wants.</p>]]></content:encoded></item><item><title><![CDATA[Video SDK Token Auth: Keep the Signing Secret Out of the Browser]]></title><description><![CDATA[A video token is a signed note saying who you are, which room, and what you may do. Whoever holds the signing secret can write any note, including one that puts a hidden participant in a customer's meeting. Here is what the secret can mint, and how a token service should work.]]></description><link>https://www.samvyo.com/blog/video-sdk-token-auth-keep-the-signing-secret-out-of-the-browser</link><guid isPermaLink="false">6ad0a98e8b45c3f0cd63ad06</guid><category><![CDATA[Authentication]]></category><category><![CDATA[Video SDK]]></category><category><![CDATA[Tokens]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 15 Oct 2026 12:25:44 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainlit-Hotel-Reception-at-Night.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainlit-Hotel-Reception-at-Night.png" alt="Video SDK Token Auth: Keep the Signing Secret Out of the Browser"/><p>A video token is a signed note. It says who you are, which room you may enter, and what you may do there. The media server trusts it because it carries a signature only your secret can produce.</p><p>Whoever holds that secret can write any note they like. That includes one that joins your customer's board meeting as a participant nobody can see, and records it. This is why video SDK token auth is a security decision before it is an integration step.</p><p><a href="https://samvyo.com/blog/how-to-integrate-a-video-sdk-rooms-tokens-tracks-and-the-parts-the-quickstart-skips?ref=samvyo.com"><u>The integration guide</u></a> covers the mechanics: your backend mints tokens, the client never sees the secret. This post covers what goes wrong when that rule is broken, and the five decisions a token service has to get right when it isn't.</p><h2 id="what-the-secret-can-sign"><strong>What the Secret Can Sign</strong></h2><p>Tokens are usually JWTs signed with the provider's API secret. The secret doesn't open one room; it can produce a token for any room, any identity and any permission the platform supports.</p><p><a href="https://docs.livekit.io/frontends/reference/tokens-grants/?ref=samvyo.com"><u>LiveKit's tokens and grants reference</u></a> is a useful list because it is explicit. A token can carry, among others:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="211"><col width="436"/></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Grant</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What it allows</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">roomJoin + room</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Join a named room</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">canPublish, canPublishSources</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Send audio, video or screen share, optionally limited by source</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">canSubscribe</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Receive everyone else's media</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">roomList, roomCreate</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">List and create rooms</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">roomAdmin</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Moderate a room: remove people, mute tracks</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">roomRecord</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Start recordings and exports</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">hidden</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Join without appearing in the participant list</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Read that table as an attacker would. A secret that reaches the browser lets anyone list your rooms, join any of them hidden, and record what they hear. Other platforms name the permissions differently, but every one signs tokens with a secret and trusts whatever the signature covers.</p><h2 id="what-ships-when-the-secret-ships"><strong>What Ships When the Secret Ships</strong></h2><p>Anything in a JavaScript bundle is public. Minification doesn't hide a string, and environment variables baked in at build time end up in the file the browser downloads. A secret in the client is a secret on every user's machine.</p><p>Be precise about which value matters. Many platforms hand out two things: an identifier (an app ID or API key) and a secret. The identifier often appears in client code by design. The secret must not. Agora shows the difference clearly: its projects can run with an App ID alone, and <a href="https://docs.agora.io/en/introduction/projects?ref=samvyo.com"><u>Agora's project documentation</u></a> recommends App ID plus token, saying production should use token authentication rather than App ID only.</p><p>A leaked secret costs more than a leaked password, for two reasons:</p><ul><li><strong>Revoking it ends every session at once.</strong> Tokens signed with the old secret stop verifying, so legitimate users are cut off along with the attacker.</li><li><strong>Rotation is a release.</strong> If the secret lives in client code, replacing it means shipping a new build to every web, iOS and Android user, while old builds keep the leaked one.</li></ul><h2 id="the-token-service-five-decisions"><strong>The Token Service: Five Decisions</strong></h2><p>The fix is a small backend endpoint. The client asks for a token, the server decides, signs and returns it. Each request answers five questions.</p><h3 id="1-who-is-asking"><strong>1. Who is asking?</strong></h3><p>Authenticate the user with your own identity system first, then put <em>that</em> identity in the token. Never take the identity from the request body. If a client can send identity: "ceo@customer.com" and get a token for it, you have built impersonation as a service.</p><h3 id="2-do-they-belong-in-this-room"><strong>2. Do they belong in this room?</strong></h3><p>The room name in the request is a claim, not a fact. Check it against your own data: is this user invited to this meeting, a member of this support queue, assigned to this case? Room names are often guessable (team-standup, sequential IDs), so the check matters.</p><h3 id="3-what-may-they-do"><strong>3. What may they do?</strong></h3><p>Derive permissions from role, never from the request:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="257"><col width="390"/></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Role</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Grants</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Attendee</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">join, publish, subscribe</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Viewer (webinar, monitoring wall)</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">join, subscribe; no publish</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Host</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">the above plus room admin</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Recording or AI bot</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">its own service identity, only the grants it needs</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Least privilege here has a concrete payoff: a viewer token that leaks lets someone watch one room, not broadcast into it. Keep hidden for service participants such as recorders, never for people.</p><h3 id="4-how-long-should-it-live"><strong>4. How long should it live?</strong></h3><p>This is the decision with a real trade-off. Short tokens limit damage; long tokens survive reconnection.</p><p>On security, the lifetime is your revocation window. <a href="https://docs.livekit.io/guides/remove-participants-from-a-room/?ref=samvyo.com"><u>LiveKit's guide to removing participants</u></a> notes that removing someone from a room does not invalidate their token, and recommends short TTLs and not issuing that person a new token. Your token service is the kill switch: when it stops issuing tokens to someone, they are locked out once their current token expires.</p><p>On reliability, a reconnect has to present a valid token. Twilio lists an expired token as a reason reconnection fails in its <a href="https://www.twilio.com/docs/video/reconnection-states-and-events?ref=samvyo.com"><u>reconnection documentation</u></a>, and recommends tokens valid for the maximum session length, which its <a href="https://www.twilio.com/docs/iam/access-tokens?ref=samvyo.com"><u>access token documentation</u></a> caps at 24 hours. LiveKit takes the other route: the server refreshes tokens for connected clients, so a short lifetime only constrains the first join.</p><p>So the answer depends on the platform. With server-side refresh, use minutes. Without it, either have the client fetch a fresh token before expiry, or accept a lifetime as long as your longest realistic call and compensate with tight room and role checks. The failure on the other side is covered in <a href="https://samvyo.com/blog/video-sdk-reconnection-keeping-a-call-alive-when-the-network-drops?ref=samvyo.com"><u>keeping a call alive when the network drops</u></a>.</p><h3 id="5-if-you-verify-tokens-yourself-verify-them-properly"><strong>5. If you verify tokens yourself, verify them properly</strong></h3><p>The media server verifies the provider's tokens. But teams often reuse the pattern: a recording worker, a webhook receiver or an internal API that accepts JWTs. Those are relying parties, and <a href="https://www.rfc-editor.org/rfc/rfc8725?ref=samvyo.com"><u>RFC 8725</u></a>, the JWT best-practice document, sets the rules: accept only the algorithms you expect, check that the signing key belongs to the issuer, and require and validate the audience claim.</p><h2 id="where-the-secret-lives"><strong>Where the Secret Lives</strong></h2><p>On the server, the secret belongs in a secret manager or the deployment's environment, never in the repository. Use one secret per environment, so a leaked staging key can't mint production tokens. Make rotation a configuration change you have practised: if your platform allows more than one active key, add the new one, move the token service to it, then retire the old one.</p><p>Keep exactly one place that signs. Teams that put <a href="https://samvyo.com/blog/the-seam-abstracting-video-behind-your-own-interface-so-you-can-leave-later?ref=samvyo.com"><u>one token endpoint behind your own interface</u></a> get this for free: one service, one secret, one audit log of who was issued what. That log is what a security review will ask for.</p><p>A minimal endpoint, using LiveKit's Node server SDK as the illustration:</p><pre><code>app.post('/video-token', requireLogin, async (req, res) =&gt; {
  const user = req.user;
  const room = req.body.room;

  if (!(await canJoin(user.id, room))) return res.sendStatus(403);

  const role = await roleIn(user.id, room);

  const at = new AccessToken(
    process.env.LK_KEY,
    process.env.LK_SECRET,
    {
      identity: user.id,
      ttl: '10m',
    }
  );

  at.addGrant({
    roomJoin: true,
    room,
    canPublish: role !== 'viewer',
    canSubscribe: true,
    roomAdmin: role === 'host',
  });

  audit.log({ user: user.id, room, role });

  res.json({ token: await at.toJwt() });
});</code></pre><p>Ten minutes is safe here only because LiveKit refreshes tokens for connected clients. On a platform without refresh, the lifetime comes from decision four.</p><h2 id="when-the-simple-version-is-fine"><strong>When the Simple Version Is Fine</strong></h2><p>Not every setup needs all of this on day one. A local prototype can use a development key, and App-ID-only modes exist so a demo works in an afternoon. The line is the first build a real user can download. From then on the secret lives on the server, because rotating it out of shipped clients is the expensive part.</p><p>Short tokens also have a cost. They add load to your token endpoint, and on platforms without refresh they create a reconnection failure that long tokens would never have. Choose the lifetime deliberately; don't copy one from a quickstart.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>The signing secret isn't a key to a room. It is the press that prints every token your platform will honour. Keep it on the server, put your own identity and room checks in front of it, derive permissions from role, and treat the token lifetime as both your revocation window and a reconnection constraint.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>Tokens carry the identity your own system vouches for. Next: </em><a href="https://samvyo.com/blog/enterprise-video-sso-and-scim-what-it-will-ask-before-rollout?ref=samvyo.com"><em><u>what IT will ask before a rollout</u></em></a><em>, from SSO to automatic deprovisioning.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>Where should video SDK token auth happen, client or server?</strong></p><p>On the server. The client authenticates with your app, asks your backend for a token, and the backend signs one with the provider's secret. Signing in the client means shipping the secret, and anyone with the secret can mint tokens for any room and any permission.</p><p><strong>Is it safe to put a video API key in frontend code?</strong></p><p>It depends which value it is. App IDs and public API keys are identifiers and often belong in client code. The secret that signs tokens never does, because it can create tokens with every permission the platform supports.</p><p><strong>How long should a video access token last?</strong></p><p>As short as your platform's reconnection behaviour allows. With server-side token refresh, minutes is fine. Without it, an expired token breaks reconnection, so either refresh from the client before expiry or use a lifetime that covers your longest call.</p><p><strong>Does kicking a participant revoke their token?</strong></p><p>Not necessarily. On LiveKit, removing a participant does not invalidate their token, so they can rejoin until it expires unless your backend stops issuing them new ones. Short lifetimes plus a token service that refuses removed users is the practical revocation.</p><p><strong>What should a video token service log?</strong></p><p>Every token issued: user, room, role and time. That log answers "who was in this meeting and with what rights" during an incident or audit. On any platform, Samvyo included, the token service sits in your own backend, so this log stays with you.</p><p><strong>Does self-hosting video change token security?</strong></p><p>The model is the same: a secret signs tokens and the media server trusts them. What changes is who holds the secret and the verification side. With an on-premise deployment, which Samvyo supports, both the signing secret and the media server sit inside your network, so rotation and audit are entirely in your hands.</p>]]></content:encoded></item><item><title><![CDATA[Video SDK Reconnection: Keeping a Call Alive When the Network Drops]]></title><description><![CDATA[A phone swaps from Wi-Fi to 4G in a second. Whether the call survives depends on three separate recoveries: the media path, the signalling channel and the session. An SDK runs two of them. Here is what each one does, and the three jobs that stay yours.]]></description><link>https://www.samvyo.com/blog/video-sdk-reconnection-keeping-a-call-alive-when-the-network-drops</link><guid isPermaLink="false">6ad0a8448b45c3f0cd63ace2</guid><category><![CDATA[Video SDK]]></category><category><![CDATA[Reconnection]]></category><category><![CDATA[Mobile Networks]]></category><category><![CDATA[WebRTC]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 15 Oct 2026 12:25:41 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Midnight-Tram-Ride.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Midnight-Tram-Ride.png" alt="Video SDK Reconnection: Keeping a Call Alive When the Network Drops"/><p>A user walks out of the office mid-call. Their phone drops the Wi-Fi and picks up 4G in about a second. The call then does one of two things: it freezes for a moment and carries on, or it ends with a "You've been disconnected" screen and a rejoin button.</p><p>Which one happens is not luck. A network change breaks three separate things, and each needs its own recovery. A good video SDK runs two of those recoveries for you. Video SDK reconnection fails most often in the parts it leaves to your code, and those parts are small, specific and easy to get wrong.</p><h2 id="what-a-network-change-actually-breaks"><strong>What a Network Change Actually Breaks</strong></h2><p>When the phone changes networks, it gets a new IP address. Everything bound to the old one stops working at the same moment, but at three different layers.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="51"><col width="308"><col width="288"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Layer</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What breaks</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What recovers it</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Media path</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The ICE candidate pair carrying audio and video was tied to the old address</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">An ICE restart: gather new candidates, check pairs again</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Signalling</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The WebSocket to the server dies with the old connection</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Reconnect, then prove it is the same participant</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Session</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The server's view of the participant: room, published tracks, subscriptions</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Resume the existing session, or rebuild it from scratch</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The media path notices on its own clock. WebRTC keeps checking that the other side still wants its packets. <a href="https://www.rfc-editor.org/rfc/rfc7675?ref=samvyo.com"><u>RFC 7675</u></a> sets those consent checks at roughly every five seconds and lets consent expire after 30 seconds without an answer, at which point the browser must stop sending on that path. Getting it back takes an ICE restart or a new session.</p><p>Before that hard stop, the browser reports trouble through the ICE connection state. <a href="https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/iceConnectionState?ref=samvyo.com"><u>MDN's reference for iceConnectionState</u></a> describes disconnected as a weaker signal than failed: it can appear on a shaky network and clear by itself. failed means every candidate pair was checked and none works. The timing between the two is left to each browser, so treat it as something to measure, not a constant.</p><p>None of this is new machinery. <a href="https://www.rfc-editor.org/rfc/rfc8445.html?ref=samvyo.com"><u>RFC 8445</u></a>, the ICE specification, allows either side to restart ICE at any time, and the browser exposes it as <a href="https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/restartIce?ref=samvyo.com"><u>restartIce()</u></a>. If you want the background on <a href="https://samvyo.com/blog/nat-traversal-in-webrtc-why-the-call-connects-on-wi-fi-but-not-on-4g?ref=samvyo.com"><u>how ICE finds a path in the first place</u></a>, that post covers it. What matters here is what an SDK does when the path disappears.</p><h2 id="resume-or-rejoin-the-two-recoveries-an-sdk-runs"><strong>Resume or Rejoin: The Two Recoveries an SDK Runs</strong></h2><p>Mature SDKs try a cheap recovery first and fall back to an expensive one. LiveKit's documentation is the clearest public description of this, so it is the example here.</p><p>The cheap path is a <strong>resume</strong>. According to <a href="https://docs.livekit.io/intro/basics/connect/?ref=samvyo.com"><u>LiveKit's connection guide</u></a>, on a network change the SDK reconnects its signalling WebSocket and starts an ICE restart itself. The session survives. Users see nothing, or a video pause of a few seconds if media on the old path failed first.</p><p>The expensive path is a <strong>full reconnect</strong>, used when an ICE restart is not possible or does not work. The same guide describes the sequence: other participants are reported as disconnected, a Reconnecting event fires, the connection is rebuilt, Reconnected fires, every participant is announced as connected again, and local tracks are published again. LiveKit says plainly that this is the same as everyone leaving the room and coming back.</p><p>Twilio's SDK exposes the same split through error codes. Its <a href="https://www.twilio.com/docs/video/reconnection-states-and-events?ref=samvyo.com"><u>reconnection documentation</u></a> raises a reconnecting event with code 53001 for signalling and 53405 for media. If recovery gives up, the room disconnects with a reason:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="69"><col width="578"/></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Code</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Meaning</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">53000</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Signalling reconnection attempts exhausted</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">53002</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Signalling reconnection took too long</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">20104</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The access token expired</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The last row is the one most teams don't plan for, and it leads straight to the work an SDK cannot do for you.</p><h2 id="the-three-jobs-that-stay-yours"><strong>The Three Jobs That Stay Yours</strong></h2><p>If you use an SDK, the first rule is to <strong>leave ICE restart alone</strong>. The SDK already watches the connection and restarts ICE on a network change. Adding your own restart from an iceconnectionstatechange handler duplicates work the SDK is already doing, and the two can collide. <a href="https://samvyo.com/blog/how-to-integrate-a-video-sdk-rooms-tokens-tracks-and-the-parts-the-quickstart-skips?ref=samvyo.com"><u>The quickstart-skips guide</u></a> gives reconnection a paragraph; on an SDK, these three jobs are the rest of it.</p><h3 id="token-lifetime"><strong>Token lifetime</strong></h3><p>A reconnect has to prove the participant's identity again, usually with the token the client joined with. If that token has expired, recovery fails even though the network is fine. That is Twilio's 20104, and Twilio's answer is to issue tokens valid for the maximum session length of 24 hours.</p><p>That advice works against security, which wants tokens to expire quickly. LiveKit resolves the tension differently: its <a href="https://docs.livekit.io/frontends/reference/tokens-grants/?ref=samvyo.com"><u>tokens and grants reference</u></a> says the server issues refreshed tokens to connected clients, lasting ten minutes or the original token's remaining lifetime, whichever is longer, so expiry only constrains the first join. If your platform has no refresh, your client must fetch a fresh token from your server before the old one runs out. How to design <a href="https://samvyo.com/blog/video-sdk-token-auth-keep-the-signing-secret-out-of-the-browser?ref=samvyo.com"><u>short-lived tokens and the service that issues them</u></a> is its own post; for reconnection, the rule is to pick a lifetime and confirm it survives a 30-minute call with a network change at minute 29.</p><h3 id="handlers-that-survive-a-replay"><strong>Handlers that survive a replay</strong></h3><p>A full reconnect replays the room. Every "participant joined" and "track published" handler runs again for people who never left. Handlers that append without checking produce duplicate video tiles, double-counted attendance and two renderers fighting over one element. It looks like a rendering bug and is really a reconnect.</p><p>The fix is plain: key all room state by participant identity and track ID, and make every handler an upsert. Adding a participant who already exists should change nothing.</p><h3 id="what-the-user-sees"><strong>What the user sees</strong></h3><p>Users forgive a pause they can see explained. They don't forgive a frozen tile with no message. Three choices decide this:</p><ul><li><strong>Don't drive the UI from one event.</strong> LiveKit lists Reconnecting only for the full-reconnect path, so a banner tied to it stays hidden during a resume. Its connection-quality value reaching "lost" arrives earlier.</li><li><strong>Don't tear down on disconnected.</strong> It is allowed to clear by itself. Show a "reconnecting" state after a short grace period instead.</li><li><strong>Tell the other side.</strong> Participants who stay put see a frozen face. A per-participant reconnecting indicator is cheap and saves the "can you hear me?" minute.</li></ul><h2 id="if-you-are-building-it-yourself"><strong>If You Are Building It Yourself</strong></h2><p>Without an SDK, all three layers are yours. The media layer is the familiar part:</p><pre><code>pc.addEventListener('iceconnectionstatechange', () =&gt; {
  if (pc.iceConnectionState === 'disconnected') {
    graceTimer = setTimeout(() =&gt; pc.restartIce(), 3000);
  }

  if (pc.iceConnectionState === 'connected') {
    clearTimeout(graceTimer);
  }

  if (pc.iceConnectionState === 'failed') {
    pc.restartIce();
  }
});

window.addEventListener('online', () =&gt; pc.restartIce());</code></pre><p>restartIce() makes the next offer an ICE restart, so your negotiation code has to handle negotiationneeded correctly, and the new offer travels over a signalling channel that may itself be reconnecting. That ordering is where most hand-built reconnection breaks: signalling must come back first, carrying a session ID the server recognises, before the restart offer can go anywhere.</p><p>The server needs a matching decision: how long it keeps a vanished participant's slot, published tracks and subscriptions before treating them as gone. No standard sets that window; it is a product decision. Too short and every tunnel becomes a rejoin. Too long and others watch a frozen tile.</p><p>Finally, the new network may be one that blocks UDP. A phone moving from home Wi-Fi onto a guest network can lose the path that worked at join time, so a restart that only tries UDP fails where <a href="https://samvyo.com/blog/why-webrtc-breaks-behind-corporate-firewalls-and-the-turn-tcp-fallback-that-fixes-it?ref=samvyo.com"><u>a TCP or TLS relay on port 443</u></a> would have worked.</p><h2 id="how-to-know-whether-it-works"><strong>How to Know Whether It Works</strong></h2><p>There is no public data on how often calls survive a network change, and vendors don't publish their own rates. You have to measure yours.</p><p>Test the transitions users actually make: Wi-Fi to cellular, cellular to Wi-Fi, airplane mode for five seconds, airplane mode for 40 seconds (longer than the consent timeout), and a laptop that sleeps and wakes. For each, record which path ran (resume or full reconnect), how long media was gone, and whether the session came back as the same participant.</p><p>In production, the same questions come from the stats every session already produces: when bytes stopped arriving, when they resumed, and whether the candidate pair changed. <a href="https://samvyo.com/blog/collecting-webrtc-getstats-evidence-in-production?ref=samvyo.com"><u>Collecting getStats evidence in production</u></a> shows which fields answer that and how to sample them. Count resumes and full reconnects separately. A rising full-reconnect share is the early warning.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>A network change breaks the media path, the signalling channel and the session at once. An SDK recovers the first two and usually the third. What it cannot do is choose your token lifetime, make your event handlers idempotent or decide what users see, and those three decide whether a call survives the walk to the car park.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>Reconnection hurts most on mobile web. Next: </em><a href="https://samvyo.com/blog/video-sdk-on-ios-safari-why-the-camera-goes-black-without-an-error?ref=samvyo.com"><em><u>iOS Safari, where the camera goes black without an error</u></em></a><em>, even when the connection never dropped.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>How does video SDK reconnection work when a user switches from Wi-Fi to 4G?</strong></p><p>The SDK reconnects its signalling connection and runs an ICE restart to find a new media path from the new IP address. If that works, the session resumes with at most a short video pause. If it fails, the SDK falls back to a full reconnect, which rebuilds the session as if everyone had left and rejoined.</p><p><strong>What is the difference between ICE "disconnected" and "failed"?</strong></p><p>disconnected means connectivity checks failed for at least one component and may clear on its own on a shaky network. failed means every candidate pair was checked and none works, which needs an ICE restart. Browsers decide the timing between them, so measure it rather than assume it.</p><p><strong>Why does a call fail to reconnect even though the network is back?</strong></p><p>Often the token expired. Reconnecting means proving the participant's identity again, and an expired token fails that check. Either issue tokens that outlive the session, or use a platform that refreshes tokens for connected clients.</p><p><strong>Should I call restartIce() myself if I use a video SDK?</strong></p><p>Usually not. Most SDKs restart ICE themselves on a network change, and a second restart from your code competes with theirs. Spend the effort on token lifetime, idempotent event handlers and the reconnecting UI instead.</p><p><strong>How long should a server keep a disconnected participant's session?</strong></p><p>There is no standard; it is a product decision. Too short turns every tunnel into a full rejoin, too long leaves others watching a frozen tile. When you evaluate a platform, Samvyo included, ask what the window is and whether you can tune it.</p><p><strong>Does running video on my own infrastructure change how reconnection works?</strong></p><p>The mechanics are the same: ICE restart, signalling resume and session state behave identically. What changes is that you own the TURN relays the new path may need. Samvyo keeps the media path and TURN on infrastructure you control, so relay capacity for reconnecting mobile users is something to size, not something a provider absorbs.</p>]]></content:encoded></item><item><title><![CDATA[Embed Video Options: iframe, UI Kit or Headless SDK, and What Each Costs Later]]></title><description><![CDATA[A prebuilt iframe gets a call on screen in minutes. A headless SDK takes days. The difference that matters shows up later: who owns the UI, where auth lives, what works in a mobile app and what an upgrade or a migration rewrites. Here is how the three embed video options compare.
]]></description><link>https://www.samvyo.com/blog/embed-video-options-iframe-ui-kit-or-headless-sdk-and-what-each-costs-later</link><guid isPermaLink="false">6ad0ab7c8b45c3f0cd63ad25</guid><category><![CDATA[Video SDK]]></category><category><![CDATA[Embedded Video]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 15 Oct 2026 12:25:37 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Corridor-of-Contrasting-Rooms.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Corridor-of-Contrasting-Rooms.png" alt="Embed Video Options: iframe, UI Kit or Headless SDK, and What Each Costs Later"/><p>One vendor's documentation puts the gap in a single line: a prebuilt iframe gets you to a working call in minutes, a custom UI on its SDK takes hours to days. That is true, and it is the least important difference between the three embed video options.</p><p>Once you have made <a href="https://samvyo.com/blog/build-buy-or-embed-the-technical-decision-guide-for-video-infrastructure?ref=samvyo.com"><u>the build-or-buy decision</u></a> and chosen a provider, there is a second choice inside "buy": how the video gets into your product. You can drop in the vendor's whole meeting UI in an iframe, assemble it from the vendor's UI components, or use the headless core SDK and draw every pixel yourself. Each one is cheap at a different moment. This post is about the moments after launch.</p><h2 id="the-three-embed-video-options"><strong>The Three Embed Video Options</strong></h2><p>Most providers now offer all three, under different names.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="85"><col width="341"><col width="221"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Option</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What you get</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Example</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Prebuilt iframe</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The vendor's complete meeting UI, hosted on their domain, inside an &lt;iframe&gt; on your page</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Daily Prebuilt; Jitsi/JaaS IFrame API</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">UI kit</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Ready-made components (video grid, controls, chat) that run in your page, on top of the core SDK</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">RealtimeKit UI Kit</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Headless SDK</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Media, rooms and events as an API; no UI at all</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Daily call object; RealtimeKit Core SDK</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The vendors describe the trade-off in their own words. <a href="https://docs.daily.co/docs/daily-js/concepts/call-modes?ref=samvyo.com"><u>Daily's documentation on call modes</u></a> calls its iframe mode the best fit for fast integration with minimal UI work, and its call object mode headless: Daily handles WebRTC and media while you build every pixel. <a href="https://developers.cloudflare.com/realtime/realtimekit/sdk-selection/?ref=samvyo.com"><u>Cloudflare's RealtimeKit SDK guide</u></a> estimates under two hours to ship with its UI Kit and typically five to six days with the Core SDK alone. These are the vendors' estimates, not measurements, but the order of magnitude is right.</p><p>Time to first call is a one-off cost. The rest of this post is the recurring ones.</p><h2 id="what-each-option-costs-later"><strong>What Each Option Costs Later</strong></h2>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="147"><col width="160"><col width="237"><col width="102"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cost that shows up later</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Prebuilt iframe</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">UI kit</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Headless SDK</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Making it look like your product</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Themes and injected CSS only</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Theme plus component props; replace components you outgrow</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Unlimited; you build it</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Reacting to what happens in the call</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Events the iframe API chooses to expose</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Full SDK events</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Full SDK events</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Where auth and roles live</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Vendor's token properties</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your token service</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your token service</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Camera permission</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Parent page must delegate it</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your page asks</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your page asks</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Native mobile app</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A webview around someone else's page</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Native kits where offered</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Native SDKs where offered</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Upgrades</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Arrive when the vendor deploys</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">When you bump a version</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">When you bump a version</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Leaving the vendor</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Replace the whole UI</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Replace the components</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Replace the adapter</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Each row deserves a closer look, because each one is where a team that picked for speed tends to get stuck.</p><h2 id="styling-you-rent-the-iframes-ui"><strong>Styling: You Rent the iframe's UI</strong></h2><p>An iframe from another origin is a sealed box. Your stylesheet cannot reach into it, so every visual change goes through whatever the vendor exposes. <a href="https://docs.daily.co/docs/prebuilt/customizing-daily-prebuilt?ref=samvyo.com"><u>Daily's Prebuilt customization guide</u></a> is generous by iframe standards: feature toggles, colour themes, injected CSS, grid tile limits, custom tray buttons and sidebar apps. It is also clear about the edge: for a fully custom UI, use the call object. Even small things are on its terms; by default an embedded Prebuilt call has no leave button until you add one.</p><p>A UI kit moves the line. The components run in your page, take your theme, and can be swapped one at a time when one stops fitting. A headless SDK has no line at all, which is also its cost: every state the vendor's UI already handles (permission prompts, device switching, poor-network banners, screen-share layouts) is now yours to design and test.</p><h2 id="events-and-auth-who-owns-the-calls-state"><strong>Events and Auth: Who Owns the Call's State</strong></h2><p>With an iframe, your page learns about the call through the messages the iframe API chooses to send. If the API doesn't expose an event, such as a specific participant's network quality, you can't build a feature on it. With a UI kit or a headless SDK you get the full event stream, because the SDK runs in your page.</p><p>Auth moves the same way. In the iframe model, the vendor's UI makes the permission decisions, so your roles have to map onto its token properties. Daily's meeting tokens decide who is an owner or can record; <a href="https://developer.8x8.com/jaas/docs/iframe-api-integration?ref=samvyo.com"><u>8x8's JaaS integration guide</u></a> passes a signed JWT straight into the iframe constructor. That works until your product's roles don't fit the vendor's. With a UI kit or headless SDK, your own token service decides grants and your own UI enforces them, which is also where <a href="https://samvyo.com/blog/enterprise-video-sso-and-scim-what-it-will-ask-before-rollout?ref=samvyo.com"><u>SSO and provisioning questions IT will ask</u></a> get answered.</p><h2 id="permissions-and-mobile-the-iframe-has-to-be-let-in"><strong>Permissions and Mobile: The iframe Has to Be Let In</strong></h2><p>A cross-origin iframe cannot use the camera unless the page that embeds it allows it. <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Feature-Policy/camera?ref=samvyo.com"><u>MDN's camera directive reference</u></a> gives the default allowlist for the camera as self, and a blocked call to getUserMedia() rejects with NotAllowedError, the same error a user's refusal produces. In practice that means the iframe needs allow="camera; microphone", and per <a href="https://developer.mozilla.org/docs/Web/HTTP/Guides/Permissions_Policy?ref=samvyo.com"><u>MDN's Permissions Policy guide</u></a> the vendor's origin must also be allowed by your page's own Permissions-Policy header. Miss either and users see "camera blocked" with nothing in your logs to tell you why.</p><p>Mobile raises the stakes. Inside a native app, an iframe means a webview wrapping a page you don't control, with the platform's webview camera rules on top. On iPhones, that is WebKit, with its own <a href="https://samvyo.com/blog/video-sdk-on-ios-safari-why-the-camera-goes-black-without-an-error?ref=samvyo.com"><u>camera behaviour on iOS Safari</u></a>. Vendors that ship native SDKs and native UI kits avoid the webview entirely. If a native app is on your roadmap, check which of the three options the vendor offers on iOS and Android before choosing the web one.</p><h2 id="upgrades-and-migration-who-changes-the-code"><strong>Upgrades and Migration: Who Changes the Code</strong></h2><p>A hosted iframe changes when the vendor deploys. That is convenient: fixes and new features arrive without a release. It also means your users can see a new layout, a renamed button or a moved control before your support team does. With a UI kit or headless SDK, nothing changes until you upgrade the package, which is more work and more control.</p><p>Leaving is where the gap is widest. With a headless SDK behind <a href="https://samvyo.com/blog/the-seam-abstracting-video-behind-your-own-interface-so-you-can-leave-later?ref=samvyo.com"><u>a seam of your own</u></a>, a provider change replaces an adapter. With a UI kit, the components go too, because they belong to the vendor. With an iframe, the whole meeting experience goes, and everything your users learned about it. That matches the evidence on <a href="https://samvyo.com/blog/the-switching-cost-what-you-actually-rewrite-to-move-video-providers?ref=samvyo.com"><u>what a provider switch rewrites</u></a>: the object model, events and rendering all change.</p><h2 id="choosing-which-layer-will-you-need-to-own"><strong>Choosing: Which Layer Will You Need to Own?</strong></h2><p>The iframe is the right answer more often than engineers like to admit. If video is a supporting feature, used by a known audience on the web, with roles that fit the vendor's model, a prebuilt UI maintained by people who do nothing else is hard to beat. Accessibility, device quirks and poor-network handling come with it.</p><p>The signals that it won't stay right:</p><ul><li><strong>Video is the product, or a core workflow.</strong> Branding and UX will matter, and themes run out.</li><li><strong>Your permissions model is your own.</strong> Clinician and patient, agent and customer, inspector and site: roles the vendor's token doesn't describe.</li><li><strong>You need call events in your own system.</strong> Analytics, billing by participant, CRM notes, compliance logs.</li><li><strong>A native app is coming.</strong> A webview is a poor long-term home for a camera.</li></ul><p>If two or more apply, start with a UI kit and plan to replace components as you outgrow them. If you already know you need full control, go headless from day one; moving from an iframe to custom UI later means building the custom UI anyway, after users have learned the old one.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>The three embed video options trade time now against control later. A prebuilt iframe is fastest and puts the vendor in charge of the UI, the roles and the release schedule. A UI kit shares that control. A headless SDK gives you all of it, along with every edge case. Choose by the layer you expect to own in eighteen months, not by the afternoon you save this week.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>Once auth lives in your own code, the next decision is how to issue tokens safely. Next: why you should </em><a href="https://samvyo.com/blog/video-sdk-token-auth-keep-the-signing-secret-out-of-the-browser?ref=samvyo.com"><em><u>keep the signing secret on your server</u></em></a><em>.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What are the embed video options for adding calls to a web app?</strong></p><p>There are three: the vendor's prebuilt meeting UI in an iframe, the vendor's UI components running in your page, or a headless SDK where you build the UI yourself. Most video providers offer all three, under different names.</p><p><strong>Is it bad to embed a video call in an iframe?</strong></p><p>No. For a supporting feature on the web, with roles that fit the vendor's model, it is often the best choice. It becomes costly when you need your own branding, your own permission model, call events in your systems, or a native mobile app.</p><p><strong>Why does my embedded video iframe say the camera is blocked?</strong></p><p>The embedding page has to delegate camera and microphone access, usually with allow="camera; microphone" on the iframe and a matching Permissions-Policy header. Without both, getUserMedia() rejects with NotAllowedError, the same error as a user saying no.</p><p><strong>What does "headless" mean for a video SDK?</strong></p><p>The SDK handles media, rooms and events but ships no UI. You build every screen. It takes longer to launch and gives full control over design, permissions and behaviour.</p><p><strong>Can I start with a prebuilt UI and switch to a custom one later?</strong></p><p>Yes, but the custom UI is a rebuild, not a migration: nothing from the iframe carries over. A UI kit is the gentler path, because components can be replaced one at a time. Samvyo, for example, ships SDKs for JavaScript, React and React Native, so the choice of how much UI to own stays with you.</p><p><strong>Which embed option is best for an on-premise deployment?</strong></p><p>Any of them can work, but with an iframe the UI is served from wherever the vendor hosts it. If the requirement is that nothing loads from outside your network, check where the prebuilt UI is served from. With a platform such as Samvyo, which supports on-premise deployment, an SDK-based UI runs from your own application, so the question reduces to where the media servers sit.</p>]]></content:encoded></item><item><title><![CDATA[Video SDK on iOS Safari: Why the Camera Goes Black Without an Error]]></title><description><![CDATA[On an iPhone, a web video call rarely fails with an error. The camera track goes muted or ends, the call stays connected, and the other side sees black. We tested the triggers on Safari 26. Here is what causes it, and the few handlers that catch it.]]></description><link>https://www.samvyo.com/blog/video-sdk-on-ios-safari-why-the-camera-goes-black-without-an-error</link><guid isPermaLink="false">6ad0ac848b45c3f0cd63ad3a</guid><category><![CDATA[iOS]]></category><category><![CDATA[Video SDK]]></category><category><![CDATA[Mobile]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 15 Oct 2026 12:25:33 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Rooftop-Surveillance-Camera.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Rooftop-Surveillance-Camera.png" alt="Video SDK on iOS Safari: Why the Camera Goes Black Without an Error"/><p>On Android and desktop, a broken camera usually announces itself: a rejected promise, an error event, something your code can catch. On an iPhone, the camera mostly goes quiet instead. The track stays "live", the call stays connected, and the person on the other end watches a frozen or black tile while your logs show nothing wrong.</p><p>That is the core difficulty of running a video SDK on iOS Safari. The failures are real, but they arrive as state changes, not errors. We ran a one-page test on a real iPhone with Safari 26.0.1 on 13 October 2026 to see which of the documented behaviours still hold. This post walks through what we found and the handful of handlers that catch it.</p><h2 id="every-iphone-browser-is-safari"><strong>Every iPhone Browser Is Safari</strong></h2><p>Start with scope. On iOS, "Chrome" and "Firefox" use Apple's WebKit engine, because Apple's App Store guideline 2.5.6 requires browsing apps to use WebKit, as <a href="https://www.theregister.com/2025/08/06/apples_webkit_rule_japan/?ref=samvyo.com"><u>The Register reported</u></a> when Japan moved against the rule. The exception is narrow: <a href="https://developer.apple.com/documentation/bundleresources/entitlements/com.apple.developer.embedded-web-browser-engine?ref=samvyo.com"><u>Apple's embedded browser engine entitlement</u></a> allows other engines from iOS 17.4, and only in the EU and Japan.</p><p>So testing on Chrome for iPhone is testing WebKit. A bug that appears in Safari almost always appears in every iOS browser your users have.</p><p>Don't branch on the version in the user-agent string either. <a href="https://bugs.webkit.org/show_bug.cgi?id=298473&ref=samvyo.com"><u>WebKit bug 298473</u></a> records that Safari now freezes the iOS version it reports, permanently, after sites misread "26" as lower than "18". Our test phone's Safari reported itself as version 26.0.1 running on iOS 18.7. Detect features, not versions.</p><h2 id="mute-is-not-end"><strong>Mute Is Not End</strong></h2><p>A camera track (MediaStreamTrack) can tell you two different things:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="74"><col width="296"><col width="74"><col width="203"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Signal</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What it means</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">readyState</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Can it come back?</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">mute event</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The source has stopped delivering frames for now</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">still live</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes, unmute fires when it resumes</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">ended event</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The track is finished</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">ended</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No; you need a new track</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The trap is that a muted track is still attached to the peer connection. The call does not drop, so your <a href="https://samvyo.com/blog/video-sdk-reconnection-keeping-a-call-alive-when-the-network-drops?ref=samvyo.com"><u>reconnection logic</u></a> never runs. Nothing is wrong with the network. The other side simply stops receiving useful video.</p><p>iOS uses both signals, for different triggers. Our test results:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="326"><col width="228"><col width="92"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Trigger</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What happened (Safari 26.0.1)</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Signal</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Leave the page (Home Screen), return after ~5 s</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Camera muted while away, resumed on return</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">mute, then unmute</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Ask for the same front camera a second time</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Both tracks kept running</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">none</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Ask for the back camera while the front is live</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Front camera track finished</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">ended</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Remote video with sound, started without a tap, while capturing</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Played</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">n/a</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">AudioContext created without a tap</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Stayed suspended</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">n/a</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>One device and one run, so treat it as confirmation of documented behaviour, not a survey.</p><h2 id="three-ways-the-camera-goes-quiet"><strong>Three Ways the Camera Goes Quiet</strong></h2><h3 id="leaving-the-page"><strong>Leaving the page</strong></h3><p>When the page is hidden, iOS mutes the camera, and unmutes it when the page is visible again. This has been deliberate since 2017: <a href="https://bugs.webkit.org/show_bug.cgi?id=172200&ref=samvyo.com"><u>WebKit bug 172200</u></a> made iOS mute the video source according to document visibility so a background tab cannot capture the camera.</p><p>Our test showed it still holds, with one useful detail: the mute event fired about 0.8 seconds before the page's visibilitychange event. If your UI waits for visibility events to explain the pause, it is late. Listen on the track.</p><p>Users do this constantly: checking a message mid-call, taking a phone call, locking the screen. Every time, the other participants see the video freeze.</p><h3 id="switching-cameras"><strong>Switching cameras</strong></h3><p>This behaviour has changed over the years, and old advice is wrong. In 2017, <a href="https://bugs.webkit.org/show_bug.cgi?id=179363&ref=samvyo.com"><u>WebKit bug 179363</u></a> reported that a second getUserMedia() call muted the first track with no way to unmute it, and WebKit called that expected. In 2022 it changed: asking for a different camera now stops the previous capture, because iOS cannot capture both at once, while the same camera can run in parallel.</p><p>Our test matched the 2022 behaviour. Requesting the back camera ended the front camera's track outright. Asking for the front camera again left both running.</p><p>So a camera flip on iOS is not a mute you can wait out. The old track is gone. Get the new track first, then swap it into the call with the sender's replaceTrack(), then stop the old one, and make sure your ended handler doesn't treat this as a failure.</p><h3 id="route-changes-in-a-single-page-app"><strong>Route changes in a single-page app</strong></h3><p>Sometimes the trigger is a WebKit bug. <a href="https://bugs.webkit.org/show_bug.cgi?id=272704&ref=samvyo.com"><u>WebKit bug 272704</u></a> reported that in iOS 17.4.1, calling history.pushState() muted the camera track. That's what any single-page app router does when the user moves between screens. It worked in 17.4.0 and earlier, and a fix landed in WebKit under a related bug. We couldn't re-test it: the camera had already ended in the previous step of our test.</p><p>The lesson is not this particular bug. Point releases change camera behaviour, and the change shows up as a muted track, not an exception. Code that listens for mute catches the next regression too.</p><h2 id="sound-and-autoplay"><strong>Sound and Autoplay</strong></h2><p>Video can autoplay on iOS only under conditions. <a href="https://webkit.org/blog/6784/?ref=samvyo.com"><u>WebKit's iOS video policy</u></a> has allowed muted video to autoplay since iOS 10, requires playsinline for inline playback on iPhone, and pauses video that gains sound without a user gesture.</p><p>Calls get an exception. As <a href="https://webrtchacks.com/autoplay-restrictions-and-webrtc/?ref=samvyo.com"><u>webrtcHacks summarised</u></a> from WebKit's WebRTC documentation, stream-backed video can autoplay when the page is already capturing the camera or microphone. Our test agreed: remote video with sound started without a tap while the camera was on. An AudioContext created without a tap stayed suspended, so Web Audio processing (meters, noise effects, mixing) still needs a gesture.</p><p>The case that still breaks is the viewer who isn't capturing: a webinar attendee, a monitoring wall, a listen-only participant. Without capture there is no exception, so sound needs a tap. Put a real "Join" button in front of the call and start playback from it.</p><h2 id="what-to-build"><strong>What to Build</strong></h2><p>Four handlers cover most of it:</p><pre><code>function watchCamera(track, sender) {
  track.onmute = () =&gt; showPaused('Camera paused');

  track.onunmute = () =&gt; hidePaused();

  track.onended = async () =&gt; {
    if (switchingCamera) return;

    const s = await navigator.mediaDevices.getUserMedia({ video: true });
    const fresh = s.getVideoTracks()[0];

    await sender.replaceTrack(fresh);
    watchCamera(fresh, sender);
  };
}

// Every &lt;video&gt; element: playsinline. Start playback from the Join button.</code></pre><p>Alongside the code:</p><ul><li><strong>Tell the other side.</strong> Send a "camera paused" signal over the data channel or your signalling, so remote participants see a label instead of a frozen face.</li><li><strong>Measure it.</strong> Count mute and unmute events per session, and watch outbound frame counts drop to zero when you <a href="https://samvyo.com/blog/collecting-webrtc-getstats-evidence-in-production?ref=samvyo.com"><u>collect getStats in production</u></a>. A spike after an iOS update is how you learn about the next regression.</li><li><strong>Flip cameras with replaceTrack.</strong> Don't tear down and rebuild the connection.</li><li><strong>Feature-detect.</strong> Check for the API you need, not the iOS version.</li></ul><h2 id="how-to-test-without-a-device-lab"><strong>How to Test Without a Device Lab</strong></h2><p>You need a real iPhone; simulators don't reproduce camera interruptions. You don't need a lab. We used a single HTML page, served over HTTPS (the camera requires it), that logs every track event with a timestamp and produces a copyable report. Someone with an iPhone opens the link, taps through each trigger, and sends the report back.</p><p>Re-run it after every major iOS release. The behaviours in this post moved twice in eight years.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>A video SDK on iOS Safari fails quietly. Leaving the page mutes the camera, switching cameras ends the old track, point releases have muted it by accident, and none of it throws. Listen for mute and ended on the track, tell the other participants, start sound from a tap, and test on a real phone after each iOS update.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>Mobile is also where the embedding choice bites, because an iframe inside a native app means a webview. Next: </em><a href="https://samvyo.com/blog/embed-video-options-iframe-ui-kit-or-headless-sdk-and-what-each-costs-later?ref=samvyo.com"><em><u>choosing between an iframe, a UI kit and a headless SDK</u></em></a><em>.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>Why does my video SDK on iOS Safari show a black screen with no error?</strong></p><p>Usually the camera track has been muted, most often because the user left the page. The track stays live and the call stays connected, so no error fires. Listen for the track's mute and unmute events and show the state to both sides.</p><p><strong>Does Chrome on iPhone behave differently from Safari for video calls?</strong></p><p>Not in most of the world. Apple requires iOS browsers to use WebKit, so Chrome on iPhone has Safari's camera and autoplay behaviour. Other engines are allowed only in the EU and Japan, from iOS 17.4.</p><p><strong>Why does switching to the back camera stop the front camera on iPhone?</strong></p><p>iOS can't capture from two cameras at once, so requesting a different camera ends the previous camera's track. Get the new track, swap it into the call with replaceTrack(), then stop the old one.</p><p><strong>Can a web video call keep sending video when the user leaves the page on iOS?</strong></p><p>No. iOS mutes camera capture while the page is hidden and resumes it on return. Native apps have more options, which is one reason teams with heavy iPhone use ship a native client, for example on Samvyo's React Native SDK. For web, the right response is a clear "camera paused" state for the other participants.</p><p><strong>Why won't remote audio play automatically on iPhone?</strong></p><p>iOS needs a user gesture to start audio, unless the page is already capturing the camera or microphone. Viewers who only watch need a tap, so start playback from a Join button.</p><p><strong>Do these iOS issues depend on which video platform I use?</strong></p><p>The behaviour comes from WebKit, so every web video SDK sees it, Samvyo's JavaScript and React SDKs included. What differs is how much of the handling a platform does for you, so test mute, camera switching and autoplay on a real iPhone with any SDK you evaluate.</p>]]></content:encoded></item><item><title><![CDATA[Enterprise Video SSO and SCIM: What IT Will Ask Before Rollout]]></title><description><![CDATA[Single sign-on gets people into a video product. It does nothing when they leave the company. That job falls to SCIM, to your token service and to whatever removes people from live calls. Here are the identity questions IT will ask before a rollout, and what a good answer looks like.]]></description><link>https://www.samvyo.com/blog/enterprise-video-sso-and-scim-what-it-will-ask-before-rollout</link><guid isPermaLink="false">6ad0adc58b45c3f0cd63ad57</guid><category><![CDATA[enterprise video solutions]]></category><category><![CDATA[SSO]]></category><category><![CDATA[SCIM]]></category><category><![CDATA[User Identity]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 15 Oct 2026 12:25:29 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/10/Broken-Badge--Distant-Office-Light.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/10/Broken-Badge--Distant-Office-Light.png" alt="Enterprise Video SSO and SCIM: What IT Will Ask Before Rollout"/><p>An employee is let go at 10:00. IT disables their account in the identity provider at 10:05. At 10:20 they are still in the all-hands video call, and their app still works.</p><p>Nothing failed here. Single sign-on did its job: it checks identity when someone signs in, and they had signed in that morning. Removing them is a different job, done by different machinery, on a different clock. That is why enterprise video SSO and SCIM come up together in every security review, and why the second one is where the hard questions are.</p><p>The <a href="https://samvyo.com/blog/enterprise-video-conferencing-architecture-what-actually-runs-behind-the-six-enterprise-checks?ref=samvyo.com"><u>admin and provisioning APIs</u></a> check names this area as one of six things an enterprise buyer tests. This post opens it up: the questions IT will actually ask, and what a good answer looks like.</p><h2 id="question-1-saml-or-oidc"><strong>Question 1: SAML or OIDC?</strong></h2><p>IT will ask which single sign-on protocol you support. The two in use are <a href="https://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf?ref=samvyo.com"><u>SAML 2.0</u></a>, the XML-based standard most enterprise identity providers have supported for years, and <a href="https://openid.net/specs/openid-connect-core-1_0.html?ref=samvyo.com"><u>OpenID Connect</u></a>, built on OAuth 2.0 and common in newer setups and mobile apps.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="87"><col width="293"><col width="267"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><br/></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">SAML 2.0</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">OpenID Connect</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Format</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Signed XML assertions</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Signed JSON tokens (JWT)</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Typical fit</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Established enterprise IdPs, browser sign-in</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Modern IdPs, mobile and single-page apps</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Logout signal</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Single Logout</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><a href="https://openid.net/specs/openid-connect-backchannel-1_0.html?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Back-Channel Logout</span></a><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> (final spec, 2023)</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The practical answer is both, or at least the one this customer's identity provider prefers. Two follow-ups matter more than the protocol: can SSO be <strong>enforced</strong>, so no one keeps a password login that bypasses it, and does the same identity work in your mobile apps, not only in the browser?</p><h2 id="question-2-how-do-people-get-out"><strong>Question 2: How Do People Get Out?</strong></h2><p>This is the question that fails reviews. SSO checks identity at sign-in and says nothing afterwards. Just-in-time provisioning, where an account is created on first SSO login, has the same blind spot: it learns when someone arrives, never when they leave.</p><p>Leaving is what <a href="https://www.rfc-editor.org/rfc/rfc7644?ref=samvyo.com"><u>SCIM</u></a> is for. It is a REST protocol where the identity provider pushes changes to your app: create user, update user, change group membership, deactivate user. The <a href="https://www.rfc-editor.org/rfc/rfc7643.html?ref=samvyo.com"><u>SCIM core schema in RFC 7643</u></a> gives every user an active attribute; false generally means the account is suspended, though each service decides exactly what that does.</p><p><a href="https://learn.microsoft.com/en-us/entra/identity/app-provisioning/use-scim-to-provision-users-and-groups?ref=samvyo.com"><u>Microsoft's guide to building a SCIM endpoint for Entra ID</u></a> shows what that looks like in practice: disabling a user arrives as a PATCH that sets active to false, and a hard delete arrives as DELETE. The same guide sets out what Entra expects from your endpoint, including filtering users by userName and supporting PATCH, and notes that provisioning cycles run approximately every 40 minutes.</p><p>Large video vendors follow the same pattern. <a href="https://library.zoom.com/admin-corner/account-and-endpoint-management/scim-guide?ref=samvyo.com"><u>Zoom's SCIM guide</u></a> describes deactivation in Entra or Okta flowing through to the Zoom account automatically.</p><p>So the good answer to question 2 is: we support SCIM 2.0, deactivation suspends the account and everything attached to it, and here is what "everything" means.</p><h2 id="the-deprovisioning-window"><strong>The Deprovisioning Window</strong></h2><p>"Everything" is where video differs from most SaaS. A suspended account blocks the next login. It does not, by itself, remove someone from a call they are already in, because live media runs on a token issued earlier.</p><p>That gives three clocks between "disabled in the IdP" and "out of the call":</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="225"><col width="422"/></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Step</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What decides how long it takes</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">IdP to your app</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The provisioning cycle: approximately 40 minutes on Entra ID</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your app stops issuing tokens</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Immediate, if your token service checks account status</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The live call ends for that user</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Token expiry, unless you remove them from the room</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The last row is the one teams miss. On LiveKit, <a href="https://docs.livekit.io/guides/remove-participants-from-a-room/?ref=samvyo.com"><u>removing a participant does not invalidate their token</u></a>, so the token's lifetime matters as well as the removal. On Twilio, <a href="https://www.twilio.com/docs/iam/access-tokens?ref=samvyo.com"><u>tokens can last up to 24 hours</u></a>, and Twilio recommends long tokens so reconnection keeps working. A team that only suspends the account, issues day-long tokens and never removes anyone from live rooms has a worst case of about 24 hours 40 minutes.</p><p>Closing the window takes three pieces of work, all in your backend:</p><ul><li><strong>React to the SCIM deactivation.</strong> Suspend the account, revoke your own app sessions and stop issuing video tokens to that user.</li><li><strong>Remove them from live rooms.</strong> Use the platform's server API to disconnect the participant from every room they are in.</li><li><strong>Keep tokens short where you can.</strong> A <a href="https://samvyo.com/blog/video-sdk-token-auth-keep-the-signing-secret-out-of-the-browser?ref=samvyo.com"><u>token lifetime is also a revocation window</u></a>, so pick one that limits how long a removed user can rejoin.</li></ul><p>Do all three and the window is the provisioning cycle, about 40 minutes on Entra's schedule, or minutes if an admin triggers provisioning by hand. That is an answer IT can sign.</p><h2 id="question-3-how-do-groups-become-roles"><strong>Question 3: How Do Groups Become Roles?</strong></h2><p>IT will want permissions driven by groups it already manages, not by a second admin console. SCIM carries group membership, and your app maps groups to roles: "Video-Hosts" can start webinars and record, "Support-Agents" can join customer rooms, everyone else can join meetings they are invited to.</p><p>Two details save trouble later. Map roles from groups at token-issuing time, so a group change takes effect on the next token rather than the next login. And don't let video permissions live only in the vendor's console. If roles are set there by hand, every org change becomes a ticket, and the identity system stops being the source of truth.</p><h2 id="question-4-what-about-people-outside-the-directory"><strong>Question 4: What About People Outside the Directory?</strong></h2><p>Enterprise video has a population the identity provider doesn't know: customers in a support call, patients in a consultation, candidates in an interview, partners in a joint review. They can't sign in with SSO, and SCIM will never deprovision them.</p><p>A good answer separates the two populations clearly:</p><ul><li><strong>Employees</strong> sign in with SSO and are governed by SCIM.</li><li><strong>Guests</strong> join through a single-room, short-lived link or token, with no publish rights beyond what the session needs, and nothing that outlives the meeting.</li></ul><p>IT will also ask whether guests can be blocked entirely for some rooms, and whether a guest can ever be promoted to host. Both should be configurable, and the answer should be "only by an employee in that room".</p><h2 id="question-5-what-gets-logged"><strong>Question 5: What Gets Logged?</strong></h2><p>The last questions are about evidence. Who joined which meeting, from where, with what rights? Who started a recording, and who watched it later? IT wants these in its own security tools, not on a vendor dashboard.</p><p>That means an export or streaming API for join, leave, role-change and recording events, keyed to the same identity SSO uses. Recordings need their own trail: <a href="https://samvyo.com/blog/the-recording-architecture-audit-six-things-your-pipeline-has-to-prove?ref=samvyo.com"><u>an access log on every recording retrieval</u></a> is part of a defensible pipeline. If your token service logs every token it issues, you already have half of this.</p><h2 id="the-short-version-of-the-questionnaire"><strong>The Short Version of the Questionnaire</strong></h2>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="266"><col width="381"/></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">IT asks</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A good answer</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Which SSO protocols?</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">SAML 2.0 and OIDC; SSO can be enforced; works on mobile</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">How are accounts created and removed?</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">SCIM 2.0; deactivation suspends the account and stops token issuance</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What happens to someone already in a call?</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Removed from live rooms via the server API; token lifetime caps rejoin</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">How do permissions follow groups?</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Group-to-role mapping applied when each token is issued</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What about guests?</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Single-room, short-lived access; never promoted except by an employee</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What is logged?</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Joins, roles, recordings and recording access, exportable to our SIEM</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>SSO gets people into an enterprise video product; SCIM gets them out. Between the two sits the part specific to video: a live call runs on a token that outlives the account change unless you remove the user and keep tokens short. Answer that, plus groups, guests and logs, and the security review becomes a formality.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>Identity is one of the things that has to hold when the whole company joins at once. Next: </em><a href="https://samvyo.com/blog/concurrent-video-session-scale-what-has-to-hold-at-org-wide-peak?ref=samvyo.com"><em><u>what has to hold at org-wide peak</u></em></a><em>.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>Do enterprise video platforms need both SSO and SCIM?</strong></p><p>Yes, for different jobs. SSO checks identity at sign-in; SCIM creates, updates and deactivates accounts when the identity provider changes. Without SCIM, a departed employee's account stays active until someone removes it by hand.</p><p><strong>Is just-in-time provisioning enough instead of SCIM?</strong></p><p>It handles arrivals, not departures. JIT creates an account on first SSO login but gets no signal when someone leaves, so deactivation still needs SCIM or a manual process.</p><p><strong>How long does SCIM deprovisioning take?</strong></p><p>It depends on the identity provider. Microsoft documents Entra ID provisioning cycles running approximately every 40 minutes, so a disable can take up to that long to reach your app. Removing the user from live calls is a separate step your app has to take.</p><p><strong>Does disabling a user end their current video call?</strong></p><p>Not by itself. The call runs on a token issued before the change. Your app needs to remove the participant from live rooms through the platform's server API and stop issuing new tokens.</p><p><strong>How should guests join an SSO-protected video platform?</strong></p><p>Through single-room, short-lived access issued by your backend, with only the rights the session needs. Guests are outside the directory, so their access should expire with the meeting.</p><p><strong>Where does identity live in a self-hosted video deployment?</strong></p><p>In your own identity provider and backend, as with any platform. With an on-premise deployment, which Samvyo supports, the media servers that enforce tokens also sit inside your network. Ask any vendor, Samvyo included, how SCIM deactivation reaches users who are already in a call.</p>]]></content:encoded></item><item><title><![CDATA[Concurrent Video Session Scale: What Has to Hold at Org-Wide Peak]]></title><description><![CDATA[Steady-state capacity is not the test. The test is 8,000 people joining in four minutes, either into one all-hands or into 2,000 small meetings. Same headcount, different bottlenecks, and the first thing to break is usually the join path, not the media. Here is the arithmetic.]]></description><link>https://www.samvyo.com/blog/concurrent-video-session-scale-what-has-to-hold-at-org-wide-peak</link><guid isPermaLink="false">6ad0ae928b45c3f0cd63ad73</guid><category><![CDATA[Scaling Video]]></category><category><![CDATA[Capacity planning]]></category><category><![CDATA[SFU guide]]></category><category><![CDATA[enterprise video solutions]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 15 Oct 2026 12:25:24 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rain-Soaked-Underground-Station.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rain-Soaked-Underground-Station.png" alt="Concurrent Video Session Scale: What Has to Hold at Org-Wide Peak"/><p>At 9:58 on a Thursday, nobody at a 10,000-person company is in the all-hands. At 10:02, 8,000 of them are. Your video platform has to absorb that in four minutes, and steady-state capacity says almost nothing about whether it will.</p><p>Concurrent video session scale is usually discussed as a media problem: how many streams a server can forward. At org-wide peak, the media servers are rarely what fails first. What fails first is everything that happens when people join, because all of it happens in the same minute.</p><h2 id="two-peaks-with-the-same-headcount"><strong>Two Peaks With the Same Headcount</strong></h2><p>Org-wide peaks come in two shapes. They put the same number of people on the platform and stress completely different things.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="116"><col width="248"><col width="283"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><br/></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Shape A: the all-hands</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Shape B: Monday 9:00</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What happens</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">One presenter, 8,000 viewers in one session</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2,000 four-person meetings start at once</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Joins</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">8,000 in about four minutes</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">8,000 in about four minutes</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Rooms</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">One</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2,000</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Media pattern</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">One stream fanned out 8,000 times</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Everyone sends one stream and receives three</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">First pressure point</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Can one session span enough servers?</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Can you create and place 2,000 rooms fast enough?</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The scenario is illustrative: 10,000 employees, 80% attending the all-hands, and a Monday where 8,000 people are in small meetings. The arithmetic below scales linearly with your own numbers.</p><h2 id="shape-a-one-room-bigger-than-one-server"><strong>Shape A: One Room Bigger Than One Server</strong></h2><p>The all-hands is a broadcast, and the media numbers are large but predictable. <a href="https://docs.livekit.io/transport/self-hosting/benchmark/?ref=samvyo.com"><u>LiveKit's published benchmarks</u></a> are useful because they state the hardware: one 720p publisher to 3,000 subscribers ran a 16-core c2-standard-16 instance at 92% CPU, sending about 531 MB/s. That is roughly 1.42 Mbps per viewer.</p><p>At 8,000 viewers, the same rate is about 11.3 Gbps of egress, around 5,100 GB in an hour. Our guide to <a href="https://samvyo.com/blog/why-your-sfu-bandwidth-cost-scales-with-viewers-not-publishers?ref=samvyo.com"><u>what that egress costs</u></a> prices it by venue.</p><p>The harder constraint is structural. The same LiveKit page notes that in its benchmarks each room must fit within a single node, and 8,000 viewers is about 2.7 times what one benchmark node carried. An all-hands at that size needs a platform that can spread one session across several servers, which is the cascading covered in our post on <a href="https://samvyo.com/blog/sfu-scaling-clustering-cascading-and-where-the-bottleneck-moves?ref=samvyo.com"><u>consumers per core, network interfaces and cascading</u></a>.</p><p>Hosted APIs make the limit explicit. <a href="https://www.twilio.com/docs/video/programmable-video-limits?ref=samvyo.com"><u>Twilio's video quotas</u></a> cap a room at 50 participants. An 8,000-person all-hands is not a bigger room on that kind of platform; it is a different product.</p><p>That leads to the honest counterweight: <strong>an all-hands may not need to be interactive at all.</strong> A one-way live stream with a few seconds of delay, plus chat or moderated Q&amp;A, serves 8,000 viewers on ordinary streaming infrastructure. Real-time video earns its cost when viewers speak, not when they watch.</p><h2 id="shape-b-two-thousand-rooms-in-one-minute"><strong>Shape B: Two Thousand Rooms in One Minute</strong></h2><p>Monday morning looks harmless room by room. Each meeting is four people, well inside any server. The total is not small: 2,000 rooms × 4 participants × 3 received streams is 24,000 forwarded streams, about 14.4 Gbps at a 600 kbps average. At the roughly 500 forwarded streams per CPU core the SFU scaling post works from, that is 48 cores of forwarding work, spread sensibly across hosts.</p><p>That much is ordinary capacity planning. The peak-specific part is creation and placement. Each room has to be created, assigned to a server and filled within a couple of minutes. If your backend creates rooms through a provider's REST API, the account limits apply: Twilio's default is 20 write requests per second, so creating 2,000 rooms takes 100 seconds before anyone is placed. Its default of 10,000 rooms in flight at once is fine here, but it's a number to check against your own Monday.</p><p>The placement logic matters too. Two thousand rooms arriving in a minute is the moment a scheduler that packs rooms onto the emptiest server makes its worst decisions, because "emptiest" is measured before the load arrives.</p><h2 id="the-join-path-saturates-first"><strong>The Join Path Saturates First</strong></h2><p>Both shapes share the same expensive minute. Every join, in either shape, runs the same sequence:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="134"><col width="204"><col width="309"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Step</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What it hits</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Peak note</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Sign-in</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your identity provider</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><a href="https://samvyo.com/blog/enterprise-video-sso-and-scim-what-it-will-ask-before-rollout?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">SSO sessions that expired overnight</span></a><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> all renew at once</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Token request</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your token service</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">One request per participant, plus retries</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Signalling connect</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">WebSocket servers</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Thousands of long-lived connections opening together</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Room lookup or creation</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your backend and the provider's API</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Rate limits apply</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Connectivity checks</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">STUN and TURN servers</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Up to 22% may need a relay allocation</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Media handshake</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The SFU</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Encryption setup costs CPU per connection</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>If arrivals cluster, and for a meeting that starts on the hour they do, the rate is far above the average. Eight thousand joins over four minutes averages 33 per second. If half arrive in the final minute, it is about 67 per second. We know of no public data on arrival curves for scheduled meetings, so measure your own; the shape matters more than the total.</p><p>TURN is easy to forget. The only public measurement of relay share, callstats.io's 22% of conferences from 2015–16, is best read as <a href="https://samvyo.com/blog/what-is-a-turn-server-and-when-does-a-call-actually-need-one?ref=samvyo.com"><u>a ceiling for SFU-based products</u></a>, but even 22% of 8,000 is 1,760 relay allocations in four minutes.</p><p>The strongest evidence that the join path is its own failure domain comes from an outage. During <a href="https://blog.cloudflare.com/cloudflare-service-outage-june-12-2025/?ref=samvyo.com"><u>Cloudflare's 12 June 2025 incident</u></a>, its realtime SFU kept existing connections running but could not create new sessions, and its TURN service failed almost completely. Calls in progress survived; nobody new could join. At peak, that pattern is the whole event.</p><h2 id="what-to-do-before-the-peak"><strong>What to Do Before the Peak</strong></h2><ul><li><strong>Load-test joins, not minutes.</strong> Most load tests hold a number of participants steady. Peak readiness means replaying a realistic arrival curve and measuring join success rate and time-to-first-frame.</li><li><strong>Pre-scale for scheduled events.</strong> The all-hands is on the calendar. Autoscaling that reacts to load starts adding servers after the storm has arrived.</li><li><strong>Pre-create rooms.</strong> For Monday-style peaks, create rooms when meetings are scheduled, not when the first person clicks join.</li><li><strong>Issue tokens early.</strong> A token sent with the meeting reminder at 9:55 moves load off the busiest minute, provided its lifetime covers the meeting.</li><li><strong>Size TURN for allocations, not just bandwidth.</strong> The allocation rate at peak is the number to test.</li><li><strong>Decide what the all-hands really is.</strong> If almost everyone only watches, a live stream is cheaper and more robust than an 8,000-person interactive room.</li></ul><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Concurrent video session scale at org-wide peak is a timing problem before it is a capacity problem. The all-hands needs one session to span several servers, Monday morning needs thousands of rooms created and placed in a minute, and both push every join through identity, tokens, signalling and TURN at once. Test the join path at the arrival rate you will actually see, and the media servers are usually the easy part.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>Peak is when an outage costs the most, and when the contract matters. Next: </em><a href="https://samvyo.com/blog/enterprise-video-sla-what-99-9-buys-you-and-what-the-credit-is-worth?ref=samvyo.com"><em><u>what a video SLA actually promises</u></em></a><em>, and what the credit is worth when it breaks.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>How do you plan concurrent video session scale for an all-hands meeting?</strong></p><p>Plan for the join rate as well as the audience. Eight thousand viewers need roughly 11 Gbps of egress at 720p and a platform that can spread one session across several servers, but the first stress is thousands of joins in a few minutes. If most attendees only watch, a one-way live stream is often the better tool.</p><p><strong>What usually fails first when everyone joins a video call at once?</strong></p><p>The join path: sign-in, token issuance, signalling, room creation and TURN allocation. Media servers are sized for steady state; the join path takes every request in the same minute. Outages have shown existing calls surviving while new joins fail.</p><p><strong>How many participants can one video room hold?</strong></p><p>It depends on the platform. Twilio caps a video room at 50 participants. LiveKit's benchmarks ran 3,000 subscribers on one 16-core node, with each room fitting on a single node. Larger sessions need cascading across servers or a broadcast path.</p><p><strong>Does autoscaling handle video peaks?</strong></p><p>Not by itself for scheduled peaks. Reactive autoscaling adds servers after load arrives, which is after the join storm. For known events, scale up in advance.</p><p><strong>How should we load-test a video platform for peak?</strong></p><p>Replay a realistic arrival curve, such as half the attendees joining in the final minute, and measure join success rate and time to first video frame, not just how many participants the system can hold once connected.</p><p><strong>Does self-hosting change peak planning?</strong></p><p>You own every step of the join path and the capacity behind it, including TURN. With a platform such as Samvyo, which supports on-premise and managed-cloud deployment and is based on SFU architecture, the questions are the same: how a large session spans servers, how fast rooms can be created, and how the join path was tested.</p>]]></content:encoded></item><item><title><![CDATA[Enterprise Video SLA: What 99.9% Buys You and What the Credit Is Worth]]></title><description><![CDATA[99.9% sounds like a promise that calls will work. Read the document and it is narrower: an API or join rate measured in five-minute windows, outages under five minutes ignored, your own peaks sometimes excluded, and a credit of 10% of the month's bill as the only remedy.]]></description><link>https://www.samvyo.com/blog/enterprise-video-sla-what-99-9-buys-you-and-what-the-credit-is-worth</link><guid isPermaLink="false">6ad0af4e8b45c3f0cd63ad8c</guid><category><![CDATA[enterprise video solutions]]></category><category><![CDATA[SLA]]></category><category><![CDATA[procurement]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 15 Oct 2026 12:25:20 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Night-in-an-Empty-Auditorium.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Night-in-an-Empty-Auditorium.png" alt="Enterprise Video SLA: What 99.9% Buys You and What the Credit Is Worth"/><p>An enterprise video SLA reads like a promise that calls will work. 99.9% uptime sounds like almost never down.</p><p>Read the document instead of the number and the promise narrows quickly. Availability might mean API requests that didn't error, or joins that succeeded, measured in five-minute windows. Outages shorter than five minutes may not count at all. Your own peak can be excluded. And the remedy for all of it is usually a credit of around 10% of one month's bill.</p><p>We read three published SLAs from companies that sell real-time video, as they appeared on 13 October 2026. This post sets out what they actually commit to, and what to ask for when it matters.</p><h2 id="what-the-percentage-allows"><strong>What the Percentage Allows</strong></h2><p>Start with the arithmetic. Over a 30-day month:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="265"><col width="382"/></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Uptime commitment</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Downtime allowed per month</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">99.99%</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">4.3 minutes</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">99.95%</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">21.6 minutes</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">99.9%</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">43.2 minutes</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">99%</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">7.2 hours</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">95%</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">36 hours</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Forty-three minutes is one all-hands. A 99.9% SLA can be met in full by a month in which your single most important meeting failed from start to finish. The percentage says how much failure the vendor accepts, not when it happens.</p><h2 id="three-slas-three-definitions-of-available"><strong>Three SLAs, Three Definitions of "Available"</strong></h2><p>What counts as downtime matters more than the percentage, and the three documents define it differently.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="68"><col width="147"><col width="216"><col width="216"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><br/></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Twilio APIs</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Amazon Chime SDK</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">BytePlus RTC</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Top commitment</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">99.95% (99.99% on Enterprise Edition)</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Tiers from 99.99% (top tier needs a Well-Architected Review)</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">99.9%</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What is measured</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Minutes the APIs are unavailable</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Share of API requests without server errors, per 5-minute interval</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Join success rate, per 5-minute interval</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What counts as down</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Unavailability of 5 minutes or more</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Requests that return a 5XX error</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Join success below 95% for 5+ minutes, with at least 500 join attempts</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Credit</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">10% of fees for the affected API</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">10% / 25% / 100% by tier</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">10% / 25% / 50% by tier</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cap</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Not stated</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The tier percentages</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">50% of the monthly fee</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Claim window</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">30 days after the month</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">End of the second billing cycle</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">30 days after the month</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Remedy</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Credits are the sole and exclusive remedy</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Credits are the sole and exclusive remedy</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Credits are the sole and exclusive remedy</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Sources: the <a href="https://www.twilio.com/en-us/legal/service-level-agreement/twilio-apis?ref=samvyo.com"><u>Twilio APIs SLA</u></a> (last updated 9 April 2026), the <a href="https://aws.amazon.com/chime/chime-sdk/sla/?ref=samvyo.com"><u>Amazon Chime SDK SLA</u></a> (last updated 18 November 2022) and the <a href="https://docs.byteplus.com/en/docs/legal/docs-sla-for-byteplus-rtc-service?ref=samvyo.com"><u>BytePlus RTC SLA</u></a> (last updated 18 March 2024). SLAs are revised; check the version in your contract.</p><p>BytePlus's definition is the closest to what a user experiences: it measures whether people could join. Chime SDK's measures whether the API calls that create meetings and attendees returned errors. Twilio's measures minutes of unavailability. None of the three measures whether a call, once joined, was any good.</p><h2 id="four-gaps-between-the-sla-and-a-bad-call"><strong>Four Gaps Between the SLA and a Bad Call</strong></h2><h3 id="short-outages-dont-count"><strong>Short outages don't count</strong></h3><p>Twilio excludes unavailability of less than five continuous minutes. BytePlus requires join success below 95% for five minutes or longer. A four-minute failure at 10:00, or three two-minute failures in an hour, can leave the SLA untouched. Real-time video is unusually sensitive to short failures: a call that drops for four minutes is a meeting lost, not a minor blip.</p><h3 id="it-measures-the-api-not-the-call"><strong>It measures the API, not the call</strong></h3><p>Chime SDK's availability is built from requests: creating meetings and attendees, starting media pipelines, messaging. If those calls succeed but audio is choppy or video freezes, the SLA sees a healthy service. The same gap exists in reverse during real outages: when <a href="https://blog.cloudflare.com/cloudflare-service-outage-june-12-2025/?ref=samvyo.com"><u>Cloudflare's realtime SFU failed in June 2025</u></a>, calls in progress continued and only new sessions failed. Which side of that split your SLA measures decides whether the incident counts.</p><h3 id="your-peak-can-be-excluded"><strong>Your peak can be excluded</strong></h3><p>BytePlus excludes high-concurrency events on the customer's side. Chime SDK excludes downtime caused by exceeding service quotas. Both are reasonable from the vendor's side: they can't promise capacity you didn't plan for. But they mean the SLA is weakest at <a href="https://samvyo.com/blog/concurrent-video-session-scale-what-has-to-hold-at-org-wide-peak?ref=samvyo.com"><u>the moment every join arrives at once</u></a>, which is when an outage costs the most. If your critical events are known peaks, the contract needs to say they are covered, with the quotas to match.</p><h3 id="is-video-even-covered"><strong>Is video even covered?</strong></h3><p>Read the product scope before the percentage. Twilio's SLA covers APIs branded "Twilio" without listing Programmable Video by name, a point our post on <a href="https://samvyo.com/blog/who-gets-paged-at-2am-the-failure-modes-of-build-buy-and-embed?ref=samvyo.com"><u>who gets paged when video fails</u></a> raised earlier. Twilio also excludes alpha, beta and limited-release APIs. If the feature you depend on is new, it may sit outside the SLA entirely.</p><h2 id="what-the-credit-is-worth"><strong>What the Credit Is Worth</strong></h2><p>Take <a href="https://samvyo.com/blog/usage-based-vs-flat-licensing-showing-the-crossover-math?ref=samvyo.com"><u>the crossover workload</u></a> from our pricing analysis: 100 concurrent participants, eight hours a day, 22 days a month, at $0.004 per participant-minute, or $4,224 a month.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="324"><col width="324"/></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Credit tier</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Value</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">10%</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$422.40</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">25%</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$1,056</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">50%</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$2,112</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>A 10% credit on that bill is $422.40, applied to a future invoice, not paid out. It is the same whether the outage hit a quiet Sunday or the board meeting. And it only arrives if you claim it in time, with evidence: AWS asks for the affected five-minute intervals and your request logs, and requires an Enterprise Support plan to be eligible at all. Twilio wants the outage dates and times and supporting documentation within 30 days. Credits below $1 are not issued by AWS.</p><p>"Sole and exclusive remedy" closes the loop. All three documents make the credit the only thing you get, which in practice makes it the ceiling on the vendor's liability for downtime.</p><p>The counterweight is worth saying plainly. Credits were never meant to compensate you for an outage. They are a signal of how a vendor measures itself and what it is willing to put at risk. A provider with a stricter definition of "available" at 99.9% can be a better bet than one with a loose definition at 99.99%.</p><h2 id="what-to-ask-for-instead"><strong>What to Ask For Instead</strong></h2><p>If video is critical, negotiate the definition, not just the number:</p><ul><li><strong>Define availability as join success and media delivery,</strong> measured from your users' side, not only API errors.</li><li><strong>Shorten or remove the five-minute floor</strong> for real-time services, or add per-incident credits.</li><li><strong>Cover scheduled peaks explicitly,</strong> with the quotas and pre-scaling that make them realistic.</li><li><strong>Name the products.</strong> The SLA should list the video, recording and TURN services you use.</li><li><strong>Get incident reports.</strong> A written root cause within an agreed time is worth more operationally than the credit.</li></ul><p>Then measure it yourself. Alerting on join success rate and collecting call-quality statistics gives you the evidence a claim needs, and the early warning the SLA never will.</p><p>If you self-host, there is no vendor SLA at all. The number becomes an internal target, the redundancy behind it is yours to build, and the credit is replaced by your own on-call rota.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>An enterprise video SLA promises less than its percentage suggests. It defines availability its own way, ignores short outages, can exclude your peaks, may not name video, and pays out a credit of around 10% as the only remedy. Read the definition, negotiate it where video is critical, and keep your own measurements, because the contract won't keep them for you.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>A contract is only as good as the architecture under it. Next: </em><a href="https://samvyo.com/blog/enterprise-video-conferencing-architecture-what-actually-runs-behind-the-six-enterprise-checks?ref=samvyo.com"><em><u>the redundancy that backs the number</u></em></a><em>, and the other checks an enterprise buyer runs.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What does a 99.9% enterprise video SLA allow?</strong></p><p>About 43 minutes of downtime in a 30-day month. That is enough for one important meeting to fail completely while the SLA is still met. What counts as downtime depends on the document's own definition.</p><p><strong>Do video SLAs cover poor call quality?</strong></p><p>Not in the three we read. They measure API errors, unavailable minutes or join success. A call that connects but freezes or drops audio isn't counted as downtime.</p><p><strong>How much is an SLA credit worth?</strong></p><p>Typically 10% of that month's fees for the affected service at the first tier, applied to future invoices. On a $4,224 monthly bill, that is $422.40. Some SLAs step up to 25%, 50% or 100% for longer outages, and most make the credit your only remedy.</p><p><strong>Why don't short outages count against the SLA?</strong></p><p>Many SLAs exclude unavailability shorter than five continuous minutes or measure in five-minute windows. For real-time video, where a four-minute drop loses a meeting, ask for a shorter floor or per-incident credits.</p><p><strong>What should an enterprise ask for in a video SLA?</strong></p><p>Availability defined by join success and media delivery, named products, coverage for scheduled peaks, a shorter outage floor and written incident reports. For deployments where Samvyo runs the platform as a managed service, those are the same questions to put to Samvyo.</p><p><strong>Does a self-hosted video platform have an SLA?</strong></p><p>Not from a vendor. The uptime target becomes your own, and so does the redundancy behind it. Platforms such as Samvyo, which support on-premise deployment, give you control of the media path, TURN and recording, so availability depends on how you run them.</p>]]></content:encoded></item><item><title><![CDATA[Real-Time AI Video: What You Can Run Without Adding Latency]]></title><description><![CDATA["Real-time AI" covers features with very different deadlines. Noise suppression has milliseconds, background replacement has one video frame, captions can trail by half a second, and summaries can wait until the call ends. Where each one sits decides whether it adds latency.
]]></description><link>https://www.samvyo.com/blog/real-time-ai-video-what-you-can-run-without-adding-latency</link><guid isPermaLink="false">6ad0b0e08b45c3f0cd63ada3</guid><category><![CDATA[Real-time communication]]></category><category><![CDATA[AI]]></category><category><![CDATA[Video Latency]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 15 Oct 2026 12:25:17 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Night-Highway-Checkpoint.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Night-Highway-Checkpoint.png" alt="Real-Time AI Video: What You Can Run Without Adding Latency"/><p>Noise suppression has about ten milliseconds to do its job. Background replacement on a phone takes roughly one whole video frame. Live captions can trail speech by half a second and still be useful. A meeting summary can wait until everyone has left.</p><p>All four get sold as real-time AI video, and their deadlines run from milliseconds to minutes. Whether an AI feature adds latency to a call depends less on the model than on where it sits relative to the media: in the path every packet takes, beside it, or after the call.</p><h2 id="the-budget-every-feature-shares"><strong>The Budget Every Feature Shares</strong></h2><p>A call has a latency budget before any AI arrives. <a href="https://www.itu.int/rec/T-REC-G.114-200305-I/en?ref=samvyo.com"><u>ITU-T Recommendation G.114</u></a>, the standard reference for one-way delay, says most applications experience essentially transparent interactivity below 150 ms and recommends not exceeding 400 ms. Capture, encoding, network, jitter buffering and decoding already spend part of it; our breakdown of <a href="https://samvyo.com/blog/what-sub-80ms-video-latency-actually-means-and-why-most-real-time-isnt?ref=samvyo.com"><u>where a call's latency actually goes</u></a> shows how quickly it fills.</p><p>So the question for any AI feature is simple: does the call wait for it?</p><h2 id="three-places-an-ai-feature-can-sit"><strong>Three Places an AI Feature Can Sit</strong></h2>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="86"><col width="246"><col width="115"><col width="201"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Position</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What it means</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Does the call wait?</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Examples</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">In the media path</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Every audio or video frame passes through the model before it is sent</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes, on every frame</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Noise suppression, background blur or replacement</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Beside the media path</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A copy of the stream goes to the model; the call carries on without it</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No; the output arrives later</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Live captions, translation, live sentiment cues</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">After the call</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The model works on the recording</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Summaries, action items, search</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Only the first position can add latency to the call. The other two can be slow without anyone's voice arriving late; their delay shows up in how late the captions or insights appear, not in the conversation.</p><h2 id="in-the-path-audio-is-cheap"><strong>In the Path: Audio Is Cheap</strong></h2><p>Noise suppression has to run on every chunk of audio, so it is the strictest case. It is also the one that fits most easily.</p><p>The RNNoise design, described in <a href="https://arxiv.org/abs/1709.08243?ref=samvyo.com"><u>Jean-Marc Valin's paper</u></a>, processes audio in 20 ms windows with a 10 ms step and uses about 40 million floating-point operations per second. A plain C implementation needed around 1.3% of a single core on a 2013 Intel laptop processor, and 14% of one core on a Raspberry Pi 3. Many newer suppressors use larger models, but the class of problem is clear: audio enhancement can live inside the budget on almost any device.</p><h2 id="in-the-path-video-eats-a-frame"><strong>In the Path: Video Eats a Frame</strong></h2><p>Video is harder, because each frame is a much larger input and the deadline is the frame interval: 33.3 ms at 30 frames per second.</p><p><a href="https://developers.google.com/edge/mediapipe/solutions/vision/image_segmenter?ref=samvyo.com"><u>Google's MediaPipe segmentation guide</u></a> publishes average latencies on a Pixel 6. Its selfie segmenter, the model behind background blur and replacement, takes 33.46 ms on the CPU and 35.15 ms on the GPU for a 256 × 256 input. That is the whole frame interval at 30 fps, before the blur or the composite is drawn.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="176"><col width="176"><col width="294"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Frame rate</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Frame interval</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Selfie segmenter (Pixel 6 CPU)</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">30 fps</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">33.3 ms</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">≈100% of the interval</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">24 fps</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">41.7 ms</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">≈80%</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">15 fps</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">66.7 ms</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">≈50%</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Teams handle this in three ways. They run segmentation on every second frame and reuse the mask, they pipeline it so frames keep flowing at full rate while each one arrives a frame later, or they drop the frame rate. Each is a trade: a slightly lagging mask, about one frame of added delay, or less smooth video. On phones older than the benchmark device, the numbers get worse.</p><p>That is the honest counterweight to "without adding latency": background replacement on a phone usually adds some, and users accept it because privacy is worth a frame. It also shows why device limits shape what AI can run at the edge, the same reason <a href="https://samvyo.com/blog/why-edge-ai-alone-cant-solve-fleet-video-and-what-the-cloud-layer-needs-to-do?ref=samvyo.com"><u>why edge AI alone can't carry a fleet</u></a>.</p><h2 id="beside-the-path-captions-choose-their-delay"><strong>Beside the Path: Captions Choose Their Delay</strong></h2><p>Speech-to-text does not need to sit in the media path. A copy of the audio goes to the model, and the call never waits for it. What the model controls is how far captions trail the speech.</p><p>Streaming models make that delay an explicit design choice. Kyutai's open speech-to-text models, per <a href="https://huggingface.co/kyutai/stt-1b-en_fr?ref=samvyo.com"><u>its model card</u></a>, come in two versions: a ~1-billion-parameter English and French model with a 0.5-second delay, and a ~2.6-billion-parameter English model with a 2.5-second delay. Waiting longer lets the model hear more context before committing to words. These are the developer's own figures for its own models, but they show the trade every captioning system makes between delay and accuracy.</p><p>Running it is a server workload. Kyutai's <a href="https://github.com/kyutai-labs/delayed-streams-modeling?ref=samvyo.com"><u>repository</u></a> says an H100 can process 400 streams in real time, and that it serves 64 simultaneous connections on an L40S GPU at three times real-time speed. That makes transcription a capacity-planning question, not a call-latency question.</p><h2 id="after-the-call-summaries-have-minutes"><strong>After the Call: Summaries Have Minutes</strong></h2><p>Summaries, action items and meeting-wide sentiment work on the whole conversation, so they run on the recording or the transcript after the call, or periodically during it. Their latency matters to the person waiting for the summary, not to the call. They are also the heaviest models in the list, which is fine: nothing live depends on them.</p><h2 id="the-rule-that-falls-out"><strong>The Rule That Falls Out</strong></h2><p>Put the cheap, per-frame work in the path and on the device; put everything that needs a server beside the path or after the call. Routing live media through an inference server before forwarding it adds a network hop plus model time to every packet, which spends the call's budget on a feature the user may not even be looking at. Forking a copy to that server spends nothing.</p><p>That leaves one question this post doesn't answer: when the model runs on a server, whose server is it, and what leaves your network? That is the next post.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Real-time AI video is four different deadlines under one label. Noise suppression fits in milliseconds on almost any device. Background replacement takes about a frame on a phone and usually adds a little delay. Captions and translation sit beside the call and choose how far they trail. Summaries run after it. Keep the media path for the cheap, local work and fork everything else.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>Once inference needs a server, the question becomes ownership. Next: </em><a href="https://samvyo.com/blog/on-prem-ai-video-running-inference-without-sending-media-to-a-third-party?ref=samvyo.com"><em><u>where the inference runs and what leaves your network</u></em></a><em>.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>Does real-time AI video add latency to calls?</strong></p><p>Only features that sit in the media path, where every frame waits for the model. Noise suppression adds very little; background replacement on a phone can add about a frame. Captions, translation and summaries run on a copy of the stream or the recording, so the call itself never waits for them.</p><p><strong>How fast does AI noise suppression need to be?</strong></p><p>Fast enough to process each small chunk of audio before the next arrives, typically every 10 to 20 ms. The RNNoise design uses 20 ms windows with a 10 ms step and needed about 1.3% of one laptop CPU core, so it fits comfortably.</p><p><strong>Why does background blur slow down video on some phones?</strong></p><p>Segmenting a person from the background takes about 33–35 ms per frame on a Pixel 6 with Google's MediaPipe selfie model, which is the entire frame interval at 30 fps. Apps compensate by skipping frames, pipelining or lowering the frame rate.</p><p><strong>How much delay do live captions have?</strong></p><p>It is a design choice. Streaming models trade delay for accuracy; Kyutai's open models, for example, use 0.5 seconds and 2.5 seconds. Because captions are produced from a copy of the audio, that delay affects when text appears, not the call.</p><p><strong>Where should AI features run on a video platform?</strong></p><p>Per-frame enhancement such as noise suppression and background replacement belongs on the user's device. Transcription, summaries and sentiment need a server and should run beside the call or after it. Samvyo's architecture follows that split: noise cancellation and background replacement are designed to run on the device with no server, while transcription, summaries and sentiment run on servers.</p><p><strong>Can AI processing on calls stay inside our own network?</strong></p><p>It depends on where the server-side models run. On-device features never leave the device. For server-side features, Samvyo's design allows the media servers and AI inference servers to run in the customer's own cloud or on-premise under its licensing plan, which keeps that processing inside the customer's network; this does not apply to its pay-per-use plan.</p>]]></content:encoded></item><item><title><![CDATA[On-Prem AI Video: Running Inference Without Sending Media to a Third Party]]></title><description><![CDATA[Turning on live captions can send every word of a board meeting to another company's servers. Whether it does depends on where inference runs: on the device, on servers you control, or through a third-party API. Here is what leaves your network in each case, and what keeping it in costs.]]></description><link>https://www.samvyo.com/blog/on-prem-ai-video-running-inference-without-sending-media-to-a-third-party</link><guid isPermaLink="false">6ad0b1998b45c3f0cd63adba</guid><category><![CDATA[On-Premise Video Conferencing]]></category><category><![CDATA[AI]]></category><category><![CDATA[data residency]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 15 Oct 2026 12:25:12 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Industrial-Loading-Yard-at-Night.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Industrial-Loading-Yard-at-Night.png" alt="On-Prem AI Video: Running Inference Without Sending Media to a Third Party"/><p>Turning on live captions can send every word of a board meeting to another company's servers. So can meeting summaries, sentiment cues and translation. The video platform may run entirely on your infrastructure, and the AI on top of it may not.</p><p>On-prem AI video means keeping that inference inside your own network. Whether you need it, and what it costs, comes down to one question for each feature: where does the model run? Our post on <a href="https://samvyo.com/blog/real-time-ai-video-what-you-can-run-without-adding-latency?ref=samvyo.com"><u>which AI features can run without adding latency</u></a> sorted features by deadline. This one sorts them by what leaves the building.</p><h2 id="three-places-inference-can-run"><strong>Three Places Inference Can Run</strong></h2>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="94"><col width="214"><col width="181"><col width="158"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><br/></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">On the device</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">On servers you control</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Third-party AI API</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What leaves your network</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Nothing</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Nothing, if the media servers are yours too</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Audio, video or text sent to the API</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Who processes the data</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The user's device</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">You</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The provider, under its terms</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Fits</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Per-frame work: noise suppression, background replacement</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Transcription, translation, summaries, sentiment</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The same server-side features</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Capacity</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Limited by the weakest device</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">GPUs you buy and run</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The provider's problem</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Model quality and updates</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Small models</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Open or licensed models you update</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Usually the newest models, updated for you</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>On-device features are private by construction: the audio or frame is processed where it was captured. They are also limited to small models, so the heavier features land on a server. Which server is the decision that matters.</p><h2 id="what-a-third-party-api-actually-keeps"><strong>What a Third-Party API Actually Keeps</strong></h2><p>Sending audio to an AI API is not the same as giving it away. The terms are detailed, and they are getting better. Take <a href="https://developers.openai.com/api/docs/guides/your-data?ref=samvyo.com"><u>OpenAI's API data policy</u></a> as it read on 14 October 2026:</p><ul><li>API data is not used to train its models unless you opt in.</li><li>Abuse-monitoring logs are kept for up to 30 days by default on most endpoints, including the Realtime API; the audio transcription endpoint keeps none.</li><li>Zero data retention is available for eligible endpoints, including transcription and Realtime, but requires approval.</li><li>Data storage can be kept in several regions, including India, but regional processing is listed only for the US, the EU and the UAE.</li></ul><p>That last line is the kind of detail a security review catches. A company in India can keep stored data in India and still have its meeting audio processed abroad. Other providers' terms differ, so read the endpoint-level detail for the provider you use, not the headline policy.</p><p>Even with the best terms, the data still leaves your network and the provider becomes a processor of it. For many organisations that is acceptable with the right agreement. For others, the rules about <a href="https://samvyo.com/blog/video-data-residency-where-your-media-legally-has-to-live?ref=samvyo.com"><u>where your media legally has to live</u></a> make it a non-starter.</p><h2 id="shrink-what-leaves-before-you-decide-where"><strong>Shrink What Leaves Before You Decide Where</strong></h2><p>The choice isn't all or nothing. Most AI features need far less than the full media:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="150"><col width="347"><col width="150"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What the feature needs</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Examples</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What could stay inside</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Video frames</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Background replacement, gesture or object detection</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Run on the device</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Audio only</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Transcription, translation, voice sentiment</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Video never leaves</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Transcript only</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Summaries, action items, search</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Audio never leaves</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Metadata only</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Talk-time, participation, call quality</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Content never leaves</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>A design that runs transcription in-house and sends only text to an external summariser exposes far less than one that streams the full call to an API. Removing names or account numbers from the transcript before it leaves narrows it further. Decide the minimum each feature needs, then decide where that minimum is processed.</p><h2 id="running-inference-yourself-what-it-costs"><strong>Running Inference Yourself: What It Costs</strong></h2><p>Keeping server-side AI in-house turns a per-minute API bill into a capacity plan. Transcription is a GPU workload. Kyutai's open speech-to-text project, in <a href="https://github.com/kyutai-labs/delayed-streams-modeling?ref=samvyo.com"><u>its repository</u></a>, reports serving 64 simultaneous connections on one L40S GPU at three times real-time speed, and says an H100 can process 400 streams in real time. These are the developer's own figures for its own models.</p><p>On those figures, 200 concurrent captioned streams need four L40S GPUs, or one H100 at the higher figure, before redundancy. Peaks matter here as much as for the media servers: if the all-hands is captioned, the GPUs have to cover it.</p><p>The other costs are less visible. Someone has to choose, update and evaluate the models. Quality may trail the newest commercial APIs. Summaries and sentiment need language models, which bring their own hardware and tuning. In exchange, nothing leaves, which for some deployments is the only acceptable answer: a <a href="https://samvyo.com/blog/air-gapped-video-conferencing-what-zero-internet-actually-requires?ref=samvyo.com"><u>deployment with zero internet</u></a> cannot call an external API at all.</p><h2 id="the-condition-that-makes-never-leaves-true"><strong>The Condition That Makes "Never Leaves" True</strong></h2><p>"Video never leaves your network" is a strong claim, and it is only true when every piece that touches the media is inside:</p><ul><li><strong>The media servers.</strong> If calls route through a vendor's cloud, the media has already left, whatever the AI does.</li><li><strong>The AI inference servers.</strong> Every server-side model, including transcription, summaries and sentiment.</li><li><strong>Recording and transcript storage.</strong> Where the output lands matters as much as where it was produced.</li><li><strong>Client-side features.</strong> On-device processing keeps them local by design.</li></ul><p>If any one of these is a third-party service, the claim no longer holds. When a vendor says media never leaves, ask which deployment and which plan that applies to. It is rarely all of them.</p><p>The counterweight belongs here too. For most organisations, a third-party API with zero data retention, regional processing and a processing agreement is a reasonable choice, and often the better model. On-prem AI video is for the cases where the data itself must not leave: regulated industries, government, sovereignty requirements and air-gapped sites.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>On-prem AI video is a question of where inference runs, feature by feature. On-device work never leaves. Server-side work stays inside only if both the media servers and the inference servers are yours. Third-party APIs send data out under terms that are better than they used to be but still terms. Shrink what each feature needs, then put it where your rules allow.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>Where the AI runs is one part of a broader deployment choice. Next: </em><a href="https://samvyo.com/blog/video-deployment-models-on-prem-managed-cloud-or-saas-and-your-data-story?ref=samvyo.com"><em><u>on-prem, managed cloud or SaaS</u></em></a><em>, and what each does to your data story.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What is on-prem AI video?</strong></p><p>Running the AI features of a video platform, such as transcription, summaries and sentiment, on servers inside your own network instead of sending media to an external AI service. It keeps meeting content inside, at the cost of running the GPUs and models yourself.</p><p><strong>Does using an AI API for transcription send my meeting audio outside?</strong></p><p>Yes. The audio goes to the provider for processing. Terms vary by provider and endpoint. OpenAI, for example, does not train on API data by default; its Realtime API keeps abuse-monitoring logs for up to 30 days unless you are approved for zero data retention, and regional processing is listed only for the US, EU and UAE.</p><p><strong>Which AI features can run without any server?</strong></p><p>Per-frame features like noise suppression and background replacement run on the user's device, so nothing leaves it. Transcription, summaries and sentiment need server-side models. Samvyo's architecture follows this split: noise cancellation and background replacement are designed to run on the device, while transcription, summaries and sentiment run on servers.</p><p><strong>Can a video platform guarantee that video never leaves our network for AI?</strong></p><p>Only if the media servers, the AI inference servers and storage all run in your environment. With Samvyo, that claim applies only on its licensing plan, where the customer runs both the media servers and the AI inference servers in its own cloud or on-premise. It does not apply to pay-per-use customers.</p><p><strong>How many GPUs does in-house transcription need?</strong></p><p>It depends on the model and concurrency. One open-source project reports 64 simultaneous streams on an L40S GPU and 400 real-time streams on an H100. Size for your peak, including large captioned meetings, and add redundancy.</p><p><strong>Is a third-party AI API with zero data retention enough?</strong></p><p>For many organisations, yes, combined with regional processing and a data processing agreement. Where rules require that media never leaves your control, or the deployment is air-gapped, inference has to run on infrastructure you operate.</p>]]></content:encoded></item><item><title><![CDATA[Collecting WebRTC getStats Evidence in Production]]></title><description><![CDATA["The call was bad" is not a bug report. Every WebRTC session already measures loss, jitter, freezes, round-trip time and whether it is relayed; getStats is how you read it. Here are the fields that matter, from the W3C spec, and how to collect them across real users.
]]></description><link>https://www.samvyo.com/blog/collecting-webrtc-getstats-evidence-in-production</link><guid isPermaLink="false">6ac4fd878b45c3f0cd63ac69</guid><category><![CDATA[live monitoring]]></category><category><![CDATA[getStats]]></category><category><![CDATA[WebRTC]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 07 Oct 2026 10:32:27 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/10/Lone-Black-Box-in-the-Rain.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/10/Lone-Black-Box-in-the-Rain.png" alt="Collecting WebRTC getStats Evidence in Production"/><p>"The call was bad" is the whole bug report, most of the time. No timestamp, no network, no idea whether the problem was the user's Wi-Fi, a relay, the server or the camera.</p><p>The browser already knows. Every WebRTC session continuously measures packet loss, jitter, round-trip time, frozen video, why the sender lowered quality and whether media is being relayed. getStats() is how you read it. Collecting it across real users in production, rather than in a debugging tab, is what turns a complaint into evidence.</p><h2 id="what-getstats-actually-returns"><strong>What getStats actually returns</strong></h2><p>Calling getStats() on a peer connection returns a report: a map of stats objects, each with a type, an ID and a timestamp, and IDs that link related objects together. The <a href="https://www.w3.org/TR/webrtc-stats/?ref=samvyo.com"><u>W3C specification</u></a>, a Candidate Recommendation Draft dated 25 September 2025, defines the types, including:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="259"><col width="388"/></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Type</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What it describes</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">inbound-rtp / outbound-rtp</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">One media stream being received or sent</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">remote-inbound-rtp / remote-outbound-rtp</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What the other side reports about your streams</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">candidate-pair</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A pair of network addresses ICE tested; one is selected for the call</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">local-candidate / remote-candidate</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The addresses themselves, including their type</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">transport</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The connection carrying media, and which candidate pair it uses</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">codec, media-source, media-playout</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Encoding, the capture source and audio playout</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><h2 id="the-fields-that-answer-real-questions"><strong>The fields that answer real questions</strong></h2><p>Most of the report is noise for monitoring. A short list answers the questions incidents actually ask:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="220"><col width="246"><col width="181"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Question</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Where to look</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Notes</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Is this call </span><a href="https://samvyo.com/blog/what-is-a-turn-server-and-when-does-a-call-actually-need-one?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">going through a TURN relay</span></a><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">?</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Selected candidate-pair → its local or remote candidate's type</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">"relay" means TURN</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">How far away is the other end?</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">candidate-pair.currentRoundTripTime</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Seconds</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">How much bandwidth does the sender think it has?</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">candidate-pair.availableOutgoingBitrate</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The </span><a href="https://samvyo.com/blog/webrtc-bandwidth-estimation-why-your-call-downgrades-before-it-drops?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">bandwidth estimation</span></a><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> output</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Why did my video quality drop?</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">outbound-rtp.qualityLimitationReason</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">none, cpu, bandwidth or other</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Are packets being lost?</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">inbound-rtp.packetsLost</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cumulative, as RFC 3550 defines it</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Is arrival timing unstable?</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">inbound-rtp.jitter</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Seconds</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Did video freeze?</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">inbound-rtp.freezeCount, totalFreezesDuration</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Count, and seconds frozen</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Were frames thrown away?</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">inbound-rtp.framesDropped</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Before decode, or late for display</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">How much playout delay is there?</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">jitterBufferDelay ÷ jitterBufferEmittedCount</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Average seconds per frame or sample</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>qualityLimitationReason is the most underused field. When a user's outgoing video drops to a low resolution, it tells you whether their CPU or their network made that call. That one value usually decides whether the fix is on your side or theirs.</p><h2 id="counters-not-rates"><strong>Counters, not rates</strong></h2><p>Most of these values are running totals since the stream started. A packetsLost of 1,200 means nothing on its own; it might be the first ten seconds or the last ten minutes.</p><p>The specification is explicit about how to use them: compute averages "by calling getStats() twice, taking the difference of the two sums and dividing by the difference of the two counts", and for time-based values such as byte counts, divide by the difference in timestamps. In practice that means every sample is compared with the previous one for the same object ID:</p><p>const prev = new Map();</p><p>async function sample(pc) {</p><p>&nbsp;&nbsp;const report = await pc.getStats();</p><p>&nbsp;&nbsp;report.forEach(s =&gt; {</p><p>&nbsp;&nbsp;&nbsp;&nbsp;if (s.type !== 'inbound-rtp' || s.kind !== 'video') return;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;const p = prev.get(s.id);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;if (p) {</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const lost = s.packetsLost - p.packetsLost;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const recv = s.packetsReceived - p.packetsReceived;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const lossRate = lost / Math.max(1, lost + recv);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const kbps = 8 * (s.bytesReceived - p.bytesReceived) / (s.timestamp - p.timestamp);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;emit({ id: s.id, lossRate, kbps, freezes: s.freezeCount - p.freezeCount });</p><p>&nbsp;&nbsp;&nbsp;&nbsp;}</p><p>&nbsp;&nbsp;&nbsp;&nbsp;prev.set(s.id, s);</p><p>&nbsp;&nbsp;});</p><p>}</p><p>Two details matter. Objects come and go, so a stream ID you saw last time may be gone and a new one may appear. Treat a missing previous sample as "no rate yet", not as zero. And a counter that goes down means the object was replaced; reset rather than recording a negative.</p><h2 id="designing-a-webrtc-getstats-production-collector"><strong>Designing a WebRTC getStats production collector</strong></h2><p>None of what follows is in a standard. These are design choices, and the right values depend on your traffic and budget.</p><ul><li><strong>Sample on a fixed interval, summarise on the client.</strong> Polling every few seconds and sending a compact summary keeps payloads small. Send raw reports only for a small sample of sessions, or on demand.</li><li><strong>Tag every record.</strong> Session ID, your own participant ID, browser and version, SDK version, platform and network type. Without tags, evidence cannot be compared.</li><li><strong>Keep a per-session summary.</strong> Relayed or not, worst round-trip time, total loss rate, seconds frozen, and the share of time each quality-limitation reason was active. That summary is what support and incident reviews actually read.</li><li><strong>Leave addresses out.</strong> Candidate stats include IP addresses. Record the candidate type, not the address, unless you have a specific, documented reason.</li><li><strong>Expect missing fields.</strong> Implementations differ, and the spec itself says fields that reveal hardware "MUST NOT exist unless exposing hardware is allowed". A collector that breaks on a missing field will break on the first unfamiliar browser.</li></ul><h2 id="if-your-collector-predates-chrome-117"><strong>If your collector predates Chrome 117</strong></h2><p>Chrome removed the old callback-based getStats() in version 117, with an origin trial extending it to version 121. Collectors written against it need porting. Chrome's <a href="https://developer.chrome.com/blog/getstats-migration?ref=samvyo.com"><u>migration guide</u></a> maps the old names to the standard ones:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="291"><col width="356"/></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Legacy (goog-prefixed)</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Standard</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">googRtt</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">candidate-pair.currentRoundTripTime</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">googAvailableSendBandwidth</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">candidate-pair.availableOutgoingBitrate</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">googTargetEncBitrate</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">outbound-rtp.targetBitrate</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">googCodecName</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">codec.mimeType</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>One change catches people out: with simulcast, the standard API reports a separate outbound-rtp object for each layer, where the legacy API showed one. A collector that assumes one outbound video stream per sender will under-count what is actually being sent.</p><h2 id="what-client-stats-cannot-tell-you"><strong>What client stats cannot tell you</strong></h2><p>getStats sees one side of one connection. It cannot see inside your media server, it cannot see another user's network, and on a call through an SFU, a remote participant's problem shows up in your stats only as its effect on the streams you receive. Pair client evidence with server-side metrics and logs before deciding where a problem sits, and treat any single metric as a clue, not a root cause.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Every WebRTC session already measures what you need to diagnose it. getStats exposes it as typed, linked objects defined by the W3C spec; most values are cumulative, so rates come from deltas between samples. Collect a small set of fields, sample on an interval, tag everything, leave addresses out, and keep a summary per session. Then "the call was bad" arrives with evidence attached.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>Evidence matters most at 2am. For what happens on each path when video fails, see </em><a href="https://samvyo.com/blog/who-gets-paged-at-2am-the-failure-modes-of-build-buy-and-embed?ref=samvyo.com" rel="noreferrer"><em>who gets paged when video fails</em></a><em>.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>How do I use WebRTC getStats in production?</strong></p><p>Sample getStats() on a fixed interval, compute rates from the difference between consecutive samples, summarise on the client and send compact records tagged with session, browser and SDK version. Keep raw reports for a small sample of sessions only.</p><p><strong>How can I tell if a WebRTC call is using TURN?</strong></p><p>Find the selected candidate pair in the stats report and check the candidate type of its local or remote candidate. A type of "relay" means media is going through a TURN server.</p><p><strong>Why are getStats values so large?</strong></p><p>Most are cumulative counters since the stream started, such as packets lost or bytes received. Subtract the previous sample from the current one and divide by the time between them to get a rate.</p><p><strong>What does qualityLimitationReason mean?</strong></p><p>It reports why the sender is limiting its outgoing video quality: none, cpu, bandwidth or other. It is the quickest way to tell whether a low-quality stream is caused by the sender's device or its network.</p><p><strong>Does the old getStats API still work?</strong></p><p>Not in current Chrome. The legacy callback-based getStats() was removed in Chrome 117, with an origin trial extending it to 121. Collectors using goog-prefixed names need to move to the standard stats objects.</p><p><strong>Can I see server-side problems in getStats?</strong></p><p>Only indirectly. getStats describes the browser's own connections, so media-server or relay problems appear as their effects on the streams you send and receive. Platforms that keep the media path and TURN on infrastructure you control, such as Samvyo, which is based on SFU architecture, let you put server-side metrics next to client stats for the same session.</p>]]></content:encoded></item><item><title><![CDATA[Who Gets Paged at 2am: The Failure Modes of Build, Buy and Embed]]></title><description><![CDATA[Every way of running video fails sometimes. What the choice of build, buy or embed really decides is who gets woken up, whether they can fix it, and what recovery waits on. Here are the failure modes of each path, using three real postmortems, one SLA and one security advisory.]]></description><link>https://www.samvyo.com/blog/who-gets-paged-at-2am-the-failure-modes-of-build-buy-and-embed</link><guid isPermaLink="false">6ac4fc848b45c3f0cd63ac52</guid><category><![CDATA[Video Infrastructure]]></category><category><![CDATA[Reliability]]></category><category><![CDATA[Failure Modes]]></category><category><![CDATA[WebRTC]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 07 Oct 2026 10:32:17 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Night-City-Blackout.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Night-City-Blackout.png" alt="Who Gets Paged at 2am: The Failure Modes of Build, Buy and Embed"/><p>On 12 June 2025, for two hours and 28 minutes, Cloudflare's TURN service failed almost every request. Its SFU could not create new sessions, although calls already running carried on. Traffic fell to 20% of normal. The cause, in <a href="https://blog.cloudflare.com/cloudflare-service-outage-june-12-2025/?ref=samvyo.com"><u>Cloudflare's own postmortem</u></a>, was a failure in a third-party storage service underneath one of its internal systems.</p><p>Now picture that night three ways: you built your video stack, you bought a cloud API, or you embedded a commercial platform on your own infrastructure. Every path fails sometimes. What the choice actually decides is <strong>who gets woken up, whether they can fix it, and what recovery waits on</strong>. The architecture differences are in <a href="https://samvyo.com/blog/build-buy-or-embed-the-technical-decision-guide-for-video-infrastructure?ref=samvyo.com"><u>the technical decision guide</u></a>; this post is about the pager.</p><h2 id="video-infrastructure-failure-modes-in-three-kinds"><strong>Video infrastructure failure modes, in three kinds</strong></h2><p>Most video incidents fall into one of three groups, and each path owns a different share of them:</p><ul><li><strong>Service failures:</strong> the media servers, relays or signalling stop working.</li><li><strong>Dependency failures:</strong> something underneath fails, such as the cloud region, a storage service or DNS.</li><li><strong>Change failures:</strong> a patch, a security fix or a browser release breaks something that worked yesterday.</li></ul>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="116"><col width="168"><col width="181"><col width="181"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><br/></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Buy (cloud API)</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Build (open source, self-run)</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Embed (commercial platform, your infra)</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Who is paged</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">You, to watch and communicate</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">You, to diagnose and fix</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">You for infrastructure; the vendor for software</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Who can fix a service failure</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The provider</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your team</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Split: you restart and scale, the vendor ships fixes</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Dependency failures</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The provider's cloud, invisible to you</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your cloud, visible to you</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your cloud, visible to you</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Change failures</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The provider's releases and browser updates</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Every patch, CVE and browser change</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your upgrades of the vendor's releases</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Recovery waits on</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The provider's timeline</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your team's depth</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your team for infra, the vendor for bugs</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><h2 id="buy-you-get-paged-they-fix-it"><strong>Buy: you get paged, they fix it</strong></h2><p>When a cloud video API fails, your on-call engineer is paged by your own alerts or your customers, and then mostly waits. They can confirm it is the provider, update your status page, and tell customers. They cannot fix it.</p><p>The Cloudflare incident shows the shape of a typical failure. Existing calls survived; new ones could not start; <a href="https://samvyo.com/blog/what-is-a-turn-server-and-when-does-a-call-actually-need-one?ref=samvyo.com"><u>the relay layer</u></a> failed outright for users who needed it. A dashboard that only counts active sessions would have looked half-fine for the first hour. Alerting on <strong>join success rate</strong> is what catches this kind of outage early.</p><p>Then there is the contract. Twilio's <a href="https://www.twilio.com/en-us/legal/service-level-agreement/twilio-apis?ref=samvyo.com"><u>API service level agreement</u></a> commits to 99.95% availability for standard services, which allows about 21.6 minutes of downtime in a 30-day month. Only unavailability of five or more continuous minutes counts, the remedy is a 10% credit on that service's monthly fee, and credits are described as the "sole and exclusive remedy". The document does not name Programmable Video, so check what your own video product is covered by before relying on it.</p><p>Buying hands the fixing to people who do it all day, which is usually worth a lot. What it does not hand over is the night itself: your customers still call you.</p><h2 id="build-you-get-paged-you-fix-it"><strong>Build: you get paged, you fix it</strong></h2><p>Run the stack yourself and every failure is yours to diagnose and fix, including the ones that are not really about video.</p><ul><li><strong>Your cloud fails.</strong> From 11:48 PM PDT on 19 October to 2:20 PM PDT on 20 October 2025, about 14.5 hours, <a href="https://aws.amazon.com/message/101925?ref=samvyo.com"><u>AWS us-east-1</u></a> suffered a disruption that started with an empty DNS record for DynamoDB and spread to services including EC2 and Network Load Balancer. A video stack built in that region inherited it.</li><li><strong>Your relays need patching.</strong> coturn, the standard open-source TURN server, had a <a href="https://www.enablesecurity.com/advisories/ES2021-01-coturn-access-control-bypass/?ref=samvyo.com"><u>published access-control bypass</u></a> in versions 4.5.1.x, announced 11 January 2021 and fixed in 4.5.2. Finding, testing and rolling out that patch across every relay is your job.</li><li><strong>Browsers change underneath you.</strong> Chrome removed the legacy callback-based getStats API in <a href="https://developer.chrome.com/blog/getstats-migration?ref=samvyo.com"><u>version 117</u></a>. Any monitoring built on it stopped returning data unless someone on your team had migrated it first.</li></ul><p>The upside is real: you can see everything, change anything, and fail over on your own terms. Recovery time is set by your team's depth, which is the part that has to be staffed around the clock.</p><h2 id="embed-the-pager-is-split"><strong>Embed: the pager is split</strong></h2><p>Running a commercial platform on your own infrastructure divides the work. You own the infrastructure, so cloud failures, capacity and networking are yours to see and act on immediately. The vendor owns the software, so a bug in the media server or SDK waits on their fix, delivered as a release you then roll out.</p><p>This is reasoning about responsibility, not a measured result, and the details depend on the support contract. The questions to ask a vendor are concrete: who is on call for software defects, what the response time is at 2am in your time zone, and how emergency fixes reach infrastructure they do not operate.</p><h2 id="what-to-watch-whichever-path-you-take"><strong>What to watch, whichever path you take</strong></h2><p>Some failure modes exist on every path: client networks, blocked ports, bad Wi-Fi. Monitoring should separate those from platform failures. A starting set, offered as design choices rather than standards:</p><ul><li><strong>Join success rate.</strong> The fastest signal for outages like Cloudflare's, where existing calls hide the problem.</li><li><strong>Signalling connected versus media connected.</strong> A session that joins but never gets media points at the media path or relay, not at login.</li><li><strong>Relay share.</strong> A sudden rise usually means something changed in the network path, not in your users.</li><li><strong>Client-side quality.</strong> Round-trip time, loss, freezes and why the sender reduced quality, collected from the browser across real sessions.</li></ul><h2 id="the-honest-counterweight"><strong>The honest counterweight</strong></h2><p>For most teams, buying is the more reliable option in practice. A provider running video for thousands of customers has more people, more regions and more incident practice than a small team can staff. Handing them the pager is often exactly right.</p><p>What you give up is control of the timeline. When the provider is down, you wait; when their priorities change, you adapt. A failure you cannot fix is one of the few good reasons to leave a provider, and it is worth knowing in advance <a href="https://samvyo.com/blog/the-switching-cost-what-you-actually-rewrite-to-move-video-providers?ref=samvyo.com"><u>what you would rewrite to leave</u></a>.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Video infrastructure failure modes are the same on every path: services fail, dependencies fail, and changes break things. Build, buy and embed decide who is paged, who can fix it and what recovery waits on. Buying hands over the fixing but not the night; building gives you every lever and every pager; embedding splits them at the line between infrastructure and software. Alert on join success, read the SLA's remedy clause, and decide which of those trades your team can actually staff.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>Every incident starts with evidence from real sessions. </em><a href="https://samvyo.com/blog/collecting-webrtc-getstats-evidence-in-production?ref=samvyo.com"><em>Collecting getStats evidence in production</em></a><em> covers how to gather it from the browser before you need it.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What are the main video infrastructure failure modes?</strong></p><p>Three kinds: service failures in media servers, relays or signalling; dependency failures in the cloud, storage or DNS underneath; and change failures from patches, security fixes and browser releases. Client network problems sit on top of all three and exist on every path.</p><p><strong>What happens to my app when my video API provider has an outage?</strong></p><p>Usually you cannot fix it, only detect it and communicate. In Cloudflare's 12 June 2025 incident, calls already running continued while new sessions failed, so monitoring join success rather than active sessions is what shows the outage early.</p><p><strong>What does a 99.95% SLA actually allow?</strong></p><p>About 21.6 minutes of unavailability in a 30-day month. Under Twilio's API SLA, only outages of five or more continuous minutes count, and the remedy is a 10% service credit described as the sole and exclusive remedy.</p><p><strong>Is self-hosted video less reliable than a cloud API?</strong></p><p>Not inherently, but reliability depends on your team. You inherit your cloud's failures, every security patch and every browser change, and recovery time is set by how many people can respond at 2am.</p><p><strong>Who is responsible for incidents with an embedded video platform?</strong></p><p>Usually split: you own the infrastructure it runs on, the vendor owns software defects. With Samvyo, which is based on SFU architecture and resilient by design, the media path, TURN and recording run on infrastructure you control, so infrastructure incidents are visible to your team directly; agree software support terms before go-live.</p><p><strong>What should a video on-call engineer monitor?</strong></p><p>Join success rate, signalling versus media connection, relay share, and client-side quality metrics such as round-trip time, loss and freezes. Thresholds should come from your own baseline rather than a generic number.</p>]]></content:encoded></item><item><title><![CDATA[The Seam: Abstracting Video Behind Your Own Interface So You Can Leave Later]]></title><description><![CDATA[Two posts on this blog give the same advice in one sentence: wrap the video SDK so join, publish and record are your verbs, not the vendor's. Neither shows how. This one does: the four sides of the seam, an interface sketch, what to let through, and what the layer costs you.]]></description><link>https://www.samvyo.com/blog/the-seam-abstracting-video-behind-your-own-interface-so-you-can-leave-later</link><guid isPermaLink="false">6ac4f9618b45c3f0cd63ac3c</guid><category><![CDATA[Video SDK]]></category><category><![CDATA[Video Architecture]]></category><category><![CDATA[Vendor Lock-in]]></category><category><![CDATA[WebRTC]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 07 Oct 2026 10:32:08 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Night-Freight-Train-Coupling-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Night-Freight-Train-Coupling-1.png" alt="The Seam: Abstracting Video Behind Your Own Interface So You Can Leave Later"/><p>Two posts on this blog give the same advice in a single sentence. Wrap the SDK so "join", "publish" and "record" are your verbs, and <a href="https://samvyo.com/blog/how-to-integrate-a-video-sdk-rooms-tokens-tracks-and-the-parts-the-quickstart-skips?ref=samvyo.com"><u>a future migration becomes an adapter swap</u></a>. Put a thin layer of your own in front of it, and it <a href="https://samvyo.com/blog/adding-video-to-your-product-what-integrate-a-video-sdk-actually-costs-and-commits-you-to?ref=samvyo.com"><u>turns a re-platform from a rewrite into a swap of one adapter</u></a>.</p><p>Both are right, and neither shows how. A video SDK abstraction layer that actually holds is more than a wrapper class around the vendor's client. It has four sides, and the one most teams skip is the one that makes leaving expensive.</p><h2 id="what-a-video-sdk-abstraction-layer-is-and-what-it-is-not"><strong>What a video SDK abstraction layer is, and what it is not</strong></h2><p>The pattern has a name. Alistair Cockburn described it in 2005 as <a href="https://alistair.cockburn.us/hexagonal-architecture/?ref=samvyo.com"><u>ports and adapters</u></a>, with the aim of letting an application be "developed and tested in isolation from its eventual run-time devices and databases". Your product talks to a port it defines. Each provider gets an adapter that implements that port. The provider's types never cross into the rest of your code.</p><p>What it is not: a promise that switching becomes free, or a lowest-common-denominator API that hides every useful feature. The goal is narrower. When you do switch, the change should be one adapter and its tests, not every file that touches video.</p><h2 id="the-four-sides-of-the-seam"><strong>The four sides of the seam</strong></h2><p>The layers of <a href="https://samvyo.com/blog/the-switching-cost-what-you-actually-rewrite-to-move-video-providers?ref=samvyo.com"><u>what a provider switch rewrites</u></a> tell you where the seam has to run:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="116"><col width="272"><col width="259"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Side</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What you own</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What stays inside the adapter</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1. Client</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The verbs your UI calls and the events it listens to</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The vendor SDK, its objects and event names</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2. Server</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">One token service, room lifecycle, webhook intake</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Each vendor's token format and REST calls</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3. Identity</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your room, participant and session IDs</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A mapping table to vendor IDs</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">4. Data</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Where recordings live and how they are referenced</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The vendor's recording API</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Most "wrap the SDK" advice covers only side one. Sides three and four are what turn a migration into an archive project.</p><h2 id="side-1-the-client-interface"><strong>Side 1: the client interface</strong></h2><p>Start from what your product does, not from what the SDK offers. An illustrative interface, in TypeScript:</p><p>interface VideoSession {</p><p>&nbsp;&nbsp;join(room: RoomId, token: SessionToken): Promise&lt;void&gt;;</p><p>&nbsp;&nbsp;leave(): Promise&lt;void&gt;;</p><p>&nbsp;&nbsp;publish(source: 'camera' | 'microphone' | 'screen'): Promise&lt;LocalTrack&gt;;</p><p>&nbsp;&nbsp;subscribe(who: ParticipantId, quality: QualityHint): Promise&lt;RemoteTrack&gt;;</p><p>&nbsp;&nbsp;on&lt;E extends SessionEvent&gt;(event: E, handler: Handler&lt;E&gt;): Unsubscribe;</p><p>&nbsp;&nbsp;capabilities(): Capabilities;</p><p>}</p><p>Four rules make it hold:</p><ul><li><strong>Your IDs, not theirs.</strong> RoomId and ParticipantId are your types. The adapter maps them to whatever the vendor uses.</li><li><strong>Subscription is in the interface, with a quality hint.</strong> On some providers what each user receives is <a href="https://samvyo.com/blog/the-per-participant-minute-trap-why-the-bill-multiplies-before-the-call-does?ref=samvyo.com"><u>a pricing decision</u></a>: Agora, for example, <a href="https://docs.agora.io/en/video-calling/overview/pricing-legacy?ref=samvyo.com"><u>bills on the total resolution each user subscribes to</u></a>. If subscription control lives inside the vendor's UI kit, so does your bill.</li><li><strong>Limits are declared, not discovered.</strong> capabilities() reports what this adapter can do: maximum rendered videos, maximum resolution, screen share support. Zoom's web SDK, for instance, <a href="https://developers.zoom.us/docs/video-sdk/twilio/web/?ref=samvyo.com"><u>renders up to 25 videos on desktop and 4 on mobile</u></a>. Your layout code reads the number instead of assuming it.</li><li><strong>No vendor types in UI state.</strong> If a vendor's participant object ends up in your state store, the seam has a hole in it, and every component that reads that store is now part of the migration.</li></ul><h2 id="side-1-continued-your-events-your-meanings"><strong>Side 1, continued: your events, your meanings</strong></h2><p>Events are where seams leak. Define your own vocabulary (participantJoined, participantLeft, trackAvailable, activeSpeakerChanged) and decide what each one means in your product.</p><p>Then make the adapter responsible for that meaning, not just the name. Zoom's active-speaker event fires once someone has been talking for more than a second; another provider's may use a different rule. If your product needs a specific behaviour, such as a 1.5-second hold before the speaker view switches, implement it in your layer, once, so it stays the same when the adapter changes.</p><h2 id="side-2-one-server-side-seam"><strong>Side 2: one server-side seam</strong></h2><p>Every provider needs a backend to issue credentials, and each issues a different kind. Put all of it behind one service you own:</p><ul><li><strong>One token endpoint.</strong> Your client asks your backend for a session token for a RoomId. Which vendor format comes back is the adapter's business.</li><li><strong>One room lifecycle.</strong> Create, end and look up rooms through your API, keyed on your IDs.</li><li><strong>One webhook intake.</strong> Vendor callbacks arrive at an adapter that translates them into your own events and writes them to your own store. The rest of your backend never parses a vendor payload.</li></ul><h2 id="sides-3-and-4-identity-and-recordings"><strong>Sides 3 and 4: identity and recordings</strong></h2><p>These are the sides that make leaving expensive, and the cheapest to get right on day one.</p><p><strong>Identity.</strong> Keep a mapping table from your room and participant IDs to each vendor's, with timestamps. Support tickets, analytics and audit trails reference your IDs. When the provider changes, the history still resolves.</p><p><strong>Recordings.</strong> Write them to storage you own from the first recording. Twilio can <a href="https://www.twilio.com/docs/video/tutorials/storing-aws-s3?ref=samvyo.com"><u>send recordings to your own S3 bucket</u></a> instead of its cloud; Daily can <a href="https://docs.daily.co/docs/guides/features/recording/custom-s3-storage?ref=samvyo.com"><u>write directly to your bucket</u></a> without storing them at all. Reference recordings by your own IDs and paths. Then a provider switch changes where new recordings come from, not where old ones live.</p><h2 id="proving-the-seam"><strong>Proving the seam</strong></h2><p>A seam with one adapter is a hypothesis. Two things turn it into a fact.</p><ul><li><strong>A contract test suite</strong> written against the interface, not the vendor: join, publish, subscribe at each quality hint, receive each event, leave. Every adapter must pass it.</li><li><strong>A second adapter.</strong> It does not have to be a second provider. An in-memory fake that passes the same contract tests proves that nothing outside the adapter depends on the vendor, and it is exactly the "tested in isolation" that ports and adapters were described for.</li></ul><p>If the fake cannot pass without changes elsewhere in your code, you have found the leak before a migration did.</p><h2 id="what-the-seam-costs"><strong>What the seam costs</strong></h2><p>The honest part: an abstraction layer is a component you maintain, and it has real costs.</p><ul><li><strong>It lags the vendor.</strong> A new SDK feature is not available to your product until someone exposes it through the interface.</li><li><strong>It can flatten useful differences.</strong> The fix is capabilities, not a smaller interface: expose provider-specific features as optional capabilities your UI can check for.</li><li><strong>Prebuilt UI kits sit outside it.</strong> A vendor's drop-in meeting UI is the fastest way to ship, and it puts the vendor's components straight into your interface. When Dyte became RealtimeKit, its <a href="https://docs.dyte.io/guides/realtimekit-migration/sdk-guide?ref=samvyo.com"><u>UI kits were renamed along with everything else</u></a>. If you use one, accept that the UI is part of any migration.</li></ul><p>So the seam is not always worth building. A product that embeds a vendor UI on one screen, at low volume, may be better off shipping and accepting the rewrite risk. The seam earns its cost when video is core to the product, when the integration is custom, or when your provider could be <a href="https://samvyo.com/blog/what-happens-when-your-video-api-provider-gets-acquired-or-shuts-down?ref=samvyo.com"><u>acquired, deprecated or shut down</u></a> on a timeline you do not control.</p><h2 id="where-to-draw-the-line"><strong>Where to draw the line</strong></h2>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="324"><col width="324"/></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Keep behind the seam</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Let through as a declared capability</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Join, leave, publish, subscribe</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Vendor-specific effects, filters, noise suppression</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Participant and room identity</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Maximum rendered videos and resolution</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Event names and their meaning</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Provider-only features such as built-in transcription</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Tokens, room lifecycle, webhooks</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Diagnostic data unique to one provider</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Recording storage and references</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">—</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>A video SDK abstraction layer is a port your product owns and an adapter per provider. To hold, it has to cover four sides: client verbs and events, the server that issues tokens and receives webhooks, your own identity, and recordings in your own storage. Prove it with contract tests and a second adapter, accept that it costs maintenance, and build it before the code spreads, because afterwards it is a migration of its own.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>A seam decides how expensive it is to leave. The other half of the decision is </em><a href="https://samvyo.com/blog/who-gets-paged-at-2am-the-failure-modes-of-build-buy-and-embed?ref=samvyo.com"><em>who gets paged when it fails</em></a><em> under each path, and how long recovery takes.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What is a video SDK abstraction layer?</strong></p><p>An interface your application owns for joining calls, publishing and subscribing to media, handling events and recording, with one adapter per video provider that implements it. The provider's types stay inside the adapter, so changing provider means changing one adapter rather than every file that touches video.</p><p><strong>Does an abstraction layer make switching video providers free?</strong></p><p>No. It turns the switch into writing and testing one new adapter, plus whatever provider-specific capabilities your product relies on. It also helps most when identity and recordings are already under your control, since those are the parts code changes cannot fix.</p><p><strong>What should a video SDK interface include?</strong></p><p>At minimum: join, leave, publish, subscribe with a quality hint, an event subscription using your own event names, and a capabilities call that reports limits such as maximum rendered videos. On the server side: one token endpoint, room lifecycle and webhook intake.</p><p><strong>How do I test a video abstraction layer?</strong></p><p>Write contract tests against your interface, not the vendor, and run every adapter through them. An in-memory fake adapter that passes the same tests proves that nothing outside the adapter depends on the provider.</p><p><strong>Should I use a video provider's prebuilt UI kit?</strong></p><p>It is the fastest way to ship, but it puts the vendor's components directly into your product, outside any abstraction layer. If you use one, treat the UI as part of any future migration.</p><p><strong>Does Samvyo work behind an abstraction layer?</strong></p><p>Yes, the same way as any provider. Samvyo, based on SFU architecture, ships embeddable SDKs like a cloud video API, with the media path, TURN and recording kept on infrastructure you control, which means the recording side of the seam is already in your own storage.</p>]]></content:encoded></item><item><title><![CDATA[The Switching Cost: What You Actually Rewrite to Move Video Providers]]></title><description><![CDATA[When Dyte became Cloudflare RealtimeKit, its customers did not switch providers, and every package, class and HTML tag in their code still changed. Using three vendor-written migration guides, here is what moving video providers actually rewrites, one layer at a time]]></description><link>https://www.samvyo.com/blog/the-switching-cost-what-you-actually-rewrite-to-move-video-providers</link><guid isPermaLink="false">6ac4f4258b45c3f0cd63ac22</guid><category><![CDATA[Vendor Lock-in]]></category><category><![CDATA[Migration]]></category><category><![CDATA[Migration Cost]]></category><category><![CDATA[Video Infrastructure]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 07 Oct 2026 10:31:28 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Night-Tree-Relocation.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Night-Tree-Relocation.png" alt="The Switching Cost: What You Actually Rewrite to Move Video Providers"/><p>When Dyte became Cloudflare RealtimeKit, its customers did not choose a new provider. Their provider changed its name. Every package, every class prefix and every HTML tag in their code changed anyway, and the old SDKs went into maintenance mode, which in <a href="https://docs.dyte.io/guides/realtimekit-migration/sdk-guide?ref=samvyo.com"><u>Dyte's own words</u></a> means they "will no longer receive feature updates or bug fixes".</p><p>If a rename forces a rewrite, a real switch does more. This post is the inventory of what changes, layer by layer, taken from three migration guides the vendors wrote themselves. Whether to switch at all, and why providers exit, is covered in <a href="https://samvyo.com/blog/what-happens-when-your-video-api-provider-gets-acquired-or-shuts-down?ref=samvyo.com"><u>what happens when a video API provider is acquired or shuts down</u></a>. This is about the work once you have decided.</p><h2 id="where-video-provider-migration-cost-actually-sits"><strong>Where video provider migration cost actually sits</strong></h2><p>The media itself is the easy part. Every provider moves WebRTC audio and video in broadly the same way. What you rewrite is everything your product built around one vendor's version of it:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="142"><col width="298"><col width="207"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Layer</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What is provider-specific</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Who notices if it goes wrong</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1. Object model</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What a room, a participant and a track are called and how they relate</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your engineers, at compile time</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2. Auth</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Token format and the server that mints it</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Every user, at join time</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3. Events</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Event names, and what each event actually means</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Users, in subtle UI bugs</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">4. Rendering limits</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">How many videos the SDK will draw, at what resolution</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Product and sales</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">5. Data you already hold</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Recordings, IDs and history stored in the old provider's format and place</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Compliance and support, months later</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><h2 id="layer-1-the-object-model"><strong>Layer 1: the object model</strong></h2><p>Providers agree on the idea of <a href="https://samvyo.com/blog/how-to-integrate-a-video-sdk-rooms-tokens-tracks-and-the-parts-the-quickstart-skips?ref=samvyo.com"><u>rooms, tokens and tracks</u></a> and disagree on almost everything else. Vonage calls the room a <a href="https://tokbox.com/developer/guides/basics/?ref=samvyo.com"><u>Session</u></a> and gives clients publisher or subscriber roles. LiveKit has a <a href="https://docs.livekit.io/home/get-started/api-primitives?ref=samvyo.com"><u>Room, Participants and Tracks</u></a>. Twilio has Rooms, Participants and Tracks too, but Zoom's Video SDK does not.</p><p>Zoom's own <a href="https://developers.zoom.us/docs/video-sdk/twilio/web/?ref=samvyo.com"><u>Twilio migration guide</u></a> treats the move from Twilio's track-based model to Zoom's stream-based one as a fundamental architectural change, not a rename. There is no participant object; the current user comes from a function call. Code that loops over each video track to stop a camera becomes one call to stopVideo(). A single connect() becomes init() followed by join().</p><p>None of this is hard individually. The cost is that it is everywhere your product touches video, which is usually more places than anyone listed.</p><h2 id="layer-2-tokens-and-the-server-that-mints-them"><strong>Layer 2: tokens and the server that mints them</strong></h2><p>Every provider needs your backend to issue credentials, and no two issue the same kind. Moving from Twilio to Zoom replaces Twilio's JWT with a Zoom JWT whose payload is different, and whose session-name claim has to match the session the client joins. Moving from Twilio to Amazon Kinesis Video Streams, in <a href="https://aws.amazon.com/blogs/iot/migrating-your-webrtc-application-from-twilio-to-aws-a-developers-guide?ref=samvyo.com"><u>AWS's own guide</u></a>, replaces the access token with temporary IAM credentials, Twilio's video grant with channel permissions, and the backend's room-creation endpoint with a signaling-channel endpoint.</p><p>So a provider switch is a backend change, not just a client one. Your token service, room creation, permissions model and any webhook handlers all move with it.</p><h2 id="layer-3-events-the-part-that-breaks-quietly"><strong>Layer 3: events, the part that breaks quietly</strong></h2><p>Event names change, and the mapping is rarely one to one:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="324"><col width="324"/></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Twilio Video event</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Zoom Video SDK equivalent</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">participantConnected</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">user-added</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">participantDisconnected</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">user-removed</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">trackSubscribed / trackUnsubscribed</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">peer-video-state-change</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">dominantSpeakerChanged</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">active-speaker or video-active-change</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Renaming is the easy part. The risk is meaning. Zoom's guide notes that its speaker event fires when someone has been talking for more than a second, a rule worth checking against whatever your current provider does. A speaker-view layout tuned against one trigger can feel wrong against another, with no error anywhere. This is the layer where migrations pass every test and still generate support tickets.</p><h2 id="layer-4-rendering-limits-that-change-the-product"><strong>Layer 4: rendering limits that change the product</strong></h2><p>Some differences are not code at all. The Zoom guide states that its web SDK "can render up to 25 videos at a time on desktop browsers, and 4 videos on mobile browsers", with 720p as the maximum rendering quality on web.</p><p>If your product shows a larger gallery, or relies on higher resolution, the migration is now a product decision. A provider's limits become your feature set, and sales finds out when a customer asks why the 30-person view disappeared.</p><h2 id="layer-5-the-data-you-already-hold"><strong>Layer 5: the data you already hold</strong></h2><p>Code can be rewritten in a sprint. History cannot. By default, Twilio stores recordings in its own cloud; you can <a href="https://www.twilio.com/docs/video/tutorials/storing-aws-s3?ref=samvyo.com"><u>switch new recordings to your own S3 bucket</u></a>, after which "Twilio will stop storing" them in its cloud, but recordings made before the switch stay where they were. Daily offers the same choice up front: with a custom bucket, it <a href="https://docs.daily.co/docs/guides/features/recording/custom-s3-storage?ref=samvyo.com"><u>does not store the recording on its own servers at any point</u></a>.</p><p>That one setting decides whether migration includes an archive project. Recordings, their metadata, the room and participant IDs your support and compliance teams reference: all of it has to be exported, re-linked and kept for as long as your retention policy says, in a format the new provider did not create. This is the part of <a href="https://samvyo.com/blog/adding-video-to-your-product-what-integrate-a-video-sdk-actually-costs-and-commits-you-to?ref=samvyo.com"><u>what integrating a video SDK commits you to</u></a> that arrives last and lasts longest.</p><h2 id="even-a-rename-is-a-migration"><strong>Even a rename is a migration</strong></h2><p>Back to Dyte. Its RealtimeKit migration guide lists nine package replacements, from @dytesdk/web-core to @cloudflare/realtimekit and down through the UI kits, React Native, virtual background and recording SDKs. Class names lose the Dyte prefix for RealtimeKit or RTK; every dyte- HTML tag becomes rtk-.</p><p>This is the mildest migration there is: same team, same product, same concepts. It still touches every file that imports the SDK, and the maintenance-mode notice sets the deadline for you. That is the general shape of a forced move: the scope is yours, but the timeline is someone else's.</p><h2 id="the-honest-counterweight"><strong>The honest counterweight</strong></h2><p>Not every migration is expensive, and not every one is necessary.</p><p>The work scales with how much of your product touches the SDK. A product that embeds a vendor's prebuilt meeting UI in one screen migrates in a fraction of the time of one that built custom layouts, moderation and recording workflows on raw tracks. And the reason to move can disappear: Twilio announced Programmable Video would end on 5 December 2024, <a href="https://github.com/twilio/twilio-video.js/issues/2038?ref=samvyo.com"><u>extended that to December 2026</u></a>, then on 21 October 2024 <a href="https://www.twilio.com/en-us/changelog/-twilio-video-will-remain-a-standalone-product?ref=samvyo.com"><u>reversed the decision entirely</u></a>. Teams that migrated early paid for a move that turned out to be optional.</p><p>The lesson is not "never depend on a provider". It is that the cost of leaving is decided long before you leave, by how far the provider's objects spread through your code.</p><h2 id="estimating-your-own-video-provider-migration-cost"><strong>Estimating your own video provider migration cost</strong></h2><ul><li><strong>Count the touchpoints.</strong> Search the codebase for every import of the SDK and every provider type that crosses into your own state or UI.</li><li><strong>List the server endpoints.</strong> Token minting, room creation, webhooks, recording controls, analytics.</li><li><strong>Map every event you listen to,</strong> and write down what it means today, not just its name.</li><li><strong>Check the new provider's limits</strong> against your largest layout, highest resolution and platforms.</li><li><strong>Inventory the data:</strong> recordings, where they are, how long you must keep them, and how they are referenced.</li></ul><p>The answer to each is your migration scope. If the first item returns hundreds of files, the problem is not the provider. It is that there is no seam between the provider and your product.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Moving video providers rarely rewrites the media. It rewrites the object model, the token service, the event handling and the UI limits your product was built around, and it leaves an archive of recordings in the old provider's place and format. Even a rename touches every import. The cost of leaving is set on the day you integrate, by how far the provider's objects reach into your code.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>This is the problem; the prevention is a seam. </em><a href="https://samvyo.com/blog/the-seam-abstracting-video-behind-your-own-interface-so-you-can-leave-later?ref=samvyo.com"><em>The Seam</em></a><em> shows how to put video behind your own interface on day one, so the next switch is an adapter rather than a rewrite.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What does it cost to migrate between video providers?</strong></p><p>There is no public benchmark in time or money, because it depends on how much of your product touches the SDK. The work falls into five layers: the SDK object model, the token service, event handling, rendering limits, and the recordings and IDs you already hold. Counting your touchpoints in each is the most reliable estimate.</p><p><strong>What has to be rewritten when switching video SDKs?</strong></p><p>Client code that uses the provider's room, participant and track objects; the backend that issues tokens and creates rooms; every event handler; and any UI built around the provider's rendering limits. Zoom's Twilio migration guide, for example, lists nine separate changes for the web SDK alone.</p><p><strong>What happens to my recordings if I change video providers?</strong></p><p>They stay where the old provider stored them unless you move them. If recordings were written to the provider's cloud, migration includes exporting them and keeping them for your retention period. Writing recordings to your own storage from the start avoids this.</p><p><strong>Is Twilio Video shutting down?</strong></p><p>No. Twilio announced an end date for Programmable Video, extended it to December 2026, and on 21 October 2024 reversed the decision, saying Twilio Video will remain a standalone product.</p><p><strong>How can I reduce video provider migration cost?</strong></p><p>Keep the provider's objects behind an interface your product owns, issue tokens from one service, normalise events into your own vocabulary, and store recordings in your own bucket. Platforms that keep the media path, TURN and recording on infrastructure you control, such as Samvyo, which is based on SFU architecture, also keep the archive under your ownership rather than a provider's.</p><p><strong>Does renaming an SDK count as a migration?</strong></p><p>In practice, yes. Dyte's move to Cloudflare RealtimeKit replaced nine packages and renamed classes and HTML tags, and the old SDKs stopped receiving bug fixes, which sets the deadline for you.</p>]]></content:encoded></item><item><title><![CDATA[What Your Video Bill Actually Adds Up To: Minutes, Egress, Recording, TURN and Storage]]></title><description><![CDATA[The rate card shows one number. The bill has five lines: minutes, egress, relay, recording and storage, and they behave differently depending on whether you buy per minute or run the media yourself. Here is one workload, 100 people in calls all working day, added up line by line.]]></description><link>https://www.samvyo.com/blog/what-your-video-bill-actually-adds-up-to-minutes-egress-recording-turn-and-storage</link><guid isPermaLink="false">6ac4f3218b45c3f0cd63ac03</guid><category><![CDATA[cost-benefit analysis]]></category><category><![CDATA[Video Infrastructure]]></category><category><![CDATA[recording]]></category><category><![CDATA[video api pricing]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 07 Oct 2026 10:31:22 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Night-Alley-with-Utility-Meters.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Night-Alley-with-Utility-Meters.png" alt="What Your Video Bill Actually Adds Up To: Minutes, Egress, Recording, TURN and Storage"/><p>The price page says <strong>$4,224</strong> a month. Record every room and the same workload bills <strong>$11,088</strong> before a single file is stored.</p><p>That gap is why a video infrastructure cost breakdown needs more than a rate card. Every video bill has five lines: minutes, egress, relay, recording and storage. Each one already has its own post on this blog. This one does the thing those posts do not: puts all five into one total for one workload, both bought per minute and run yourself.</p><h3 id="the-workload"><strong>The workload</strong></h3><p>One example, used for every line:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="259"><col width="388"/></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Assumption</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Value</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Average people in calls at once</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">100</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Call shape</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Four-person rooms (25 rooms at a time), everyone sees the other three</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Hours</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">8 hours a day, 22 working days a month</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Video</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">600 kbps per received stream</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Recording</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Optional: every room, as one composite file at 2 Mbps</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Prices</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">List, as published October 2026; AWS US East for cloud lines</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>That is 1,056,000 participant-minutes, 17,600 participant-hours and 4,400 room-hours a month. The same workload runs through every line below.</p><h3 id="line-1-minutes"><strong>Line 1: minutes</strong></h3><p>On per-minute pricing this is the headline: 1,056,000 participant-minutes at <a href="https://www.twilio.com/en-us/video/pricing?ref=samvyo.com"><u>$0.004</u></a> is <strong>$4,224 a month</strong>. Why the count is participants rather than meetings, and where it multiplies further, is covered in <a href="https://samvyo.com/blog/the-per-participant-minute-trap-why-the-bill-multiplies-before-the-call-does?ref=samvyo.com"><u>what each participant-minute actually counts</u></a>.</p><p>If you run the media yourself there is no minute meter. The cost moves into the lines below, and into servers. That trade is <a href="https://samvyo.com/blog/usage-based-vs-flat-licensing-showing-the-crossover-math?ref=samvyo.com"><u>where a flat licence would cross over</u></a>.</p><h3 id="line-2-egress"><strong>Line 2: egress</strong></h3><p>Every participant receives three streams. At 600 kbps each, that is 0.81 GB per participant-hour, and <strong>14,256 GB a month</strong> leaving the media servers. Outbound traffic, not inbound, is what is billed, which is why SFU bandwidth cost <a href="https://samvyo.com/blog/why-your-sfu-bandwidth-cost-scales-with-viewers-not-publishers?ref=samvyo.com"><u>grows with viewers, not publishers</u></a>.</p><p>At <a href="https://aws.amazon.com/s3/pricing/?ref=samvyo.com"><u>AWS list rates</u></a> ($0.09/GB for the first 10 TB, $0.085 for the next 40), that is <strong>about $1,260 a month</strong> when you run it. On per-minute pricing it is inside the $4,224.</p><h3 id="line-3-turn"><strong>Line 3: TURN</strong></h3><p>Some participants cannot reach the media server directly and go through a relay, and a relayed stream leaves your infrastructure twice. The only public measurement, <a href="https://webrtchacks.com/usage-stats/?ref=samvyo.com"><u>22% of conferences from callstats.io</u></a> in 2015–16, is <a href="https://samvyo.com/blog/what-is-a-turn-server-and-when-does-a-call-actually-need-one?ref=samvyo.com"><u>an upper bound, not a forecast</u></a> for traffic that goes through an SFU, so treat this line as a ceiling.</p><p>At 22%, the relay carries about 3,140 GB a month. What that costs depends entirely on who runs it:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="259"><col width="194"><col width="194"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Who runs the relay</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Rate</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Monthly cost at the 22% ceiling</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your own TURN servers on AWS</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Extra egress at $0.085/GB</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">≈ $270</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><a href="https://developers.cloudflare.com/realtime/sfu/pricing?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cloudflare Realtime TURN</span></a></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$0.05/GB</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">≈ $160</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><a href="https://www.twilio.com/en-us/stun-turn/pricing?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Twilio Network Traversal</span></a><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">, US/EU</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$0.40/GB</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">≈ $1,250</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Twilio Video's per-minute rate</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">TURN relay included</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$0</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Same traffic, a spread of nearly eight times. Why this line is missing from most self-hosting models is the subject of <a href="https://samvyo.com/blog/the-turn-bill-the-self-hosted-video-cost-nobody-forecasts?ref=samvyo.com"><u>the self-hosted cost nobody forecasts</u></a>.</p><h3 id="line-4-recording"><strong>Line 4: recording</strong></h3><p>Recording is the line that changes the shape of the bill. On Twilio's published rates, recording each participant's tracks costs the same as the call ($0.004 per participant-minute) and composing them into one file adds $0.01 per room-minute:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="272"><col width="220"><col width="155"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Recording on a per-minute platform</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Arithmetic</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Monthly</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Track recording (Twilio)</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1,056,000 × $0.004</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$4,224</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Composition into one file (Twilio)</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">264,000 room-minutes × $0.01</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$2,640</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Alternative: per recorded minute (</span><a href="https://www.daily.co/pricing/video-sdk/?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Daily</span></a><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">)</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">264,000 × $0.01349</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$3,561</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>With recording, the Twilio-priced workload goes from $4,224 to <strong>$11,088 a month</strong>, 2.6 times the headline. Run it yourself and recording becomes compute for recording workers instead of a meter, plus the storage below.</p><h3 id="line-5-storage"><strong>Line 5: storage</strong></h3><p>A composite file at 2 Mbps is 0.9 GB per room-hour, so this workload adds <strong>3,960 GB of recordings every month</strong>. Storage is the only line that grows by itself: each month's files sit on top of the last.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="207"><col width="142"><col width="103"><col width="194"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Where the files sit</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Rate</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">First month</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">After 12 months, 12-month retention</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">AWS S3 Standard</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$0.023/GB-month</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">≈ $91</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">≈ $1,093 a month</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">AWS S3 Glacier Instant Retrieval</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$0.004/GB-month</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">≈ $16</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">≈ $190 a month</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Twilio media storage</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$0.00167/GB per day</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">≈ $198</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">≈ $2,381 a month</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Two choices move this line more than any rate: the retention period, and the storage class. Both are worked through in <a href="https://samvyo.com/blog/video-recording-storage-cost-the-24-7-bill-your-retention-policy-controls?ref=samvyo.com"><u>the bill your retention policy controls</u></a>. Where the files live is a choice too: Twilio, for example, can <a href="https://www.twilio.com/docs/video/tutorials/storing-aws-s3?ref=samvyo.com"><u>write recordings to your own S3 bucket</u></a> instead of its cloud.</p><h2 id="the-lines-with-no-rate-card"><strong>The lines with no rate card</strong></h2><p>Run the media yourself and two more lines appear that no price page covers: the servers (media servers, TURN, recording workers, all with headroom for peaks) and the people who run them. We have not priced servers here, because instance sizing depends on the media server and the workload. Both lines are worked through in <a href="https://samvyo.com/blog/self-hosted-video-cost-what-running-it-yourself-actually-costs?ref=samvyo.com"><u>what running it yourself actually costs</u></a>.</p><h2 id="the-video-infrastructure-cost-breakdown-in-one-table"><strong>The video infrastructure cost breakdown, in one table</strong></h2>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="220"><col width="213"><col width="214"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Line</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Bought per minute (Twilio list)</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Run yourself (AWS list)</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Minutes</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$4,224</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">—</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Egress</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Included</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">≈ $1,260</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">TURN (22% ceiling)</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Included</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">≈ $160–$270 (managed or own)</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Recording, every room</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$6,864</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Compute for recording workers (not priced)</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Storage, month one → month twelve</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">≈ $198 → ≈ $2,381</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">≈ $91 → ≈ $1,093 (S3 Standard)</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Servers and people</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Included</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Not priced here; see the self-hosted cost post</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Total, month one, with recording</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">≈ $11,290</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">≈ $1,510–$1,620 plus servers and people</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Read it carefully, because it is easy to misread. The self-run column is not cheaper; it is <strong>incomplete</strong>, and the missing lines are the expensive ones. What the table does show is where the money goes in each model: on per-minute pricing, recording more than doubles the bill; when you run it, egress and storage are modest and the open question is the servers and the team.</p><p>And the counterweight: drop recording and the per-minute bill is $4,224 with no operations burden at all. For a lot of teams that is the right answer.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>A video bill is five lines, not one rate. For 100 people in calls all working day, minutes are $4,224 a month at list price; recording every room takes that to about $11,000, and storage then grows every month you keep the files. Run it yourself and the metered lines shrink to about $1,500 to $1,600, while servers and people become the bill. Price all five lines, in both models, before comparing anything.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>Cost is one half of the decision; control is the other. For how the three paths compare on speed, unit economics and white-label rights, see </em><a href="https://samvyo.com/blog/white-label-video-infrastructure-build-buy-or-embed-a-decision-guide?ref=samvyo.com"><em>build, buy or embed</em></a><em>.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What does a video infrastructure cost breakdown include?</strong></p><p>Five metered lines: participant-minutes, egress, relay (TURN), recording and storage. If you run the media yourself, add servers and the people who operate them. Per-minute platforms bundle egress and usually relay into the minute rate, but meter recording and storage separately.</p><p><strong>How much does recording add to a video bill?</strong></p><p>On per-minute platforms, often more than the calls. On Twilio's list prices, recording every participant costs the same as the call, and composing a single file adds $0.01 per room-minute, which takes a $4,224 workload to $11,088 a month before storage.</p><p><strong>How much does video egress cost?</strong></p><p>It depends on what each participant receives. Three 600 kbps streams per person is 0.81 GB per participant-hour; 100 people for 8 hours a day, 22 days a month is about 14,256 GB, roughly $1,260 at AWS list rates.</p><p><strong>How much does a TURN server add to video costs?</strong></p><p>A relayed stream leaves your infrastructure twice, so relay adds the relayed share of your egress again. At the 22% upper bound, that is about $160 to $270 a month in this example on managed or self-run relays, and around $1,250 at $0.40/GB.</p><p><strong>Why does video recording storage keep getting more expensive?</strong></p><p>Because storage accumulates. Each month's recordings are added to those you are still retaining, so with a 12-month policy the twelfth month stores twelve months of files. Retention period and storage class matter more than the per-GB rate.</p><p><strong>Is self-hosting video cheaper than per-minute pricing?</strong></p><p>The metered lines usually are, but they are not the whole bill. Servers and the engineers who run them are lines no price page covers, and they have to be added before the comparison is fair. Samvyo, based on SFU architecture, is offered with flat licensing and keeps the media path, TURN and recording on infrastructure you control, so the egress and storage lines above become your cloud bill rather than a per-minute meter.</p>]]></content:encoded></item><item><title><![CDATA[Usage-Based vs Flat Licensing: Showing the Crossover Math]]></title><description><![CDATA[Everyone says flat licensing gets cheaper than per-minute video pricing somewhere around 100 to 200 concurrent users. Nobody shows the arithmetic. Here it is, from published rates: per-minute, per-user, per-gigabyte and flat, at identical usage, plus what moves the line.]]></description><link>https://www.samvyo.com/blog/usage-based-vs-flat-licensing-showing-the-crossover-math</link><guid isPermaLink="false">6a95ae5a8b45c3f0cd63a4c1</guid><category><![CDATA[video api pricing]]></category><category><![CDATA[Flat Licensing]]></category><category><![CDATA[cost-benefit analysis]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 07 Oct 2026 10:31:16 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Street-with-a-Glinting-Garage-Key.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/10/Rainy-Street-with-a-Glinting-Garage-Key.png" alt="Usage-Based vs Flat Licensing: Showing the Crossover Math"/><p><strong>$42.24.</strong> That is what one seat costs a month on per-minute pricing if someone is in a call eight hours a day, 22 working days a month, at $0.004 a participant-minute. Every flat vs usage video pricing decision comes down to that number, multiplied by how many seats are busy at once, compared with a quote.</p><p>The usual advice is that flat licensing gets cheaper <a href="https://samvyo.com/blog/per-minute-video-pricing-at-scale-what-enterprise-teams-actually-pay?ref=samvyo.com"><u>somewhere around 100 to 200 concurrent users</u></a>. That can be true, but stated like that it cannot be checked. This post does the arithmetic from published prices, compares the main buying models at identical usage, and shows what moves the line.</p><h2 id="five-ways-video-infrastructure-is-sold"><strong>Five ways video infrastructure is sold</strong></h2>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="155"><col width="233"><col width="259"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Model</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What you pay for</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Published example (October 2026)</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Per participant-minute</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Each person, each minute connected</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><a href="https://www.twilio.com/en-us/video/pricing?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Twilio</span></a><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> $0.004; </span><a href="https://www.daily.co/pricing/video-sdk/?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Daily</span></a><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> $0.0015–$0.004 by volume</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Per monthly active user</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Each person who joins at least one call that month</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><a href="https://developer.8x8.com/jaas/docs/faq/?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">8x8 Jitsi as a Service</span></a><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> $0.99 per MAU</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Per gigabyte</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Data sent from the platform to viewers</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><a href="https://developers.cloudflare.com/realtime/sfu/pricing?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cloudflare Realtime</span></a><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> $0.05/GB, first 1,000 GB free</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Platform fee plus included usage</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A monthly fee covering a block of minutes, then a meter</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><a href="https://livekit.com/pricing?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">LiveKit Cloud</span></a><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> $50 for 150,000 minutes; $500 for 1.5 million</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Flat licence</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A fixed fee, whatever the usage</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Not published by anyone: quoted per customer</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>That last row matters. Because flat prices are quoted rather than published, the honest way to compare them is backwards: work out what your usage costs on each meter, and that is the number a flat quote has to beat.</p><h2 id="flat-vs-usage-video-pricing-the-one-equation"><strong>Flat vs usage video pricing: the one equation</strong></h2><p>A per-minute bill is participant-minutes × rate, and <a href="https://samvyo.com/blog/the-per-participant-minute-trap-why-the-bill-multiplies-before-the-call-does?ref=samvyo.com"><u>what the meter actually counts</u></a> matters before any comparison. For a steady workload, it is easier to think in <strong>concurrent seats</strong>: one person continuously in a call.</p><p>One seat, eight hours a day for 22 days, is 10,560 participant-minutes a month. At $0.004 that is $42.24. A flat licence at fee F breaks even at <strong>F ÷ $42.24 concurrent seats</strong>. Everything else is that equation with different inputs.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="207"><col width="220"><col width="220"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Average concurrent participants</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Per-minute bill at $0.004 (list)</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">At $0.0015 (Daily's deepest volume rate)</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">100</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$4,224 a month</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$1,584 a month</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">200</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$8,448 a month</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$3,168 a month</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">500</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$21,120 a month</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$7,920 a month</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>So "flat gets cheaper at 100 to 200 concurrent" really means: <strong>flat wins if the quote is below roughly $4,200 to $8,400 a month at list price</strong>, or below $1,600 to $3,200 once a per-minute provider's deepest discount applies. If someone quotes you a crossover in users, ask for the fee behind it and run the division yourself.</p><h2 id="crossover-one-per-minute-vs-per-user"><strong>Crossover one: per minute vs per user</strong></h2><p>Per-MAU pricing charges for a person once a month, however much they use it. At $0.99 per MAU against $0.004 per participant-minute, the crossover is:</p><p><strong>$0.99 ÷ $0.004 = 247.5 minutes per user per month, a little over four hours.</strong></p><p>This one depends on how each person uses the product, not on total volume. An employee in three one-hour meetings a week uses about 13 hours a month: $3.12 per-minute against $0.99 per user, so per-user wins by three times. A patient with one 20-minute consultation a month costs $0.08 per-minute against $0.99 per user, so per-minute wins by twelve times. Same total minutes can go either way depending on whether they come from a few heavy users or many light ones.</p><h2 id="crossover-two-per-minute-vs-per-gigabyte"><strong>Crossover two: per minute vs per gigabyte</strong></h2><p>Per-gigabyte pricing charges for data leaving the platform, not for people. That makes the crossover depend on how many streams each person receives and how heavy they are.</p><p>Assume 600 kbps per received video stream, a typical forwarded bitrate used in our <a href="https://samvyo.com/blog/the-turn-bill-the-self-hosted-video-cost-nobody-forecasts?ref=samvyo.com"><u>TURN cost model</u></a>. That is 0.0045 GB per stream-minute, or $0.000225 at $0.05/GB. Against $0.004 per participant-minute:</p><p><strong>$0.004 ÷ $0.000225 ≈ 18 received streams per participant.</strong></p><p>Below about 18 streams per person, per-gigabyte is cheaper. A four-person call (three streams each) costs about $0.0007 per participant-minute instead of $0.004, close to six times less. A webinar viewer receiving one stream is cheaper still. A 25-tile gallery view is past the line. The assumption carries the result, though: at 1.5 Mbps per stream the crossover falls to about 7 streams. On per-gigabyte pricing, resolution and layout are pricing decisions, the same lesson as resolution-tiered per-minute plans.</p><h2 id="crossover-three-a-platform-fee-with-minutes-included"><strong>Crossover three: a platform fee with minutes included</strong></h2><p>Hybrid plans sell a block of usage for a fixed fee, then meter what is above it. LiveKit's $50 plan includes 150,000 WebRTC participant-minutes, which would cost $600 at a $0.004 list rate; its $500 plan includes 1.5 million, worth $6,000 at that rate.</p><p>Against pure per-minute pricing, the $50 plan pays for itself after 12,500 minutes. Two caveats keep it honest: these plans also meter downstream bandwidth beyond an allowance ($0.12/GB after 250 GB on the $50 plan), and overage minutes are cheap ($0.0005), which makes the comparison above the included block mostly a bandwidth question.</p><h2 id="four-things-that-move-the-line"><strong>Four things that move the line</strong></h2><p>Every crossover above is a clean division. Real decisions are messier in four predictable ways.</p><ul><li><strong>Peak versus average.</strong> Per-minute bills follow average usage; flat licences and capacity are usually sized for peak. A system that peaks at 200 concurrent but averages 60 runs a per-minute bill of about $2,530 a month, not $8,450. Compare the quote with the average-driven bill, not the peak.</li><li><strong>Discounts.</strong> List rates are rarely what large customers pay. Daily's published tiers go to 63% off, which moves every per-minute crossover up by about 2.7 times.</li><li><strong>What the flat price leaves you to run.</strong> A flat licence for software you host still leaves servers, egress, relay and storage on your bill. Compare like with like, using <a href="https://samvyo.com/blog/self-hosted-video-cost-what-running-it-yourself-actually-costs?ref=samvyo.com"><u>what running it yourself actually costs</u></a>.</li><li><strong>Add-on meters.</strong> Recording, composition and transcription are usually metered separately on per-minute plans and may or may not be included in a flat licence. Put them on both sides of the comparison.</li></ul><p>And the counterweight: if usage is low, spiky or unproven, per-minute pricing is usually right, whatever the crossover says. There is no idle cost, and you are not committing to capacity you might not need.</p><h2 id="running-it-on-your-own-numbers"><strong>Running it on your own numbers</strong></h2><ul><li>Measure <strong>average</strong> concurrent participants and the hours they are active. Note the peak separately.</li><li>Convert to participant-minutes a month, and to monthly active users if per-user pricing is an option.</li><li>Price that usage on each meter at your negotiated rate, adding the add-ons you actually use.</li><li>Put the flat quote next to it, plus whatever the flat option leaves you to run.</li><li>Repeat at your expected volume a year from now. The crossover that matters is the one you are heading towards.</li></ul><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Flat vs usage video pricing has no universal crossover, only an equation: a flat fee breaks even at the fee divided by what one busy seat costs on the meter, $42.24 a month at $0.004 for eight hours a day. Per-user pricing wins above about four hours per person per month, and per-gigabyte pricing wins while each person receives fewer than about 18 streams at 600 kbps. Run the division with your own average usage, not your peak, before believing any quoted threshold.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>Minutes are only one line of the bill. </em><a href="https://samvyo.com/blog/what-your-video-bill-actually-adds-up-to-minutes-egress-recording-turn-and-storage?ref=samvyo.com"><em>What your video bill actually adds up to</em></a><em> puts minutes, egress, recording, relay and storage into one total for one worked example.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>Is flat licensing cheaper than per-minute video pricing?</strong></p><p>Only above a certain usage. At $0.004 per participant-minute, one participant in calls eight hours a day for 22 days costs $42.24 a month, so a flat licence is cheaper once your average concurrent participants exceed the licence fee divided by $42.24. Below that, per-minute is cheaper.</p><p><strong>At what point does flat vs usage video pricing cross over?</strong></p><p>Divide the flat monthly fee by the per-minute cost of one busy seat. At list price, 100 average concurrent participants cost $4,224 a month and 200 cost $8,448, so a flat quote below those figures wins at that usage. Volume discounts raise the crossover.</p><p><strong>What is per-MAU pricing for video?</strong></p><p>Per monthly active user pricing charges once for each person who joins at least one call in a month, regardless of how long they use it. At $0.99 per MAU against $0.004 per minute, it is cheaper for anyone using more than 247.5 minutes a month.</p><p><strong>Is per-GB video pricing cheaper than per-minute?</strong></p><p>For small calls and broadcasts, usually yes. At $0.05/GB and 600 kbps per stream, per-gigabyte pricing is cheaper until each participant receives about 18 streams. Higher bitrates bring that point down, so large high-resolution galleries can be cheaper per minute.</p><p><strong>Should I compare a flat licence against peak or average usage?</strong></p><p>Against average. Per-minute bills follow average usage, while a flat licence is a fixed cost whatever the usage. Comparing a flat quote with a peak-based per-minute estimate overstates the savings.</p><p><strong>What does flat licensing for video usually include?</strong></p><p>It varies, so ask. A flat licence for software you deploy may cover the media platform but not the servers, egress, relay or storage it runs on. Samvyo, based on SFU architecture, is offered with flat licensing and keeps the media path, TURN and recording on infrastructure you control, so those running costs sit on your own cloud bill and should be added to the comparison.</p>]]></content:encoded></item><item><title><![CDATA[The Per-Participant-Minute Trap: Why the Bill Multiplies Before the Call Does]]></title><description><![CDATA[A four-person, thirty-minute call costs $0.20 on one published price list and $1.92 on another. Same people, same half hour. The difference is not the rate; it is what each provider counts. Here are the three multipliers inside per participant minute pricing, worked through.]]></description><link>https://www.samvyo.com/blog/the-per-participant-minute-trap-why-the-bill-multiplies-before-the-call-does</link><guid isPermaLink="false">6ac4c7928b45c3f0cd63abce</guid><category><![CDATA[video api pricing]]></category><category><![CDATA[cost-benefit analysis]]></category><category><![CDATA[CPAAS]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 07 Oct 2026 10:31:09 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/10/Midnight-Boardroom-Coin-Shares.png" medium="image"/><content:encoded><![CDATA[<blockquote>A four-person, thirty-minute video call costs <strong>$0.20</strong> on one published price list and <strong>$1.92</strong> on another. Same four people, same half hour, list prices as published in October 2026.</blockquote><img src="https://www.samvyo.com/blog-admin1/content/images/2026/10/Midnight-Boardroom-Coin-Shares.png" alt="The Per-Participant-Minute Trap: Why the Bill Multiplies Before the Call Does"/><p>The gap is not the rate. It is what each provider counts. Per participant minute pricing looks like one small number, usually around $0.004, but the bill is that number multiplied by a count, and the count grows faster than the meeting does. This post takes the meter apart. For what it adds up to over a month at enterprise scale, see <a href="https://samvyo.com/blog/per-minute-video-pricing-at-scale-what-enterprise-teams-actually-pay?ref=samvyo.com"><u>what enterprise teams actually pay per minute at scale</u></a>. </p><h2 id="what-per-participant-minute-pricing-actually-counts"><strong>What per participant minute pricing actually counts</strong></h2><p>The unit is simple once it is written down. Twilio defines a participant-minute as "the time that a participant remains connected to a Video Room, measured in minutes". Daily puts it as the number of participants multiplied by the meeting length.</p><p>So the first multiplier is the number of people. A thirty-minute meeting with four people is 120 billable minutes. <strong>The meeting lasts half an hour; the bill counts two hours.</strong> Add a fifth person and the same meeting is 150.</p><p>Most published rates sit in a narrow band once you line them up:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="207"><col width="168"><col width="272"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Provider</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Video rate per participant-minute</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Worth knowing</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><a href="https://www.twilio.com/en-us/video/pricing?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Twilio Video</span></a></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$0.004</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">TURN relay included</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><a href="https://www.daily.co/pricing/video-sdk/?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Daily</span></a></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$0.0015–$0.004</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Graduated; up to 63% off at 50M+ minutes a month</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><a href="https://www.vonage.com/communications-apis/video/pricing/?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Vonage Video API</span></a></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$0.0041</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A participant is "a connection through the API"</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><a href="https://learn.microsoft.com/en-in/azure/communication-services/concepts/pricing?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Azure Communication Services</span></a></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$0.004</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Audio and video billed at the same rate</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><a href="https://aws.amazon.com/chime/chime-sdk/pricing/?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Amazon Chime SDK</span></a></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$0.0017</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Billed in 6-second increments, whatever media is used</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><a href="https://developers.cloudflare.com/realtime/realtimekit/pricing?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cloudflare RealtimeKit</span></a></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$0.002</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Audio-only participants $0.0005</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>If the count stopped at people, budgeting would be easy. It does not.</p><h2 id="multiplier-two-what-each-person-receives"><strong>Multiplier two: what each person receives</strong></h2><p>Some providers do not bill the person at all. They bill what the person subscribes to.</p><p>Agora says plainly that it calculates usage "based solely on a user's subscriptions in the channels they join. Whether they publish streams does not matter." The rate then depends on the <strong>aggregate resolution</strong> of everything that user is watching at once, the total pixels across every video tile on their screen. Under <a href="https://docs.agora.io/en/video-calling/overview/pricing-legacy?ref=samvyo.com"><u>Agora's published rules</u></a>, up to 921,600 pixels (one 720p stream) is billed as HD; up to 3,686,400 is billed as 2K.</p><p>Now take the four-person call in a gallery view. Each person watches the other three. If those three tiles are sent at 720p, each viewer is receiving 2,764,800 pixels, which is the 2K tier at <a href="https://www.agora.io/en/pricing/video-calling/?ref=samvyo.com"><u>$15.99 per 1,000 minutes</u></a>. Send the same tiles at 360p and the total is 691,200 pixels, billed as HD at $3.99. <strong>Same call, same people, four times the rate, decided by a layout setting.</strong></p><p>ZEGOCLOUD shows the other version of the same idea. Its <a href="https://docs.zegocloud.com/article/15144?ref=samvyo.com"><u>former billing method</u></a> counted every stream each user subscribed to: "total service minutes = N × (N-1) × M". Five people talking for ten minutes was 200 service minutes under that rule, against 50 under the per-user method it uses now.</p><p>Streams are the number to watch, because they grow much faster than people:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="220"><col width="213"><col width="214"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">People in the call</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Participant-minutes per minute</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Subscribed streams per minute</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">4</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">4</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">12</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">8</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">8</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">56</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">16</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">16</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">240</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Even where your provider bills per person, this quadratic is still in the system. It is the reason media server bandwidth <a href="https://samvyo.com/blog/why-your-sfu-bandwidth-cost-scales-with-viewers-not-publishers?ref=samvyo.com"><u>scales with viewers, not publishers</u></a>, and someone pays for it somewhere.</p><p>The practical consequence for a buyer: on subscription-based pricing, decisions that look like product design, such as the default gallery size, the tile resolution or whether screen share is on, are pricing decisions.</p><h2 id="multiplier-three-every-add-on-runs-its-own-meter"><strong>Multiplier three: every add-on runs its own meter</strong></h2><p>The base rate covers people being connected. Almost everything else is metered separately, and the meters do not share a unit.</p><ul><li><strong>Per participant.</strong> Twilio charges <a href="https://www.twilio.com/en-us/video/pricing?ref=samvyo.com"><u>$0.004 per participant-minute</u></a> to record individual tracks, the same rate as the call itself. Daily bills real-time transcription at $0.0059 per unmuted participant-minute.</li><li><strong>Per room.</strong> Twilio charges $0.01 per composed minute to turn those tracks into one video file. Daily charges $0.01349 per recorded minute; Vonage $0.0363 per minute for an HD composed archive.</li><li><strong>Per gigabyte or per day.</strong> Storage, egress and relay traffic sit outside the minute meter entirely.</li></ul><p>On the same four-person, thirty-minute call on Twilio's list prices: the call is $0.48, recording every participant adds $0.48, and composing one file adds $0.30. <strong>Recording alone takes the bill from $0.48 to $1.26, more than 2.6 times the headline.</strong> Storage, egress and relay come on top; they are priced line by line in <a href="https://samvyo.com/blog/what-your-video-bill-actually-adds-up-to-minutes-egress-recording-turn-and-storage?ref=samvyo.com"><u>what your video bill actually adds up to</u></a>.</p><h2 id="one-call-seven-price-lists"><strong>One call, seven price lists</strong></h2><p>Put the three multipliers together and the same thirty minutes looks like this at list price, before free tiers or volume discounts:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="285"><col width="207"><col width="155"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Provider and setting</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Arithmetic</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cost of the call</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Amazon Chime SDK</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">120 × $0.0017</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$0.20</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cloudflare RealtimeKit</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">120 × $0.002</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$0.24</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Twilio, Daily (list), Azure</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">120 × $0.004</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$0.48</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Vonage</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">120 × $0.0041</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$0.49</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Agora, three 360p tiles each</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">120 × $3.99 ÷ 1,000</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$0.48</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Agora, three 720p tiles each</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">120 × $15.99 ÷ 1,000</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$1.92</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Twilio with track recording and composition</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$0.48 + $0.48 + $0.30</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$1.26</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>None of these numbers is large. That is the trap. Per participant minute pricing is designed to look like a rounding error per call, and it is one. The bill is what happens when every multiplier above is applied to every call, every day.</p><h2 id="when-per-participant-minute-pricing-is-the-right-deal"><strong>When per participant minute pricing is the right deal</strong></h2><p>This is not an argument against the model. For a lot of products it is the best one available.</p><p>There is no idle cost: a month with no calls costs nothing, and most providers include free minutes (Daily and Agora each list 10,000 a month). Volume discounts are real; Daily's graduated pricing reaches 63% off list. And relay, scaling and operations are bundled into the rate rather than becoming your team's job. For low, irregular or early-stage volume, that is hard to beat.</p><p>The trap is narrower than the model. It is budgeting with meeting-minutes × rate, when the real formula is:</p><p><strong>participants × minutes × rate for the billing unit, plus every add-on on its own meter.</strong></p><h2 id="what-to-check-on-a-per-participant-minute-price-page"><strong>What to check on a per participant minute price page</strong></h2><p>Six questions turn a headline rate into a forecast:</p><ul><li><strong>What is the billable unit?</strong> A connected participant, a subscribed stream, or the aggregate resolution a user receives?</li><li><strong>Is audio-only cheaper?</strong> Some providers charge less for it (RealtimeKit, Daily); some charge the same (Azure, Chime).</li><li><strong>What is the rounding increment?</strong> Chime bills in six-second increments; check whether others round up to the minute.</li><li><strong>Which add-ons are per participant and which per room?</strong> Recording, composition and transcription rarely share a unit.</li><li><strong>Is relay traffic included?</strong> Twilio lists TURN relay as included; on per-gigabyte models, <a href="https://samvyo.com/blog/what-is-a-turn-server-and-when-does-a-call-actually-need-one?ref=samvyo.com"><u>relay traffic</u></a> is a cost of its own.</li><li><strong>Where do discounts start?</strong> List price is rarely the price at volume, so ask for the tier table, not the headline.</li></ul><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Per participant minute pricing bills people, and sometimes the streams between them, not meetings. Every extra person multiplies the minutes, subscription-based models multiply them again by what each person watches, and recording and transcription each run their own meter. Model the count before the rate, and the bill stops being a surprise.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>Once you can count the minutes, the next question is when paying for them stops making sense. </em><a href="https://samvyo.com/blog/usage-based-vs-flat-licensing-showing-the-crossover-math?ref=samvyo.com" rel="noreferrer"><em>The crossover math</em></a><em> compares per-minute, per-user, per-gigabyte and flat pricing at the same usage.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>How does per participant minute pricing work?</strong></p><p>You are billed for each participant for each minute they are connected. A 30-minute call with four people is 120 participant-minutes; at $0.004 that is $0.48. Some providers instead bill what each participant subscribes to, which can raise the count further.</p><p><strong>Why is my video API bill higher than I expected?</strong></p><p>Usually because the forecast multiplied meeting length by the rate. The real count is participants × minutes, sometimes multiplied again by subscribed streams or resolution tiers, plus recording, composition and transcription on separate meters.</p><p><strong>Is audio billed the same as video?</strong></p><p>It depends on the provider. Azure Communication Services bills audio and video at the same rate, and Amazon Chime SDK bills per attendee regardless of media. Others publish lower audio-only rates, such as Cloudflare RealtimeKit at $0.0005 against $0.002 for video.</p><p><strong>Does video resolution change the per-minute price?</strong></p><p>On some pricing models, yes. Agora bills each user on the total resolution of all the streams they receive, so three 720p tiles fall in its 2K tier at $15.99 per 1,000 minutes, while three 360p tiles are billed as HD at $3.99.</p><p><strong>Are recordings billed per participant?</strong></p><p>Sometimes. Twilio bills individual track recording per participant-minute, then charges again per minute to compose a single file. Others bill per recorded minute of the room. Check which unit applies before estimating.</p><p><strong>Is per-minute pricing or flat licensing cheaper?</strong></p><p>Per-minute is cheaper at low or irregular volume because there is no idle cost. Flat licensing becomes cheaper once steady usage pushes the per-minute bill above the licence fee. Samvyo, based on SFU architecture, is offered with flat licensing rather than per-minute billing, so it is worth comparing against your measured participant-minutes rather than meeting-minutes.</p>]]></content:encoded></item><item><title><![CDATA[What Is a TURN Server, and When Does a Call Actually Need One?]]></title><description><![CDATA[A TURN server is the relay a call falls back to when no direct path works. Most explanations stop at "users behind NAT", which was written for peer-to-peer calls. Here is what TURN actually is, where ICE ranks it, and what changes when your media already goes through an SFU.]]></description><link>https://www.samvyo.com/blog/what-is-a-turn-server-and-when-does-a-call-actually-need-one</link><guid isPermaLink="false">6ac4c0578b45c3f0cd63abac</guid><category><![CDATA[NAT traversal]]></category><category><![CDATA[TURN Cost]]></category><category><![CDATA[SFU guide]]></category><category><![CDATA[Video Infrastructure]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 07 Oct 2026 10:31:02 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/10/Ferry-Beneath-the-Broken-Bridge.png" medium="image"/><content:encoded><![CDATA[<blockquote>Most video calls never touch a TURN server. The ones that need one cannot happen without it.</blockquote><img src="https://www.samvyo.com/blog-admin1/content/images/2026/10/Ferry-Beneath-the-Broken-Bridge.png" alt="What Is a TURN Server, and When Does a Call Actually Need One?"/><p><strong>What is a TURN server?</strong> It is a relay on the public internet that carries a call's media when the two ends cannot reach each other directly. The client asks it for a relayed address, every packet of the call flows through it, and it forwards them on. The protocol is defined in <a href="https://www.rfc-editor.org/rfc/rfc8656.html?ref=samvyo.com"><u>RFC 8656</u></a>, and it is built to be the last resort: WebRTC tries every direct path first and falls back to TURN only when none of them works.</p><p>The usual follow-up, "you need TURN for users behind NAT", was written for calls that go peer to peer. Most video products now send media through a server instead, and that changes when a call actually needs a relay.</p><h2 id="what-is-a-turn-server-exactly"><strong>What is a TURN server, exactly?</strong></h2><p>A TURN server does one job: it gives a client an address on the public internet that it can use as its own, and forwards whatever arrives there.</p><p>The client starts with an Allocate request. The server answers with a <strong>relayed transport address</strong>, an IP and port on the server that now belongs to that client. The client then grants permission for specific peers to send to it, and the server forwards traffic both ways. Permissions expire after five minutes unless refreshed, and the allocation itself after ten. For a steady media stream, the client can bind a channel, which shrinks the per-packet header to four bytes.</p><p>TURN can run over UDP, TCP, TLS or DTLS. The defaults are port 3478, and 5349 for the encrypted versions, though production deployments usually also listen on 443 because almost nothing blocks it.</p><p>That is the whole protocol. What makes it expensive, and easy to confuse with its sibling, is what it carries.</p><h2 id="what-is-a-turn-server-versus-a-stun-server"><strong>What is a TURN server versus a STUN server?</strong></h2><p>The two get named together because ICE uses both, but they do opposite amounts of work:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="194"><col width="226"><col width="227"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><br/></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">STUN</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">TURN</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What it does</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Tells a client its public address</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Relays the media itself</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Media through the server?</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Every byte, both directions</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cost to run</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Almost nothing</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Bandwidth on every relayed stream</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">When ICE uses it</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Almost always, to discover addresses</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Only when nothing direct works</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Because TURN carries everything, it is the one part of connectivity that shows up on a bill, and <a href="https://samvyo.com/blog/the-turn-bill-the-self-hosted-video-cost-nobody-forecasts?ref=samvyo.com"><u>what that relay costs once it carries real traffic</u></a> is a line most self-hosting models leave out.</p><p>Which raises the real question: how does a call decide it needs one?</p><h2 id="where-turn-sits-in-ice"><strong>Where TURN sits in ICE</strong></h2><p>WebRTC does not choose a path up front. ICE gathers every address a client could be reached on, called candidates, and tests pairs of them until one works.</p><p>There are three kinds of candidate that matter here. A <strong>host</strong> candidate is the device's own address. A <strong>server-reflexive</strong> candidate is the public address STUN discovered. A <strong>relay</strong> candidate is the address a TURN server allocated. <a href="https://www.rfc-editor.org/rfc/rfc8445.html?ref=samvyo.com"><u>RFC 8445</u></a> recommends ranking them by type: 126 for host, 100 for server-reflexive, and <strong>0 for relay</strong>.</p><p>Zero is deliberate. A relay pair only wins when every higher-ranked pair has failed its connectivity checks. So "this call needed TURN" has a precise meaning: no direct path survived testing. The question is what makes direct paths fail, and the answer depends on what is at the other end.</p><h2 id="when-a-peer-to-peer-call-needs-turn"><strong>When a peer-to-peer call needs TURN</strong></h2><p>When two clients connect directly, two different things can kill the direct path.</p><p>The first is NAT behaviour. If both sides sit behind NAT that assigns a new external port for every destination, which carrier-grade NAT on mobile networks commonly does, neither side can learn the other's address and the call must relay. The mechanics are in <a href="https://samvyo.com/blog/nat-traversal-in-webrtc-why-the-call-connects-on-wi-fi-but-not-on-4g?ref=samvyo.com"><u>why a call connects on Wi-Fi but not on 4G</u></a>.</p><p>The second is network policy: corporate firewalls that block outbound UDP, close ports, or force everything through a proxy.</p><p>The only substantial public measurement of how often this happens comes from <a href="https://webrtchacks.com/usage-stats/?ref=samvyo.com"><u>callstats.io, reported on webrtcHacks</u></a>: across billions of minutes from January 2015 to February 2016, <strong>22% of conferences needed some kind of TURN relay</strong>, and 9% needed TCP. That is a decade old, and it was measured when far more calls ran peer to peer. Keep that second fact in mind, because it is about to matter.</p><h2 id="when-does-an-sfu-call-need-a-turn-server"><strong>When does an SFU call need a TURN server?</strong></h2><p>Most products no longer connect clients to each other. Each client sends media to <a href="https://samvyo.com/blog/what-is-an-sfu-and-why-does-every-video-platform-use-one?ref=samvyo.com"><u>a selective forwarding unit</u></a> on a server, and the server forwards it on. That moves one end of every connection somewhere very different from a home router.</p><p><strong>The NAT problem mostly disappears.</strong> An SFU sits on a public address with nothing to discover. RFC 8445 even defines a reduced mode for exactly this kind of endpoint, ICE lite, in which lite agents "only use host candidates". When one side of a connection is a fixed public address, the client sends first, the server replies to wherever that packet came from, and the path is established. A client behind the worst carrier-grade NAT can still reach it, because the server is always the predictable side. The pairing that forces relay in a peer-to-peer call, two unpredictable NATs facing each other, never happens.</p><p><strong>Network policy does not disappear.</strong> If a firewall blocks outbound UDP, the client cannot reach the SFU's UDP port any more than a peer's. Many SFUs answer this without a relay by accepting ICE over TCP directly; LiveKit's documentation, for example, describes a TCP port "<a href="https://docs.livekit.io/transport/self-hosting/ports-firewall/?ref=samvyo.com"><u>used when the client could not connect via UDP (e.g. VPN, corporate firewalls)</u></a>". The media still goes straight to the server.</p><p>What is left is the strictest tier: networks that only allow TLS on 443, force traffic through an HTTP proxy, or permit outbound connections only to approved hostnames. That is where TURN over TLS on 443 earns its place, and <a href="https://samvyo.com/blog/why-webrtc-breaks-behind-corporate-firewalls-and-the-turn-tcp-fallback-that-fixes-it?ref=samvyo.com"><u>the fallback ladder that gets through corporate firewalls</u></a> walks each rung.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="207"><col width="181"><col width="259"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Network the client is on</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Peer-to-peer call</span></p></th><th style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Call through an SFU on a public address</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Home or office NAT</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Direct, after hole punching</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Direct to the SFU</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Carrier-grade NAT on both sides</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">TURN required</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Direct to the SFU</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Outbound UDP blocked, TCP allowed</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">TURN over TCP or TLS</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">ICE over TCP to the SFU, where supported; otherwise TURN</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Only TLS on 443, proxy or hostname allowlist</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">TURN over TLS on 443</span></p></td><td style="border-left:solid #808080 0.5pt;border-right:solid #808080 0.5pt;border-bottom:solid #808080 0.5pt;border-top:solid #808080 0.5pt;vertical-align:top;padding:3pt 4.5pt 3pt 4.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">TURN over TLS on 443</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Read down the right-hand column and the pattern is clear. With an SFU, the reason for TURN shifts from NAT to policy, and policy problems concentrate on enterprise networks.</p><h2 id="what-that-does-to-the-relay-share"><strong>What that does to the relay share</strong></h2><p>This is reasoning from how the protocols behave, not a measurement, and it should be read that way. But it has a practical consequence: the 22% figure is a <strong>ceiling</strong> for an SFU-based product, not an estimate. Some of that 22% was NAT pairs that an SFU removes entirely.</p><p>Nobody has published an SFU-era equivalent, so the honest number is your own. Every session already records which candidate pair it selected and whether that pair is a relay, and <a href="https://samvyo.com/blog/collecting-webrtc-getstats-evidence-in-production?ref=samvyo.com"><u>collecting getStats evidence in production</u></a> covers how to capture it across real users rather than guessing.</p><p>Two other things shift the share in practice. Enterprise-heavy products see more relaying than consumer ones, because that is where the restrictive policies sit. And a product that does not support ICE over TCP pushes every UDP-blocked user onto TURN, which raises the share without any change in the networks.</p><h2 id="so-do-you-still-need-to-run-turn"><strong>So do you still need to run TURN?</strong></h2><p>Almost certainly yes, just not for the reason most guides give. If any of your users join from corporate networks, some of them will be on a network where TLS on 443 is the only way out, and without a relay their calls do not start at all.</p><p>What changes is the sizing and the order of fallbacks. With an SFU, put direct UDP first, ICE over TCP second, and TURN over TLS on 443 last. Expect the relay to carry a minority of sessions concentrated in enterprise accounts, size it from your measured share rather than an inherited percentage, and remember that a relayed viewer still costs a second copy of every stream they receive.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>A TURN server is a relay that carries a call's media when no direct path works, and ICE ranks it last on purpose. For peer-to-peer calls, NAT and firewalls both force it. For calls through an SFU on a public address, NAT mostly stops being a reason and network policy becomes the main one, which makes the old one-in-five figure a ceiling rather than a forecast. Keep TURN, size it from your own data, and give ICE over TCP a chance to go first.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>TURN is one line on a larger bill. For how relay traffic adds up alongside minutes, egress, recording and storage, see </em><a href="https://samvyo.com/blog/what-your-video-bill-actually-adds-up-to-minutes-egress-recording-turn-and-storage?ref=samvyo.com" rel="noreferrer"><em>what your video bill actually adds up to</em></a><em>.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What is a TURN server used for?</strong></p><p>A TURN server relays the audio and video of a WebRTC call when the two ends cannot connect directly. The client gets a relayed address on the server, and every packet passes through it. WebRTC uses it only after every direct path has failed.</p><p><strong>What is the difference between STUN and TURN?</strong></p><p>STUN tells a client what its public address looks like from outside, so a direct connection can be attempted; no media passes through it. TURN carries the media itself when a direct connection is impossible. STUN costs almost nothing to run; TURN costs bandwidth on every relayed stream.</p><p><strong>Do I need a TURN server if I use an SFU?</strong></p><p>Usually yes, but for fewer users. An SFU on a public address removes most NAT-related failures, because the client can always reach it directly. Users on networks that block UDP or allow only TLS on 443 still need a relay. Samvyo, based on SFU architecture, keeps TURN on infrastructure you control alongside the media path, so you choose where relays sit and can see how often they are used.</p><p><strong>What percentage of WebRTC calls use TURN?</strong></p><p>The only substantial public dataset, from callstats.io between January 2015 and February 2016, found 22% of conferences needed a relay. It was measured when many more calls ran peer to peer, so for an SFU-based product treat it as an upper bound and measure your own share.</p><p><strong>What port does a TURN server use?</strong></p><p>The defaults are 3478 for UDP and TCP, and 5349 for TURN over TLS or DTLS. Production deployments usually also offer TURN over TLS on 443, because it gets through firewalls that block everything else.</p><p><strong>How can I tell if a call is using a TURN server?</strong></p><p>Check the selected candidate pair in the call's WebRTC statistics: if its local or remote candidate type is "relay", the media is going through TURN. Collecting this across all sessions gives you your real relay share, which is the number to size TURN capacity on. Platforms that run TURN on your own infrastructure, such as Samvyo, also let you see relay traffic directly at the server.</p>]]></content:encoded></item><item><title><![CDATA[Fleet Video Retention: How Long to Keep Footage, and Who Actually Decides]]></title><description><![CDATA[Insurer guidance gives no retention period, so the recorder's card often decides by default. Keeping a 200-vehicle fleet's full recording for 13 months costs about 600 times more than keeping its event clips. Here is who really sets fleet video retention, and how to write the policy.]]></description><link>https://www.samvyo.com/blog/fleet-video-retention-how-long-to-keep-footage-and-who-actually-decides</link><guid isPermaLink="false">6abb68978b45c3f0cd63ab7c</guid><category><![CDATA[video telematics]]></category><category><![CDATA[fleet video]]></category><category><![CDATA[video recording infrastructure]]></category><category><![CDATA[storage]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 30 Sep 2026 13:31:23 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-29--2026--01_05_45-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-29--2026--01_05_45-PM.png" alt="Fleet Video Retention: How Long to Keep Footage, and Who Actually Decides"/><p>A <a href="https://www.normanok.gov/sites/default/files/documents/2021-07/RFP%202122-16%20Public%20Transportation%20On-board%20Vehicle%20Surveillance%20System%20-%207-12-21.pdf?ref=samvyo.com"><u>municipal bus-surveillance tender</u></a> asked for two retention numbers: at least 240 hours of video on every vehicle, and at least 13 months in the central archive.</p><p>Those numbers came from the buyer, writing a procurement document. That is how fleet video retention is often set: <strong>not by a regulator handing down a figure, but by someone deciding — or, far more often, by nobody deciding, and the recorder's storage settling it by default.</strong></p><p>This post is about making that decision on purpose. It makes no claim about what any law requires; <a href="https://samvyo.com/blog/video-recording-compliance-across-the-eu-us-and-india-what-each-regime-demands?ref=samvyo.com"><u>what each regulatory regime demands of video recording</u></a> is covered separately. The question here is practical: who and what should set the number, and how to write it down.</p><h2 id="the-default-the-recorder-decides"><strong>The default: the recorder decides</strong></h2><p>Every vehicle recorder overwrites its oldest footage when it fills up. That means every fleet already has a retention policy, whether or not anyone wrote it: the recorder's buffer horizon.</p><p>For one current two-camera dashcam, that horizon is about <a href="https://manual.blackvue.com/docs/dr970x-2ch-lte/recording-time/recording-time-dr970x-2ch-lte/?ref=samvyo.com"><u>36 hours on a 256 GB card</u></a> at Normal quality. A heavier mobile NVR with a 2 TB drive holds roughly 13 days at a similar load. <a href="https://samvyo.com/blog/store-and-forward-for-fleet-video-keeping-the-footage-the-network-drops?ref=samvyo.com"><u>How the buffer is sized, and what it still loses</u></a>, is its own subject — but the point for retention is blunt. If nobody sets a policy, the fleet's retention period is "until the card fills", which can be as little as a day or two.</p><h2 id="who-actually-sets-the-number"><strong>Who actually sets the number</strong></h2><p>Four forces decide fleet video retention in practice. Only one of them is usually written down.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="153"><col width="233"><col width="237"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Force</span></p></th><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What it pushes toward</span></p></th><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Where it comes from</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The buyer or contract</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A specific minimum, on the vehicle and centrally</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Tenders, customer contracts, internal policy — e.g. the 240 hours / 13 months above</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The claims and complaints window</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Longer — footage must outlive the gap between an incident and someone asking for it</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Insurers and customers use the footage; none of the insurer guidance we found states a period</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Storage cost</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Shorter, and more selective</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Grows with days kept × volume kept</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Privacy law</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Shorter — keep only as long as the purpose needs</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">India's DPDP Act, for one, treats footage of identifiable people as personal data</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The second row is the most useful finding in this post, and it is an absence. Insurers clearly value fleet footage — <a href="https://www.aviva.co.uk/risksolutions/protecting-your-motor-fleet/selection-and-utilisation-of-technology/?ref=samvyo.com"><u>Aviva's fleet risk guidance</u></a> notes it "can also be used to identify who may be at fault in a collision" — but we could find no insurer guidance that tells a fleet how long to keep it. The insurer asks for the clip when there is a claim. Whether the clip still exists is the fleet's problem.</p><p>So the claims window has to be estimated by the fleet itself, from its own history: how long, in practice, between an incident and the first request for footage? That number, not a guess, is the floor for anything that might become evidence.</p><h2 id="why-keep-everything-is-the-expensive-answer"><strong>Why "keep everything" is the expensive answer</strong></h2><p>The instinctive response to that uncertainty is to keep everything, for as long as possible. The arithmetic says otherwise.</p><p>A two-camera recorder at 14 Mbps writes about 63 GB in a ten-hour shift; across 200 vehicles that is 12.6 TB a day. Compare two policies for the central archive, each kept for 13 months:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="247"><col width="187"><col width="191"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Policy (200 vehicles, 13 months)</span></p></th><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Data held at steady state</span></p></th><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">At S3 Standard list price</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Full continuous recording</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">≈ 4,977 TB</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">≈ $114,000 per month</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Event clips only (20 × 90 s per vehicle per month)</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">≈ 8.3 TB</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">≈ $190 per month</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Priced at <a href="https://aws.amazon.com/s3/pricing/?ref=samvyo.com"><u>S3 Standard's $0.023 per GB-month</u></a> for scale only; archive tiers are far cheaper, and <a href="https://samvyo.com/blog/video-recording-storage-cost-the-24-7-bill-your-retention-policy-controls?ref=samvyo.com"><u>the 24/7 bill your retention policy controls</u></a> works through tiering properly. The event count is an illustrative assumption. The ratio — roughly 600 to one — is the point, and it holds at any storage price.</p><p>Most of a fleet's recording never needs to reach the archive at all. Which footage leaves the vehicle, and by which route, is <a href="https://samvyo.com/blog/mdvr-cloud-upload-getting-in-vehicle-recorder-footage-off-the-truck?ref=samvyo.com"><u>the offload decision</u></a>; retention is what happens to it once it arrives.</p><h2 id="privacy-pushes-the-other-way"><strong>Privacy pushes the other way</strong></h2><p>Cost pushes toward keeping less. So does data-protection law, for a different reason: footage of drivers, passengers and bystanders is information about identifiable people.</p><p>India's Digital Personal Data Protection Act states the principle directly. Under <a href="https://indiankanoon.org/doc/157637354/?ref=samvyo.com"><u>section 8(7)</u></a>, a data fiduciary shall, "unless retention is necessary for compliance with any law for the time being in force", erase personal data "as soon as it is reasonable to assume that the specified purpose is no longer being served".</p><p>We quote it as a direction of travel, not as advice. Its practical effect on a retention policy is to make "we might need it someday" a weak reason on its own. Each tier of footage should be kept for a stated purpose, for as long as that purpose lasts — which is also, conveniently, what keeps the storage bill down.</p><h2 id="a-tiered-retention-policy"><strong>A tiered retention policy</strong></h2><p>Put the four forces together and a defensible policy has three tiers and one override.</p><ul><li><strong>Tier 1 — on the vehicle.</strong> Continuous recording, kept for the recorder's horizon. Size that horizon to outlast your longest realistic gap before footage can be requested or offloaded.</li><li><strong>Tier 2 — event footage, centrally.</strong> Clips around triggers and anything requested. Kept for the longer of your contractual minimum and your measured claims window.</li><li><strong>Tier 3 — bulk footage, centrally, if at all.</strong> Short, or zero. Keep only what a contract or a stated purpose requires.</li><li><strong>The override — preservation.</strong> Once an incident is flagged, its footage leaves the deletion schedule until the matter closes. That footage also needs <a href="https://samvyo.com/blog/evidentiary-video-recording-timestamps-retention-and-export-that-hold-up-later?ref=samvyo.com"><u>timestamps, retention and export that hold up later</u></a>.</li></ul><p>Write each tier down with its number, its purpose and its owner. A retention policy is only real when someone could be asked why a clip was deleted, and answer.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Fleet video retention is set by contracts, claims windows, storage cost and privacy law — and when nobody sets it, by the recorder's card. Insurers value footage, but the insurer guidance we found gives no retention period, so the claims window must come from the fleet's own history.</p><p>Keep continuous footage on the vehicle, event footage centrally for as long as its purpose lasts, bulk footage briefly or not at all, and preserve anything flagged. The difference between that and "keep everything" is roughly 600 to one.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>Retained footage is only as useful as its custody: <a href="https://samvyo.com/blog/video-chain-of-custody-why-a-record-button-isnt-one?ref=samvyo.com"><u>a record button isn't a chain of custody</u></a> covers what has to be true for a clip to hold up. And for the full path that footage travelled before it reached the archive, see <a href="https://samvyo.com/blog/how-fleet-video-streaming-actually-works-the-architecture-between-vehicle-and-command-centre?ref=samvyo.com"><u>the architecture between vehicle and command centre</u></a>.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>How long should a fleet keep dashcam footage?</strong></p><p>There is no single number. Keep continuous footage on the vehicle for the recorder's horizon, keep event and requested footage centrally for the longer of your contractual minimum and your measured claims window, and keep bulk footage briefly or not at all. Preserve anything tied to a flagged incident until it closes.</p><p><strong>Who decides fleet video retention?</strong></p><p>In practice, four forces: the buyer or customer contract, the time between incidents and requests for footage, storage cost, and data-protection law. When none of them is written into a policy, the recorder's storage decides by overwriting the oldest footage.</p><p><strong>Do insurers require fleets to keep video for a set period?</strong></p><p>None of the insurer guidance we reviewed states a retention period. Insurers use fleet footage to establish fault, and ask for it when there is a claim; whether it still exists is the fleet's responsibility. Set retention from your own claims history.</p><p><strong>How much does it cost to retain fleet video?</strong></p><p>It depends almost entirely on what you keep. For 200 vehicles over 13 months, retaining the full continuous recording is roughly 5,000 TB, while keeping only event clips is roughly 8 TB — about 600 times less, at any storage price. Samvyo, based on SFU architecture, keeps recording processing and storage on infrastructure you control, so tiering and retention periods follow your policy rather than a provider's default.</p><p><strong>Does privacy law affect how long fleet video can be kept?</strong></p><p>It pushes toward keeping less. India's DPDP Act, for example, requires personal data to be erased once its specified purpose is no longer served, unless another law requires retention. This is not legal advice; state a purpose and a period for each tier of footage.</p><p><strong>What is a video retention tier?</strong></p><p>A category of footage with its own storage location, retention period and purpose — for example, continuous footage on the vehicle, event clips in a central archive, and flagged incidents under preservation. Tiers let a fleet keep what matters for as long as it matters without paying to store everything. Platforms such as Samvyo that keep recording on infrastructure you choose let you set those periods per tier yourself.</p>]]></content:encoded></item><item><title><![CDATA[MDVR Cloud Upload: Getting In-Vehicle Recorder Footage Off the Truck]]></title><description><![CDATA[MDVR cloud upload sounds like one pipe. It is four: cellular for events, depot Wi-Fi for bulk, a pulled drive after a serious incident, and the option nobody names — leaving footage on the vehicle until someone asks. Here is which footage takes which path, and what the recorder speaks]]></description><link>https://www.samvyo.com/blog/mdvr-cloud-upload-getting-in-vehicle-recorder-footage-off-the-truck</link><guid isPermaLink="false">6abb60158b45c3f0cd63ab51</guid><category><![CDATA[MDVR]]></category><category><![CDATA[video telematics]]></category><category><![CDATA[fleet video]]></category><category><![CDATA[video recording architecture]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 30 Sep 2026 13:31:18 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-29--2026--12_39_31-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-29--2026--12_39_31-PM.png" alt="MDVR Cloud Upload: Getting In-Vehicle Recorder Footage Off the Truck"/><p>One current eight-channel vehicle recorder built for commercial fleets ships with three separate ways to move footage. It carries <a href="https://image.makewebeasy.net/makeweb/0/8EqRH7nKo/Document/X3NPro_PTH0404_Specification.pdf?ref=samvyo.com"><u>a 3.5-inch hard drive, an M.2 SSD and an SD slot up to 256 GB, alongside 4G and Wi-Fi</u></a>.</p><p>That hardware is telling you something. <strong>MDVR cloud upload is not one pipe. It is a routing decision</strong> — which footage leaves the vehicle by which path, how fast, and at what cost — and a fleet that treats it as a single "sync to cloud" setting ends up paying cellular prices for footage nobody needed, or waiting days for footage someone needed that afternoon.</p><h2 id="four-paths-not-one"><strong>Four paths, not one</strong></h2><p>Counting the option that usually goes unnamed, there are four ways footage leaves a mobile recorder — or does not.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="113"><col width="147"><col width="120"><col width="244"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Path</span></p></th><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Best for</span></p></th><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Time to cloud</span></p></th><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Main constraint</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cellular (4G/5G)</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Event clips, footage requested on demand</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Minutes, when there is signal</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Uplink is slower than the recorder writes; data is billed per GB; nothing moves in a dead zone</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Depot Wi-Fi</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Bulk and scheduled offload</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Hours after the vehicle returns</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Shared airtime, old vehicle radios, recorder shutdown timers</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Physical removal</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Serious incidents; vehicles that cannot power up; very large pulls</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Hours to days</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Labour, access to the vehicle, and custody of the drive</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Stay on the vehicle</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Everything nobody has asked for yet</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Never — unless requested before it is overwritten</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The recorder's buffer horizon</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The rest of this post is about matching footage to path. The underlying pipeline — cameras, recorder, uplink, platform, operator — is in <a href="https://samvyo.com/blog/how-fleet-video-streaming-actually-works-the-architecture-between-vehicle-and-command-centre?ref=samvyo.com"><u>the architecture between vehicle and command centre</u></a>; here we zoom into the single hop from the recorder to the cloud.</p><h2 id="cellular-for-events-and-requests-never-for-bulk"><strong>Cellular: for events and requests, never for bulk</strong></h2><p>Cellular is the only path that works while the vehicle is on the road, which makes it the only path for anything time-sensitive. It is also the narrowest. At a 14 Mbps two-camera recording rate, an hour of footage is about 6.3 GB and takes nearly three hours to upload at 5 Mbps; the recorder outruns the link even on a good day.</p><p>So cellular carries two kinds of traffic well. <strong>Event clips</strong>, which are short by design: event-triggered systems typically keep <a href="https://www.ntsb.gov/safety/safety-studies/Documents/SR1501.pdf?ref=samvyo.com"><u>15–30 seconds before and 30–60 seconds after a trigger</u></a>. And <strong>requested footage</strong>, where an operator or investigator asks the vehicle for a specific window and the recorder sends just that. How those are prioritised against each other on the road is <a href="https://samvyo.com/blog/store-and-forward-for-fleet-video-keeping-the-footage-the-network-drops?ref=samvyo.com"><u>the store-and-forward design question</u></a>.</p><p>What cellular should not carry is the continuous recording. A fleet that configures "upload everything over 4G" either saturates the link, starving live view and event clips, or silently falls behind until the recorder overwrites what it never sent.</p><h2 id="depot-wi-fi-for-bulk-with-limits"><strong>Depot Wi-Fi: for bulk, with limits</strong></h2><p>Depot Wi-Fi is where bulk footage is meant to go, and procurement documents say so. One municipal bus-surveillance tender asked for infrastructure to <a href="https://www.normanok.gov/sites/default/files/documents/2021-07/RFP%202122-16%20Public%20Transportation%20On-board%20Vehicle%20Surveillance%20System%20-%207-12-21.pdf?ref=samvyo.com"><u>"wirelessly offload all required video daily for all buses while in the … fleet facility"</u></a>, with at least 13 months archived centrally.</p><p>The word that matters is <em>required</em>. At fleet scale the depot cannot move everything — shared airtime, recorders with older Wi-Fi radios and a shutdown timer after the ignition goes off all cap what each vehicle can send. The practical answer is to schedule the depot rather than hope it keeps up — drain vehicles in order of departure, and define "required" narrowly. The point for path choice is simpler: the depot path is fast per gigabyte but only open for a few hours a day, and only when the vehicle comes home.</p><h2 id="physical-removal-the-path-for-when-everything-else-fails"><strong>Physical removal: the path for when everything else fails</strong></h2><p>Pulling the drive sounds archaic. It is the path that still works when the others do not, and three situations call for it.</p><ul><li><strong>After a serious crash.</strong> The vehicle may not power up, the modem may be damaged, and the footage may be the most important the fleet ever records. Some recorders carry mirrored drives and <a href="https://www.securityinformed.com/hikvision-ae-mn5043-rj45-network-video-recorder-nvr-technical-details.html?ref=samvyo.com"><u>power-loss protection</u></a> so the drive survives even when the vehicle does not.</li><li><strong>When the request is very large.</strong> Days of multi-camera footage for an investigation can be faster to carry than to transmit.</li><li><strong>When the evidence will be contested.</strong> A drive removed, sealed and logged is a simple custody story to tell.</li></ul><p>The cost is custody. A drive in someone's pocket is exactly the gap that <a href="https://samvyo.com/blog/video-chain-of-custody-why-a-record-button-isnt-one?ref=samvyo.com"><u>a record button isn't a chain of custody</u></a> warns about: who removed it, when, where it went, and whether what was uploaded afterwards is bit-identical to what came off the vehicle. Hash the footage at removal, log every hand-off, and the physical path becomes the strongest one rather than the weakest.</p><h2 id="the-fourth-path-leave-it-where-it-is"><strong>The fourth path: leave it where it is</strong></h2><p>Much of the footage a fleet records is never looked at. The cheapest place to keep it is the drive already in the vehicle, and the cheapest upload is the one that never happens.</p><p>Treating the recorder as the first tier of the archive — with a known horizon, and on-demand retrieval over cellular or at the depot when someone asks — is a legitimate design, not a failure to upload. Its one hard requirement is that the horizon outlasts the time it takes someone to ask. How long that needs to be is a retention question, not a bandwidth one.</p><h2 id="what-the-recorder-actually-speaks"><strong>What the recorder actually speaks</strong></h2><p>One more thing decides how MDVR cloud upload works in practice: the protocol. The protocol a recorder speaks is rarely one a web browser understands. Some recorders use their manufacturer's own protocol; others implement <a href="https://www.chinesestandard.net/PDF.aspx/JTT1078-2016?ref=samvyo.com"><u>JT/T 1078</u></a>, the Chinese Ministry of Transport's video communication protocol for vehicle terminals, which covers real-time video, historical playback, download and upload between the vehicle and a platform, and references RTP for transport.</p><p>The practical consequence is a gateway. Whatever receives footage from the vehicles has to speak the recorder's protocol on one side and whatever operators and storage use on the other — the fleet version of the problem that <a href="https://samvyo.com/blog/live-video-in-surveillance-why-rtsp-cameras-still-cant-talk-to-web-browsers-in-2026?ref=samvyo.com"><u>RTSP cameras still cannot talk to web browsers</u></a> describes for fixed cameras. Check which protocol a recorder speaks before choosing the platform it will upload to, not after.</p><h2 id="a-routing-policy-written-down"><strong>A routing policy, written down</strong></h2><p>Put together, a sound MDVR cloud upload design fits on one page:</p><ul><li><strong>Events and requests:</strong> cellular, immediately, highest priority.</li><li><strong>Required bulk:</strong> depot Wi-Fi, scheduled by departure time.</li><li><strong>Serious incidents:</strong> drive removal under a logged custody procedure, in addition to whatever was already uploaded.</li><li><strong>Everything else:</strong> stays on the vehicle until its horizon expires, retrievable on request.</li></ul><p>The hardware for all four paths is usually already in the vehicle. What is often missing is this page.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>MDVR cloud upload is a routing policy across four paths: cellular for events and requests, depot Wi-Fi for required bulk, physical removal for serious incidents, and the vehicle's own drive for everything nobody has asked for yet.</p><p>Match footage to path, check the protocol before the platform, and treat custody as part of the upload, not an afterthought.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>Every path ends in a storage decision: <a href="https://samvyo.com/blog/fleet-video-retention-how-long-to-keep-footage-and-who-actually-decides?ref=samvyo.com"><u>how long to keep fleet footage, and who actually decides</u></a> covers retention as policy and cost.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>How does MDVR cloud upload work?</strong></p><p>A mobile DVR records continuously to its own drive and moves footage to a central platform by one of several paths: short event clips and requested windows over 4G, bulk footage over depot Wi-Fi when the vehicle returns, and occasionally a physically removed drive after a serious incident. Most footage is never uploaded and ages out on the vehicle.</p><p><strong>Can an MDVR upload all its footage to the cloud over 4G?</strong></p><p>Not continuously. A two-camera recorder at 14 Mbps writes about 6.3 GB an hour, which takes nearly three hours to upload at 5 Mbps. Cellular is for event clips and on-demand requests; bulk footage belongs on depot Wi-Fi or stays on the vehicle.</p><p><strong>What protocol do MDVRs use to send video?</strong></p><p>Some use their manufacturer's own protocol; others implement JT/T 1078, the Chinese Ministry of Transport's vehicle video communication protocol, which uses RTP for transport. Either way, a gateway usually translates between the recorder and the platform operators use. A WebRTC platform such as Samvyo, based on SFU architecture, sits on the browser side of that gateway, delivering the video to operators in browsers and apps.</p><p><strong>When should an MDVR drive be physically removed?</strong></p><p>After a serious crash, when the vehicle cannot power up, when a very large amount of footage is needed, or when the evidence is likely to be contested. Hash the footage at removal and log every hand-off so the drive's custody can be proven later.</p><p><strong>Is it acceptable to leave fleet footage on the vehicle instead of uploading it?</strong></p><p>Yes, if the recorder's buffer horizon is longer than the time it takes someone to request footage. Treating the vehicle's drive as the first tier of the archive avoids moving video nobody will watch, with on-demand retrieval over cellular or at the depot when it is needed.</p><p><strong>Where should uploaded MDVR footage be stored?</strong></p><p>Somewhere that preserves timestamps, vehicle identity and custody records, under a retention policy you set. Samvyo keeps recording processing and storage on infrastructure you control, so the location and lifetime of uploaded fleet footage are your decision rather than a provider default.</p>]]></content:encoded></item><item><title><![CDATA[Live Fleet Video vs Recorded: When a Fleet Actually Needs a Live Feed]]></title><description><![CDATA[The best evidence that fleet cameras improve safety comes from recorded clips and human coaching, not live feeds. In one randomised study, automated in-cab alerts alone made no significant difference. Here is when a fleet actually needs live video, and when recording is the better buy.]]></description><link>https://www.samvyo.com/blog/live-fleet-video-vs-recorded-when-a-fleet-actually-needs-a-live-feed</link><guid isPermaLink="false">6abb65028b45c3f0cd63ab67</guid><category><![CDATA[video telematics]]></category><category><![CDATA[fleet video]]></category><category><![CDATA[live monitoring]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 30 Sep 2026 13:31:13 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-29--2026--12_56_33-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-29--2026--12_56_33-PM.png" alt="Live Fleet Video vs Recorded: When a Fleet Actually Needs a Live Feed"/><p>In 2011, an FMCSA-funded study put video monitoring into two trucking fleets for 17 weeks. Safety-related events per 10,000 miles fell <a href="https://doi.org/10.1016/j.trf.2010.11.010?ref=samvyo.com"><u>37% at one carrier and 52.2% at the other</u></a>.</p><p>The system was not a live feed. It captured video around risky driving events, and the improvement came from pairing that footage with behavioural coaching. <strong>The strongest evidence that fleet cameras change behaviour is evidence for recorded video and coaching — not for live feeds.</strong></p><p>That is the honest starting point for choosing live fleet video vs recorded, and it cuts against the instinct many buyers arrive with. Live monitoring feels like the premium version of fleet video. For most of what a fleet actually needs from its cameras, it is not the version that does the work.</p><h2 id="what-the-evidence-actually-credits"><strong>What the evidence actually credits</strong></h2><p>A second, larger study makes the point sharper. NIOSH researchers ran a randomised trial across 315 vehicles and roughly 625 drivers from 2012 to 2014, with forward-facing and driver-facing cameras, comparing different kinds of feedback (<a href="https://stacks.cdc.gov/view/cdc/45683/cdc_45683_DS1.pdf?ref=samvyo.com"><u>Bell et al., Journal of Safety Research, 2017</u></a>).</p><p>Coaching combined with in-cab warning lights roughly halved the odds of risky driving compared with the control group (adjusted odds ratio 0.52). <strong>In-cab warning lights on their own produced no significant improvement.</strong> The automated, real-time part did little by itself. The human reviewing recorded footage with the driver is what moved the numbers.</p><p>Two caveats belong with this. Both studies are rigorous and neither is recent — 2011 and 2017. The American Transportation Research Institute is <a href="https://www.ortrucking.org/2026/06/17/motor-carriers-participate-in-study-assessing-the-potential-safety-benefits-of-driver-facing-cameras/?ref=samvyo.com"><u>running a new study on the safety impacts of in-cab monitoring</u></a>, recruiting carriers through July 2026, which may update the picture. And neither study tested live monitoring at all. They show what recorded video plus coaching achieves; they do not show that live video achieves nothing.</p><p>The same holds for the other big use of fleet footage. Insurers value it because "the footage and telematics data can also be used to identify who may be at fault in a collision," as <a href="https://www.aviva.co.uk/risksolutions/protecting-your-motor-fleet/selection-and-utilisation-of-technology/?ref=samvyo.com"><u>Aviva's fleet risk guidance</u></a> puts it. The NTSB made the same case for <a href="https://www.ntsb.gov/safety/safety-studies/Documents/SR1501.pdf?ref=samvyo.com"><u>crash investigation</u></a>. Both are after-the-fact uses. A recording serves them fully.</p><h2 id="the-three-question-test-for-a-live-feed"><strong>The three-question test for a live feed</strong></h2><p>So when is live worth paying for? Only when a person watching in real time can change the outcome. That breaks down into three questions, and a use case needs a yes to all three.</p><ul><li><strong>Can someone act within minutes?</strong> A live feed with no one able to respond — no dispatcher, no police link, no way to speak to the driver — is a recording you are paying extra to watch. The same logic holds in fixed-site surveillance: <a href="https://samvyo.com/blog/talk-down-at-ten-seconds-is-theater-the-surveillance-intervention-latency-budget?ref=samvyo.com"><u>talk-down at ten seconds is theatre</u></a> when the response chain cannot keep up.</li><li><strong>Is the event visible on camera, while it is happening?</strong> Many costly fleet incidents are not. A theft done through paperwork, or from a parked trailer with no camera on it, never appears on a live feed.</li><li><strong>Will acting change the result?</strong> Seeing a collision live does not prevent it. Seeing an assault on a bus live, while police can still be sent, might change what happens next.</li></ul><p>Most fleet use cases fail at least one of those questions. A handful pass all three, and those are where live video earns its cost.</p><h2 id="live-fleet-video-vs-recorded-use-case-by-use-case"><strong>Live fleet video vs recorded, use case by use case</strong></h2>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="167"><col width="100"><col width="357"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Use case</span></p></th><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Live or later?</span></p></th><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Why</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Driver coaching</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Later</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The evidence above: recorded clips reviewed with the driver drive the improvement</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Insurance claims and fault disputes</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Later</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Decided after the event; the recording is the asset</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Crash investigation</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Later</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The NTSB's use case — pre-crash, crash and post-crash footage, reviewed afterwards</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Customer or delivery disputes</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Later</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Proof is needed when the complaint arrives, not when the delivery happens</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Panic button pressed</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Live, on trigger</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A person is asking for help now, and a dispatcher can respond</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Assault or disturbance on a passenger vehicle</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Live, on trigger</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Visible, ongoing, and a response can change the outcome</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Vehicle off-route or suspected hijack</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Live, on trigger</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Time-critical, and seeing the cab tells a dispatcher what they are dealing with</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cargo theft in progress</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Live, if on camera</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Losses are large — US and Canada saw </span><a href="https://www.verisk.com/company/newsroom/cargo-theft-losses-surge-to-estimated-$725-million-in-2025-verisk-cargonet-analysis-reveals/?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3,594 supply-chain crime events and about $725M in losses in 2025</span></a><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> — but only thefts happening in view of a camera can be interrupted</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Post-crash response</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Live, on trigger</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Seeing the scene helps a dispatcher decide what to send</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Read down the second column and a pattern appears. Every "later" use case is continuous and after-the-fact. Every "live" use case is rare, event-driven and time-critical. <strong>None of them needs every camera streaming all day.</strong></p><h2 id="the-answer-is-usually-live-on-trigger-not-live-always"><strong>The answer is usually live on trigger, not live always</strong></h2><p>That pattern points to the design most fleets should buy: record everything continuously, and open a live view when something happens — a panic button, a geofence breach, a collision sensor, an AI alert, or a dispatcher's request. The trigger decides when live matters. <a href="https://samvyo.com/blog/why-edge-ai-alone-cant-solve-fleet-video-and-what-the-cloud-layer-needs-to-do?ref=samvyo.com"><u>Edge AI in the vehicle and the cloud layer</u></a> divide that work between them.</p><p>Live-on-trigger also fits the network. A moving 4G link <a href="https://samvyo.com/blog/fleet-video-bandwidth-how-many-camera-feeds-actually-fit-down-a-moving-4g-link?ref=samvyo.com"><u>reliably carries one or two live feeds</u></a>, not every camera on every vehicle. And it is honest about coverage: <a href="https://samvyo.com/blog/why-your-fleet-dashcam-feed-dies-the-moment-the-truck-hits-a-dead-zone?ref=samvyo.com"><u>the live feed dies in dead zones</u></a> regardless of what was paid for it, while the recording carries on.</p><p>It also fits the people. Live video needs someone watching, and <a href="https://samvyo.com/blog/the-operator-to-camera-ratio-that-decides-whether-proactive-monitoring-pays?ref=samvyo.com"><u>the operator-to-camera ratio</u></a> decides whether that pays — a lesson from surveillance that transfers directly. An operator who is shown a vehicle when a trigger fires can handle far more of the fleet than one scanning a wall of always-on feeds.</p><h2 id="the-cost-nobody-puts-in-the-business-case-the-driver"><strong>The cost nobody puts in the business case: the driver</strong></h2><p>One more factor pushes against always-on live video. Drivers do not like being watched. In <a href="https://truckingresearch.org/2023/04/new-atri-research-identifies-strategies-for-improving-driver-facing-camera-approval-and-utilization/?ref=samvyo.com"><u>ATRI's 2023 research</u></a>, driver approval of driver-facing cameras was 2.24 on a 0-to-10 scale among 650 current users.</p><p>The same research found approval rose 87% when carriers used the footage for specific proactive safety measures. The lesson is not "no cameras". It is that how footage is used shapes whether drivers accept it — and a feed anyone can open at any moment is harder to defend to a driver than a recording reviewed when something happened.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>The strongest evidence for fleet cameras credits recorded clips and human coaching, not live feeds; claims and crash investigation are after-the-fact too. Live video earns its cost only where someone can act in minutes, the event is on camera, and acting changes the outcome.</p><p>For most fleets that means continuous recording plus live on trigger — panic buttons, assaults, hijacks, thefts in progress — not every camera streaming all day.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>This is the decision half of a pair. Its companion prices the scope decided here — data per vehicle, monitoring staff and platform — in <a href="https://samvyo.com/blog/fleet-video-monitoring-cost-what-it-takes-to-watch-a-fleet-live?ref=samvyo.com"><u>what it takes to watch a fleet live</u></a>.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>Does a fleet need live video or is recorded video enough?</strong></p><p>For most uses, recorded video is enough. Driver coaching, insurance claims, crash investigation and customer disputes are all after-the-fact, and the published safety evidence credits recorded clips reviewed with drivers. Live video is worth it for rare, time-critical events such as panic alarms, assaults on passenger vehicles and suspected hijacks.</p><p><strong>Do fleet dashcams actually improve driver safety?</strong></p><p>Rigorous studies say yes, when paired with coaching. An FMCSA-funded study found safety-related events fell 37% and 52.2% at two carriers, and a NIOSH randomised trial found coaching plus in-cab alerts roughly halved the odds of risky driving. In that trial, in-cab alerts alone made no significant difference. Both studies predate 2018; newer research is under way.</p><p><strong>When is live fleet video monitoring worth it?</strong></p><p>When three things are true: someone can act within minutes, the event is visible on camera while it happens, and acting can change the outcome. Panic buttons, passenger assaults, hijacks, thefts in progress and post-crash response typically pass. Coaching, claims and audits do not need live video.</p><p><strong>What is live-on-trigger fleet video?</strong></p><p>A design in which vehicles record continuously but only stream live when an event occurs — a panic button, geofence breach, collision sensor, AI alert or dispatcher request. It concentrates live bandwidth and operator attention on the moments that matter. An SFU-based platform such as Samvyo fits this pattern naturally: a vehicle can join a live session when a trigger fires and leave it afterwards, so live capacity is spent on events rather than idle feeds.</p><p><strong>Do drivers accept live camera monitoring?</strong></p><p>Acceptance is low by default. ATRI found driver approval of driver-facing cameras averaged 2.24 out of 10 among 650 users, but rose 87% when carriers used footage for specific proactive safety measures. How footage is used matters as much as whether cameras are fitted.</p><p><strong>Can live fleet video prevent cargo theft?</strong></p><p>Only thefts that happen on camera while someone can respond. Cargo crime is costly — about $725 million in losses across the US and Canada in 2025 by one industry count — but thefts through paperwork or from unmonitored trailers never appear on a live feed. Live video is one layer of cargo security, not the whole of it. Platforms such as Samvyo keep recording running alongside live sessions, so the evidence exists even when the live response comes too late.</p>]]></content:encoded></item><item><title><![CDATA[Store-and-Forward for Fleet Video: Keeping the Footage the Network Drops]]></title><description><![CDATA[Every fleet recorder already stores video. The hard part is forwarding it: one hour of footage takes nearly three hours to upload over a typical 4G link, and the on-board buffer is a countdown to overwrite. Here is how store-and-forward actually works, and what it still loses.]]></description><link>https://www.samvyo.com/blog/store-and-forward-for-fleet-video-keeping-the-footage-the-network-drops</link><guid isPermaLink="false">6abb5c8a8b45c3f0cd63ab3b</guid><category><![CDATA[video telematics]]></category><category><![CDATA[fleet video]]></category><category><![CDATA[video recording infrastructure]]></category><category><![CDATA[MDVR]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 30 Sep 2026 13:31:07 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-29--2026--12_16_13-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-29--2026--12_16_13-PM.png" alt="Store-and-Forward for Fleet Video: Keeping the Footage the Network Drops"/><p>A 256 GB card in a current two-camera fleet dashcam holds <a href="https://manual.blackvue.com/docs/dr970x-2ch-lte/recording-time/recording-time-dr970x-2ch-lte/?ref=samvyo.com"><u>36 hours and 40 minutes of footage</u></a> at its Normal quality setting. At the highest setting, 14 hours and 40 minutes. After that, the oldest video is overwritten, silently, whether anyone has looked at it or not.</p><p>That is the part of store and forward video most fleets never think about. Storing is easy — every recorder does it by default. <strong>Forwarding is the hard part, and the buffer that makes store-and-forward possible is also a countdown.</strong></p><p>When the truck drops into a dead zone — <a href="https://samvyo.com/blog/why-your-fleet-dashcam-feed-dies-the-moment-the-truck-hits-a-dead-zone?ref=samvyo.com"><u>the symptom most fleets see first</u></a> — the recorder keeps writing. Whether that footage ever reaches the command centre depends on three decisions: how much the vehicle can hold, what it sends first when the link returns, and how the gap is stitched back afterwards.</p><h2 id="what-store-and-forward-video-actually-means-in-a-fleet"><strong>What store and forward video actually means in a fleet</strong></h2><p>The pattern is old and simple. Record everything locally. When a connection is available, forward what matters. When it is not, keep recording and try again later.</p><p>In a fleet it runs alongside the live path rather than replacing it. The live stream is a small, separate feed that is never buffered: a second of live view missed in a tunnel is gone as live view. What store-and-forward recovers is the <em>recording</em> — the full-quality video the recorder was writing the whole time. <a href="https://samvyo.com/blog/how-fleet-video-streaming-actually-works-the-architecture-between-vehicle-and-command-centre?ref=samvyo.com"><u>The pipeline between vehicle and command centre</u></a> carries both; this post is about the second.</p><p>That distinction answers the most common misunderstanding. Store-and-forward keeps the record. It does not give you back the moment. If someone needed to act while the truck was in the dead zone, no amount of buffering helps them — which is why the forwarding strategy matters so much.</p><h2 id="sizing-the-buffer-horizon-not-capacity"><strong>Sizing the buffer: horizon, not capacity</strong></h2><p>Recorder spec sheets quote storage in terabytes. The number that matters is <strong>hours of horizon</strong>: how long footage survives on the vehicle before it is overwritten. That is storage divided by the combined bitrate of every channel being recorded, and the bitrate is set by whoever configures the recorder, not by the hardware.</p><p>The documented figures for one current two-camera unit show how quickly the horizon moves. Its quality settings <a href="https://manual.blackvue.com/docs/dr970x-2ch-lte/recording-time/recording-time-dr970x-2ch-lte/?ref=samvyo.com"><u>run from 8 + 6 Mbps to 25 + 10 Mbps</u></a> for the front and rear cameras. On the same 256 GB card, that is the difference between about a day and a half and about fourteen hours.</p><p>Vehicle recorders built for heavier fleets carry far more. One current mobile NVR, for example, takes <a href="https://www.securityinformed.com/hikvision-ae-mn5043-rj45-network-video-recorder-nvr-technical-details.html?ref=samvyo.com"><u>up to 2 TB of hard disk or 4 TB of SSD</u></a>, with two drives that can mirror each other. At the same 14 Mbps two-camera load, 2 TB is roughly 13 days. Add more cameras or raise the bitrate and it shrinks proportionally.</p><p>Buyers write this down when they know to. A <a href="https://www.normanok.gov/sites/default/files/documents/2021-07/RFP%202122-16%20Public%20Transportation%20On-board%20Vehicle%20Surveillance%20System%20-%207-12-21.pdf?ref=samvyo.com"><u>municipal bus-surveillance tender</u></a> specified that each vehicle's recorder "must be capable of retaining a minimum of 240 hours of video". At 14 Mbps that is about 1.5 TB per vehicle — before counting a single additional camera.</p><p>The rule that falls out: <strong>size the horizon to your longest realistic gap before offload, not to your average day.</strong> A vehicle that spends a long weekend at an outstation, or a week on a rural contract, needs a horizon measured in days. A vehicle that returns to the depot every night needs much less — provided the depot can actually drain it, which is not a safe assumption.</p><h2 id="why-forwarding-can-never-keep-up-over-cellular"><strong>Why forwarding can never keep up over cellular</strong></h2><p>Here is the arithmetic that shapes every store-and-forward design. At 14 Mbps, one hour of two-camera recording is about 6.3 GB. TRAI's drive tests measured <a href="https://trai.gov.in/sites/default/files/2025-06/IDT_WB_Feb_10062025.pdf?ref=samvyo.com"><u>4G-only upload speeds of roughly 5 to 9 Mbps</u></a> across the major operators, and that was at hotspots with a flagship handset, not from inside a moving cab.</p><p>Take 5 Mbps: uploading one hour of footage takes about 2.8 hours. <strong>The recorder produces video faster than the cellular link can carry it away, even when the link is good.</strong> A backlog that builds in a dead zone never clears on the road; it only grows.</p><p>So a fleet store-and-forward design is never "upload everything when the signal comes back". It is a priority scheme, and the question is what goes first. <a href="https://samvyo.com/blog/fleet-video-bandwidth-how-many-camera-feeds-actually-fit-down-a-moving-4g-link?ref=samvyo.com"><u>How many feeds fit down a moving link</u></a> covers the capacity side; the design choices look like this.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="153"><col width="220"><col width="251"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Tier</span></p></th><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What it is</span></p></th><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">How it travels</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1 · Event clips</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Short clips around a trigger: harsh braking, collision, panic button, ADAS alert</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Over cellular, as soon as any usable link exists. Small enough to get through a patchy signal</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2 · Requested footage</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A specific window an operator or investigator asks for after the fact</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Over cellular on demand, if the vehicle still holds it</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3 · Everything else</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The full continuous recording</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">At the depot, over Wi-Fi or wired offload, or never — it ages out on the vehicle</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The event tier is what makes the whole scheme work, because clips are small. Event-triggered recording typically keeps <a href="https://www.ntsb.gov/safety/safety-studies/Documents/SR1501.pdf?ref=samvyo.com"><u>15–30 seconds before and 30–60 seconds after the trigger</u></a>, according to the NTSB. At 14 Mbps a 90-second clip is about 160 MB — roughly four minutes of upload at 5 Mbps. That fits through a signal that could never carry an hour of continuous video.</p><h2 id="what-store-and-forward-still-loses"><strong>What store-and-forward still loses</strong></h2><p>This is the honest part, and it is where most vendor diagrams stop. Store-and-forward is a strong pattern. It is not a guarantee. Four things still get lost.</p><ul><li><strong>The live moment.</strong> Covered above, and worth repeating because it is the one people forget: buffering recovers evidence, not response time.</li><li><strong>Footage that ages out before anyone asks for it.</strong> If the horizon is shorter than the time between an incident and someone noticing it, the footage is gone. Complaints and claims can surface days after the event.</li><li><strong>The last seconds before a crash.</strong> The NTSB documented a motorcoach crash in which the onboard system "recorded critical precrash information but … stopped recording immediately before impact". Power loss and physical damage are exactly what a crash causes. Some recorders ship with <a href="https://www.securityinformed.com/hikvision-ae-mn5043-rj45-network-video-recorder-nvr-technical-details.html?ref=samvyo.com"><u>super-capacitors for power-loss protection</u></a> — worth checking for on any spec sheet.</li><li><strong>The recorder itself.</strong> Footage stored only on the vehicle leaves with the vehicle. Theft, fire or a write-off takes the evidence with it, which is the strongest argument for pushing event clips off the truck immediately rather than at the depot.</li></ul><p>Every one of those losses is shaped by the same two numbers: how long the vehicle can hold footage, and how quickly it can hand the important part off.</p><h2 id="backfill-stitching-the-gap-back-into-the-record"><strong>Backfill: stitching the gap back into the record</strong></h2><p>When forwarded footage finally arrives, it has to land in the right place on the timeline. That sounds trivial and is not, because the footage was timestamped by the vehicle's clock, not the server's.</p><p>Three things make backfill trustworthy. The recorder's clock should be disciplined by GPS time rather than left to drift. Each uploaded file should carry its own start time, channel and vehicle identity, so it can be placed without guesswork — the same discipline <a href="https://samvyo.com/blog/evidentiary-video-recording-timestamps-retention-and-export-that-hold-up-later?ref=samvyo.com"><u>timestamps that hold up later</u></a> depend on. And the gap itself should be visible: a command centre timeline that shows "live lost 14:02–14:19, recording backfilled 21:40" is more useful, and more defensible, than one that silently looks complete.</p><p>The design choice most often skipped is the last one. A backfilled record that hides where it was backfilled is easier to look at and harder to trust.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Store-and-forward keeps the record through a dead zone, but the on-vehicle buffer is a countdown and the cellular uplink cannot keep pace with the recorder. That forces a priority scheme: event clips over cellular straight away, requested footage on demand, and the full recording at the depot or not at all.</p><p>Size the horizon to your longest gap, push event clips off the truck immediately, and make backfilled gaps visible rather than seamless.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>For the routes footage can take off the vehicle — cellular, depot Wi-Fi, a pulled drive, or staying on the recorder — and when each one fits, see <a href="https://samvyo.com/blog/mdvr-cloud-upload-getting-in-vehicle-recorder-footage-off-the-truck?ref=samvyo.com"><u>getting in-vehicle recorder footage off the truck</u></a>.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What is store and forward video?</strong></p><p>A recording pattern in which video is saved locally first and uploaded later, when a connection is available. In a fleet, the recorder writes continuously to its own drive or card, and footage is forwarded to the command centre when the vehicle has signal or reaches the depot. It preserves the recording through dead zones; it does not preserve live viewing.</p><p><strong>How long does a fleet dashcam store footage before overwriting it?</strong></p><p>It depends on storage size and the combined bitrate of every camera. One current two-camera dashcam documents about 36 hours on a 256 GB card at Normal quality, and about 14 hours at its highest setting. Heavier vehicle recorders with 2 TB drives hold roughly 13 days at a similar load.</p><p><strong>Why can't a fleet dashcam just upload everything when signal returns?</strong></p><p>Because the recorder produces video faster than a cellular uplink can carry it. At 14 Mbps, one hour of two-camera footage is about 6.3 GB, which takes roughly 2.8 hours to upload at 5 Mbps. Fleets therefore upload short event clips over cellular and move the full recording at the depot.</p><p><strong>What gets uploaded first in a store-and-forward fleet system?</strong></p><p>Event clips — short windows around a harsh-braking alert, collision or panic button, typically 15–30 seconds before and 30–60 seconds after. They are small enough to get through a weak signal. Requested footage comes next, and the full continuous recording is usually left for depot offload.</p><p><strong>Can store-and-forward lose footage?</strong></p><p>Yes, in four ways: footage that is overwritten before anyone asks for it, the final seconds before a crash if power or storage is damaged, footage lost with a stolen or destroyed vehicle, and anything that needed live action. Longer buffer horizons, power-loss protection and immediate event-clip upload reduce each one.</p><p><strong>Where should forwarded fleet footage be stored?</strong></p><p>Somewhere its timestamps, vehicle identity and gaps are preserved, so backfilled video can be placed and trusted later. Samvyo, based on SFU architecture, keeps recording processing and storage on infrastructure you control, which means where backfilled fleet footage lands and how long it stays is your policy decision rather than a provider default.</p><p><strong>Is store-and-forward the same as event-based recording?</strong></p><p>No. Event-based recording decides what gets saved as a clip; store-and-forward decides when saved footage is moved. Most fleet systems combine them: record continuously, flag events, forward the events immediately and the rest later. The NTSB notes continuous systems capture pre-crash context that event-only systems miss.</p>]]></content:encoded></item><item><title><![CDATA[Why Your Fleet Dashcam Feed Dies the Moment the Truck Hits a Dead Zone]]></title><description><![CDATA[The black tile on your live map is almost never the camera. In TRAI's own highway drive test, a fifth to a quarter of samples on Airtel and Jio had poor signal, against under 3.2% in the city. Here is why live feeds die on the road, and what actually helps.]]></description><link>https://www.samvyo.com/blog/why-your-fleet-dashcam-feed-dies-the-moment-the-truck-hits-a-dead-zone</link><guid isPermaLink="false">6abb5b8f8b45c3f0cd63ab24</guid><category><![CDATA[video telematics]]></category><category><![CDATA[fleet video]]></category><category><![CDATA[Mobile Networks]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 30 Sep 2026 13:31:02 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-29--2026--12_05_49-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-29--2026--12_05_49-PM.png" alt="Why Your Fleet Dashcam Feed Dies the Moment the Truck Hits a Dead Zone"/><p>In November 2025, TRAI drove a test rig 297.8 km down the Raipur–Jagdalpur highway with SIMs from all four national operators. On Airtel, 20.86% of the samples it logged were poor signal. On Jio, 24.58%.</p><p>The same campaign's city drive through Durg and Bhilai, that same month, found poor signal in no more than 3.18% of samples on any network. <a href="http://www.trai.gov.in/sites/default/files/2026-01/PR_No.04of2026.pdf?ref=samvyo.com"><u>TRAI published both figures side by side</u></a>.</p><p>Same operators, same month, same test equipment. The only thing that changed was the road. <strong>That is almost always why a fleet dashcam feed goes black: fleet dashcam connectivity fails on the route, not on the camera</strong> — and the route is the one part of the system nobody in the fleet office chose.</p><h2 id="the-camera-is-still-recording"><strong>The camera is still recording</strong></h2><p>Start with the thing that matters most, because it changes how worried you should be. When the live tile goes black, the recorder in the vehicle almost always keeps writing video to its own card or drive. What died is the live stream — the small, separate feed sent over the cellular link so someone can watch in real time.</p><p>The two are different streams by design. A current two-channel fleet dashcam documents recording at 6 to 25 Mbps per channel but <a href="https://helpcenter.blackvue.com/hc/en-us/articles/224989027-What-is-BlackVue-Cloud-service-internet-data-usage-?ref=samvyo.com"><u>streams live view at roughly 600 kbps</u></a>, a small fraction of the recording rate. <a href="https://samvyo.com/blog/fleet-video-bandwidth-how-many-camera-feeds-actually-fit-down-a-moving-4g-link?ref=samvyo.com"><u>The arithmetic of what fits down a moving link</u></a> is a post of its own; the point here is simpler. Losing the live feed and losing the footage are two different events, and most dead zones cause only the first.</p><p>So the real question is not "is the camera broken?" It is "why does a link that works everywhere I test it keep failing where the trucks actually drive?"</p><h2 id="coverage-maps-are-drawn-for-people-standing-outside"><strong>Coverage maps are drawn for people standing outside</strong></h2><p>Most coverage maps and coverage statistics answer the question: could a phone, held outdoors at this spot, get a usable signal? A dashcam modem is not outdoors. It sits inside a steel cab, frequently behind the dashboard.</p><p>The UK regulator is one of the few that publishes the difference, and the gap is not small. <a href="https://www.ofcom.org.uk/siteassets/resources/documents/research-and-data/multi-sector/infrastructure-research/connected-nations-2025/connected-nations-uk-report-2025.pdf?ref=samvyo.com"><u>Ofcom's Connected Nations 2025 report</u></a> puts 4G coverage on UK B roads at 95–97% per operator outside a vehicle — and 81–83% inside one. On motorways and A roads it is 98–99% outside, 90–93% inside.</p><p>The reason is in <a href="https://www.ofcom.org.uk/siteassets/resources/documents/research-and-data/multi-sector/infrastructure-research/connected-nations-2025/cn2025---methodology-annex.pdf?ref=samvyo.com"><u>Ofcom's methodology</u></a>: a road counts as covered in-car only where the signal is 10 dB stronger than the outdoor threshold, −95 dBm against −105 dBm. Ten decibels is a tenfold difference in received power, and it is roughly what the vehicle body is assumed to cost. Two caveats belong with those numbers: they are modelled from operators' own predictions rather than measured, and they describe the UK, one of the better-covered road networks anywhere.</p><p><strong>The truck is part of its own dead zone.</strong> A stretch that looks green on a coverage map can be marginal inside the cab — and marginal is exactly the condition under which a live stream gives up first.</p><p>Which raises the obvious question: what do real routes look like when someone actually drives them?</p><h2 id="what-a-route-actually-looks-like"><strong>What a route actually looks like</strong></h2><p>TRAI's independent drive tests are the closest thing to an answer, because the regulator drives the routes itself with handsets from every operator and publishes per-route results. Four tests show the range.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="180"><col width="147"><col width="297"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Route (TRAI test)</span></p></th><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What was measured</span></p></th><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Result by operator</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Durg–Bhilai city drive, Nov 2025</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Samples with poor signal</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Airtel 0.87% · Vi 0.87% · BSNL 2.36% · Jio 3.18%</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Raipur–Jagdalpur highway, 297.8 km, Nov 2025</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Samples with poor signal</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Vi 7.16% · Airtel 20.86% · Jio 24.58% · BSNL 26.29%</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><a href="https://trai.gov.in/sites/default/files/2026-06/PR_No79of2026.pdf?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Jodhpur–Ahmedabad rail route</span></a><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">, 456.9 km, May 2026</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Samples with poor signal</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Jio 2.6% · Airtel 7.0% · Vi 19.9% · BSNL 31.2%</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><a href="https://www.pib.gov.in/PressReleasePage.aspx?PRID=2284415&ref=samvyo.com" style="text-decoration:none;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Munabao–Tanot highway (NH-70)</span></a><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">, 311.4 km, Jun 2026</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Samples with NO coverage</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Jio 6.0% · Airtel 40.5% · Vi 81.8% · BSNL 83.6%</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Percentages are computed from TRAI's published sample counts. The NH-70 route runs along the Rajasthan border desert and is an extreme case — but it is a national highway that trucks use, and it is where the difference between operators stops being academic.</p><p>Two things stand out. First, highways are an order of magnitude worse than cities on the same networks, which is the whole of the symptom. Second, <strong>no operator wins everywhere.</strong> Vi had the cleanest signal on the Raipur–Jagdalpur highway and among the weakest coverage on NH-70. Jio was the weakest of the private networks on one highway and by far the strongest on the other.</p><p>For a fleet, that makes the SIM a route decision, not a procurement line item. The operator that works at head office tells you nothing about the operator that works on the corridor your trucks run every night.</p><h2 id="why-the-feed-dies-instead-of-degrading"><strong>Why the feed dies instead of degrading</strong></h2><p>A reasonable objection: a weak signal should mean a blurrier picture, not a black one. Sometimes it does. On a moving vehicle it usually does not, for three reasons.</p><p><strong>Upload is the scarce direction.</strong> Live video from a vehicle flows up, and cellular networks are built for traffic flowing down. One of the most thorough recent driving studies — a 5,700 km coast-to-coast campaign across three US operators — found uplink throughput <a href="https://ece.northeastern.edu/fac-ece/dkoutsonikolas/publications/imc23.pdf?ref=samvyo.com"><u>an order of magnitude lower than downlink</u></a>, and noted that operators often keep uplink traffic on slower LTE and low-band layers even when faster 5G is available. <a href="https://ece.northeastern.edu/fac-ece/dkoutsonikolas/publications/imc_rep25.pdf?ref=samvyo.com"><u>Its 2024 repeat</u></a> saw median uplink rise between 2.25× and 5.8× depending on operator — while the bottom quarter of samples on one operator's LTE layer still sat at or below about 1 Mbps.</p><p><strong>The link keeps changing underneath the stream.</strong> The same study counted a median of one to three handovers per mile while driving. Each handover is brief, but a live stream is a continuous flow: every interruption drains the player's buffer, and a real-time stream keeps that buffer deliberately small so the picture stays live.</p><p><strong>Recovery is not instant when the signal returns.</strong> Real-time video adapts its bitrate down as the link weakens — <a href="https://samvyo.com/blog/webrtc-bandwidth-estimation-why-your-call-downgrades-before-it-drops?ref=samvyo.com"><u>bandwidth estimation is why a call downgrades before it drops</u></a>. But once the link actually drops, the session has to find a path again, and on mobile networks that path very often has to go through a relay, <a href="https://samvyo.com/blog/nat-traversal-in-webrtc-why-the-call-connects-on-wi-fi-but-not-on-4g?ref=samvyo.com"><u>for the reasons carrier NAT creates</u></a>. The decoder then waits for a fresh keyframe before it can draw anything. A two-second outage can easily look like a ten-second black tile.</p><p>Add these together and the pattern fleet managers describe — fine in town, black on the highway, slow to come back — is exactly what the physics predicts. None of it is a camera fault.</p><h2 id="what-a-fleet-manager-can-actually-change"><strong>What a fleet manager can actually change</strong></h2><p>You cannot engineer the network. You can stop being surprised by it. Four things are in the fleet's control, none of which require touching <a href="https://samvyo.com/blog/how-fleet-video-streaming-actually-works-the-architecture-between-vehicle-and-command-centre?ref=samvyo.com"><u>the architecture between vehicle and command centre</u></a>.</p><ul><li><strong>Know your routes, not your city.</strong> Check TRAI's drive-test results for the corridors you actually run. If your recorders or telematics units log signal strength against GPS, you already have your own drive test, with far more miles in it than TRAI's.</li><li><strong>Choose the SIM per route.</strong> The table above is the argument. Where recorders support dual SIMs, pair operators whose coverage fails in different places, not the two cheapest.</li><li><strong>Get the antenna out of the cab.</strong> If the vehicle body costs roughly 10 dB, a roof-mounted external antenna is the one hardware change that attacks the problem directly rather than working around it.</li><li><strong>Set the expectation honestly.</strong> On a moving vehicle, live view is best-effort. The recording is the record. Anyone promising uninterrupted live video on rural highways is describing a network that does not exist yet.</li></ul><p>That last point moves the question from "how do we keep the feed alive?" to "what happens to the footage the network drops?" — which has a proper engineering answer.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>A black tile on a fleet dashboard is almost always a coverage event, not a hardware fault. Regulator data shows highways losing signal an order of magnitude more often than cities on the same networks, coverage figures are measured outside the vehicle rather than inside it, and no single operator is best on every route.</p><p>Treat live view as best-effort, choose SIMs by corridor, get the antenna outside the cab, and design for the gap rather than against it.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>The gap itself is the next problem: <a href="https://samvyo.com/blog/store-and-forward-for-fleet-video-keeping-the-footage-the-network-drops?ref=samvyo.com"><u>store-and-forward for fleet video</u></a> covers how recorders buffer through a dead zone, what still gets lost, and how the missing minutes are reconciled afterwards. And if the question is whether you needed the live feed at all, <a href="https://samvyo.com/blog/live-fleet-video-vs-recorded-when-a-fleet-actually-needs-a-live-feed?ref=samvyo.com"><u>when a fleet actually needs a live feed</u></a> works through it use case by use case.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>Why does my fleet dashcam go offline on highways?</strong></p><p>Because highway coverage is far patchier than city coverage, and the camera's modem sits inside the vehicle, where signal is weaker still. In TRAI's November 2025 drive test, 21–25% of samples on Airtel and Jio were poor signal on the Raipur–Jagdalpur highway, against under 3.2% on any network in the same month's city drive. The camera is usually still recording locally; only the live stream has dropped.</p><p><strong>Is footage lost when a fleet dashcam loses connection?</strong></p><p>Usually not. Most fleet dashcams and MDVRs record continuously to a local card or drive, and the live stream is a separate, much smaller feed. A dead zone interrupts watching, not recording. What can be lost depends on how the recorder buffers and uploads afterwards, which is the store-and-forward question.</p><p><strong>Which mobile network is best for fleet dashcam connectivity in India?</strong></p><p>It depends on the route, and the regulator's own data shows why. On one 2025 highway test Vi had the cleanest signal; on a 2026 border highway Vi had no coverage for 82% of samples while Jio was missing for 6%. Check TRAI's drive-test results for your corridors, or your own recorders' signal logs, rather than choosing on head-office coverage.</p><p><strong>Does 5G fix fleet dashcam connectivity?</strong></p><p>It raises upload speed where 5G exists, but it does not fill coverage gaps on rural highways, which is where feeds die. Driving studies also show operators often keep upload traffic on LTE and low-band layers. Treat 5G as a faster link in covered areas, not as a cure for dead zones.</p><p><strong>How do I improve fleet dashcam connectivity?</strong></p><p>Choose SIMs by route using drive-test data, pair operators whose coverage fails in different places, and use a roof-mounted external antenna so the cab is not attenuating the signal. On the platform side, Samvyo is one option: based on SFU architecture, it keeps the media path, TURN relays and recording on infrastructure you choose, so relays can sit close to the regions your fleet actually runs in.</p><p><strong>Can live fleet video work in a dead zone?</strong></p><p>No platform can stream through an absent network. What the platform can control is what happens around the gap: how quickly a feed recovers, where the relays sit, and whether the footage recorded during the outage reaches the command centre afterwards. Platforms that keep recording on infrastructure you control, Samvyo among them, let you decide where that post-outage footage lands and how long it is kept.</p>]]></content:encoded></item><item><title><![CDATA[Fleet Video Bandwidth: How Many Camera Feeds Actually Fit Down a Moving 4G Link]]></title><description><![CDATA[Two fleet cameras at the lowest documented recording setting need 14 Mbps of upload. TRAI measured 4G-only upload between 4.5 and 9 Mbps on India's operators. The recording stream never fits. Here is the fleet video bandwidth arithmetic: what the link carries and what fits.]]></description><link>https://www.samvyo.com/blog/fleet-video-bandwidth-how-many-camera-feeds-actually-fit-down-a-moving-4g-link</link><guid isPermaLink="false">6abb59248b45c3f0cd63ab0f</guid><category><![CDATA[video telematics]]></category><category><![CDATA[Bandwidth Estimation]]></category><category><![CDATA[Bandwidth Cost]]></category><category><![CDATA[fleet video]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 30 Sep 2026 13:30:55 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-29--2026--12_00_36-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-29--2026--12_00_36-PM.png" alt="Fleet Video Bandwidth: How Many Camera Feeds Actually Fit Down a Moving 4G Link"/><p>Two fleet cameras at the lowest recording setting documented for one current dashcam need <a href="https://manual.blackvue.com/docs/dr970x-2ch-lte/recording-time/recording-time-dr970x-2ch-lte/?ref=samvyo.com"><u>8 + 6 Mbps</u></a> — 14 Mbps of upload, continuously.</p><p>TRAI's drive tests measured 4G-only upload at <a href="https://trai.gov.in/sites/default/files/2025-06/IDT_WB_Feb_10062025.pdf?ref=samvyo.com"><u>between 4.51 and 8.93 Mbps</u></a> across India's four operators — standing still, at test hotspots, on a flagship phone.</p><p><strong>Fleet video bandwidth starts from that mismatch: the recording stream does not fit down a 4G uplink, not even for two cameras, not even on a good day.</strong> Everything a fleet streams live is a smaller, separate stream built to fit. The engineering question is how many of those fit, and what number to plan against.</p><h2 id="two-sides-of-the-uplink-budget"><strong>Two sides of the uplink budget</strong></h2><p>The budget has a supply side — what the moving link sustains upstream — and a demand side — bitrate multiplied by the number of cameras you want live. Sizing exercises often get the demand side roughly right and the supply side badly wrong, because they start from a coverage map or a headline speed.</p><p>Two properties of the supply side matter more than its average. It is <strong>upload</strong>, the direction mobile networks are least generous with: one of the most thorough recent driving studies found uplink <a href="https://ece.northeastern.edu/fac-ece/dkoutsonikolas/publications/imc23.pdf?ref=samvyo.com"><u>an order of magnitude lower than downlink</u></a>. And it <strong>varies continuously</strong> as the vehicle moves between cells, which is why <a href="https://samvyo.com/blog/why-your-fleet-dashcam-feed-dies-the-moment-the-truck-hits-a-dead-zone?ref=samvyo.com"><u>the feed dies in dead zones</u></a> rather than degrading gracefully.</p><h2 id="supply-what-a-moving-4g-link-actually-carries-upstream"><strong>Supply: what a moving 4G link actually carries upstream</strong></h2><p>Four independent measurements, from four methods, frame the range.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="207"><col width="220"><col width="197"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Source</span></p></th><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Upload measured</span></p></th><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Conditions</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><a href="https://trai.gov.in/sites/default/files/2025-06/IDT_WB_Feb_10062025.pdf?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">TRAI drive test, West Bengal</span></a><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">, Feb 2025</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">4G-only: BSNL 4.51 · Airtel 5.14 · Vi 7.14 · Jio 8.93 Mbps. 5G-only: Airtel 23.39 · Jio 40.57 Mbps</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Static, at hotspots, flagship handset, 30-second file uploads</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><a href="https://trai.gov.in/sites/default/files/2026-06/PR_No79of2026.pdf?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">TRAI, Jodhpur–Ahmedabad route</span></a><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">, May 2026</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">All technologies, average: BSNL 3.76 · Vi 8.81 · Jio 9.06 · Airtel 11.69 Mbps</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Moving, 456.9 km rail route</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><a href="https://insights.opensignal.com/reports/2026/02/india/mobile-network-experience?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Opensignal India</span></a><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">, Oct–Dec 2025</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Upload experience: BSNL 2.5 · Vi 5.9 · Jio 8.0 · Airtel 8.4 Mbps</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Crowdsourced from real users, all technologies</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><a href="https://ece.northeastern.edu/fac-ece/dkoutsonikolas/publications/imc_rep25.pdf?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">US cross-country drive</span></a><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">, Nov 2024</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Median 18–35 Mbps across three operators; bottom quarter of one operator's LTE samples at or below ~1 Mbps</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">5,700+ km, moving, 2-minute uploads</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The Indian figures cluster tightly: a typical upload experience of roughly 6 to 12 Mbps on the main private networks, higher where 5G is present, and much lower on BSNL. That consistency across a regulator's drive test and a crowdsourced dataset is worth something.</p><p>But every Indian figure here is an <strong>average</strong>, and averages hide exactly the part a live stream cares about. The US study is the one that publishes a distribution, and its tail is the warning: even where the median is healthy, a quarter of samples on one operator's LTE layer sat at about 1 Mbps. We could not find an equivalent percentile breakdown for Indian roads — TRAI publishes averages and signal-quality buckets, not throughput percentiles. That is a real gap in public data, not something to fill with a guess.</p><h2 id="the-median-is-not-the-budget"><strong>The median is not the budget</strong></h2><p>A live stream does not care about the average uplink over a journey. It cares about the uplink in the worst stretch it has to survive, because that is where it stalls.</p><p>So the planning number is a floor, not a mean. The data above supports a simple rule: <strong>plan live video against low single-digit Mbps of upload per vehicle, and treat anything above that as headroom.</strong> Averages of 6–12 Mbps tell you the link is often better. The distribution from the driving study tells you it is regularly far worse, and your stream has to live through those stretches too.</p><p>The best planning number is your own. Fleets that log uplink throughput and signal against GPS on their actual routes can replace this rule of thumb with a measured floor per corridor.</p><h2 id="demand-recording-bitrate-versus-live-bitrate"><strong>Demand: recording bitrate versus live bitrate</strong></h2><p>The demand side has two very different numbers, and confusing them is a common sizing error in fleet video.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="207"><col width="220"><col width="197"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Stream</span></p></th><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Bitrate (one current two-camera unit)</span></p></th><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Where it goes</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Recording, per camera</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">6 to 25 Mbps, depending on quality setting and camera</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Local storage; uploaded later, selectively</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Live view, per camera</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">About </span><a href="https://helpcenter.blackvue.com/hc/en-us/articles/224989027-What-is-BlackVue-Cloud-service-internet-data-usage-?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#0563c1;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">600 kbps</span></a></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Over the cellular uplink, in real time</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The live stream runs at roughly a tenth to a fortieth of the recording rate. That ratio is the whole design: the recording is sized for evidence, the live stream is sized for the link. The usual design, and the one this unit documents, is two encodings at once — a high-bitrate main stream to disk and a low-bitrate substream for live viewing — and only the substream is meant to cross the cellular network live.</p><h2 id="how-many-live-feeds-fit"><strong>How many live feeds fit</strong></h2><p>With both sides in hand, the arithmetic is short. Live video cannot run at 100% of the measured link: packet overhead, retransmission and the adaptive rate control that keeps real-time video alive all need margin. The table below keeps 30% in reserve — a planning assumption, not a sourced figure — and assumes 600 kbps per live feed.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="207"><col width="220"><col width="197"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Sustained upload</span></p></th><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Usable for video (70%)</span></p></th><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Live feeds at 600 kbps</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1 Mbps</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">0.7 Mbps</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2 Mbps</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1.4 Mbps</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">5 Mbps</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3.5 Mbps</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">5</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">9 Mbps</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">6.3 Mbps</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">10</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">20 Mbps (good 5G)</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">14 Mbps</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">23</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Read against the planning floor, the practical answer for a four-camera vehicle on Indian 4G is: <strong>one or two live feeds reliably, all four some of the time.</strong> That is also how live view tends to be used — an operator looks at one camera on one vehicle when something happens, not every camera on every vehicle all day.</p><p>At 600 kbps each, one live feed is about 0.27 GB per hour; four at once is just over 1 GB per vehicle-hour. What that costs across a fleet is a business question, covered in the cost post linked below — not this post's arithmetic.</p><h2 id="everything-else-on-the-same-uplink"><strong>Everything else on the same uplink</strong></h2><p>Live video is not the only thing leaving the vehicle. GPS and telematics data are small. Event clips are not. A 90-second clip recorded at 14 Mbps is about 160 MB, and pushing it at 5 Mbps occupies the whole uplink for roughly four minutes — during which any live feed from that vehicle is starved.</p><p>So the uplink needs a priority order, decided in advance: live view when an operator is actually watching, event clips otherwise, bulk footage never — that last one belongs at the depot, as <a href="https://samvyo.com/blog/store-and-forward-for-fleet-video-keeping-the-footage-the-network-drops?ref=samvyo.com"><u>store-and-forward for fleet video</u></a> explains.</p><h2 id="techniques-that-help-and-one-that-hurts"><strong>Techniques that help, and one that hurts</strong></h2><ul><li><strong>Adaptive bitrate is mandatory.</strong> Real-time video must lower its bitrate as the link weakens rather than fail outright — <a href="https://samvyo.com/blog/webrtc-bandwidth-estimation-why-your-call-downgrades-before-it-drops?ref=samvyo.com"><u>bandwidth estimation is why a call downgrades before it drops</u></a>. On a vehicle it is constantly working.</li><li><strong>A more efficient codec buys headroom, with a catch.</strong> H.265 records the same quality in fewer bits than H.264, but <a href="https://samvyo.com/blog/h-264-vs-h-265-over-webrtc-why-the-storage-codec-breaks-the-live-path?ref=samvyo.com"><u>the storage codec can break the live path</u></a> when browser playback is the destination.</li><li><strong>On-demand switching beats always-on.</strong> Streaming only the camera an operator has open, and only while it is open, turns a four-camera problem into a one-camera problem.</li><li><strong>Simulcast is the wrong trade on a vehicle.</strong> It sends several encodings of the same camera so a server can pick one per viewer — which <a href="https://samvyo.com/blog/what-is-simulcast-and-when-does-it-save-or-waste-bandwidth?ref=samvyo.com"><u>spends uplink to save downlink</u></a>. On a constrained cellular uplink with one or two viewers, that is usually backwards: send one adaptive stream and let the server handle distribution.</li></ul><p>For how those streams travel once they leave the vehicle, <a href="https://samvyo.com/blog/how-fleet-video-streaming-actually-works-the-architecture-between-vehicle-and-command-centre?ref=samvyo.com"><u>the architecture between vehicle and command centre</u></a> walks the full pipeline.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>The recording stream never fits down a moving 4G uplink; live fleet video is always a smaller substream built for the link. Indian 4G averages 6–12 Mbps upstream, but averages hide the stretches where live video stalls, so plan against a low single-digit floor.</p><p>On that floor, one or two live feeds per vehicle are reliable and more is opportunistic. Stream on demand, keep adaptive bitrate on, and keep bulk footage off the cellular link entirely.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>The arithmetic here is per vehicle. Multiplying it across a fleet — data, staff and platform — is the subject of <a href="https://samvyo.com/blog/fleet-video-monitoring-cost-what-it-takes-to-watch-a-fleet-live?ref=samvyo.com"><u>what it takes to watch a fleet live</u></a>.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>How much bandwidth does fleet video need?</strong></p><p>It depends on which stream. Recording runs at roughly 6 to 25 Mbps per camera on one current fleet dashcam, which is why it stays on the vehicle. The live-view stream sent over cellular is much smaller, around 600 kbps per camera, or about 0.27 GB per hour.</p><p><strong>What upload speed does 4G give a vehicle in India?</strong></p><p>Typically around 6 to 12 Mbps on the main private networks, based on TRAI drive tests and Opensignal's crowdsourced data, with 5G much higher where available and BSNL much lower. These are averages; moving vehicles regularly see far less, so plan live video against a low single-digit Mbps floor.</p><p><strong>How many live camera feeds can a truck stream over 4G?</strong></p><p>Reliably one or two, and all four some of the time. At 600 kbps per feed with 30% of the link held in reserve, a 2 Mbps uplink carries two feeds and a 5 Mbps uplink carries five. Most fleets stream only the camera an operator opens, which keeps demand inside that budget.</p><p><strong>Why can't a fleet stream recording-quality video live?</strong></p><p>Because the recording bitrate exceeds the uplink. Two cameras at the lowest documented recording setting of one current unit need 14 Mbps, while TRAI measured 4G-only upload of 4.5 to 9 Mbps. Recorders therefore encode a separate low-bitrate substream for live viewing.</p><p><strong>Should fleet video use simulcast?</strong></p><p>Usually not from the vehicle. Simulcast sends several encodings of one camera so a server can choose per viewer, which costs uplink — the scarcest resource on a truck. Samvyo, based on SFU architecture, can take a single adaptive stream from the vehicle and handle distribution to viewers at the server side, where bandwidth is not the constraint.</p><p><strong>Does 5G solve fleet video bandwidth?</strong></p><p>It raises the ceiling where it is available: TRAI measured 5G-only upload of 23 to 41 Mbps on two operators. But coverage on highways is uneven and operators often keep uplink traffic on slower layers, so a 5G fleet still needs a plan for 4G-level upload. WebRTC-based platforms, Samvyo among them, adapt bitrate to whatever the link sustains, which is how a live feed survives the switch between the two.</p>]]></content:encoded></item><item><title><![CDATA[Fleet Video Monitoring Cost: What It Takes to Watch a Fleet Live]]></title><description><![CDATA[One live camera per vehicle, ten hours a day, is 70 GB of mobile data per vehicle per month and 3.1 million streaming minutes across a 200-vehicle fleet. Live on trigger is under half a gigabyte. Here is the fleet video monitoring cost model: data, people and platform, line by line.]]></description><link>https://www.samvyo.com/blog/fleet-video-monitoring-cost-what-it-takes-to-watch-a-fleet-live</link><guid isPermaLink="false">6abb43738b45c3f0cd63aaf7</guid><category><![CDATA[fleet video]]></category><category><![CDATA[video telematics]]></category><category><![CDATA[cost-benefit analysis]]></category><category><![CDATA[live monitoring]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 30 Sep 2026 13:30:49 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-29--2026--11_50_58-AM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-29--2026--11_50_58-AM.png" alt="Fleet Video Monitoring Cost: What It Takes to Watch a Fleet Live"/><p><em>If you arrived here from the decision guide, you are in the right place. </em><a href="https://samvyo.com/blog/live-fleet-video-vs-recorded-when-a-fleet-actually-needs-a-live-feed?ref=samvyo.com"><em><u>Live fleet video vs recorded</u></em></a><em> worked out which fleet use cases actually need a live feed. This is its companion: what that decision costs to run, line by line.</em></p><p>One live camera per vehicle, streamed ten hours a day, 26 days a month, at the ~600 kbps one current fleet dashcam documents for its live view. That is <strong>70 GB of mobile data per vehicle per month.</strong> Across 200 vehicles, it is 14 TB — and 3.12 million streaming minutes.</p><p>The same fleet running live video only when something happens — say ten events per vehicle a month, ten minutes each — uses under half a gigabyte per vehicle. Roughly <strong>150 times less.</strong></p><p>That gap is the whole of fleet video monitoring cost. The decision guide concluded that most fleets need live on trigger, not live always. This post prices both, so the business case rests on numbers rather than on how impressive a wall of live feeds looks.</p><h2 id="the-three-lines-of-a-live-monitoring-budget"><strong>The three lines of a live monitoring budget</strong></h2><p>Every live fleet video programme pays for the same three things, whoever supplies it.</p><ul><li><strong>Data</strong> — the mobile data each vehicle uses to send live video.</li><li><strong>People</strong> — the operators who watch and respond. A live feed nobody is watching is a recording with a higher bill.</li><li><strong>Platform</strong> — the service that carries the live video to viewers and records it, usually billed by the minute, the viewer or the gigabyte.</li></ul><p>The mix changes completely between the two designs, and the most expensive line is often not the one buyers look at first.</p><h2 id="line-1-mobile-data"><strong>Line 1: mobile data</strong></h2><p>Per camera, the arithmetic is fixed by the stream. At 600 kbps, one live feed is about 0.27 GB per hour; the reasoning behind that number, and why the recording stream never goes live, is in <a href="https://samvyo.com/blog/fleet-video-bandwidth-how-many-camera-feeds-actually-fit-down-a-moving-4g-link?ref=samvyo.com"><u>how many camera feeds fit down a moving 4G link</u></a>.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="291"><col width="167"><col width="167"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Design (per vehicle, per month)</span></p></th><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Live hours</span></p></th><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Mobile data</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Always-on, 1 camera, 10 h × 26 days</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">260</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">70.2 GB</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Always-on, 4 cameras</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1,040 camera-hours</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">280.8 GB</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Live on trigger, 10 events × 10 min</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1.7</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">0.45 GB</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>We deliberately leave a price per GB out of this table. Retail mobile data prices differ by an order of magnitude between countries, and fleet M2M plans are negotiated contracts that are not published. Multiply the data column by your own contracted rate — the rest of the argument does not depend on it.</p><p>The finding is not the price. It is the <strong>ratio</strong>: always-on moves roughly 150 times the data of live on trigger, the platform line scales with the same ratio, and staffing follows it.</p><h2 id="line-2-the-people-who-watch"><strong>Line 2: the people who watch</strong></h2><p>This is the line that decides the business case, and it is the easiest one to leave out of it.</p><p>Always-on live video only has value if someone is watching it. Covering one seat around the clock takes about 4.2 full-time staff (168 hours a week divided by a 40-hour week), before leave, training or supervision. And one person cannot meaningfully watch many feeds at once — <a href="https://samvyo.com/blog/the-operator-to-camera-ratio-that-decides-whether-proactive-monitoring-pays?ref=samvyo.com"><u>the operator-to-camera ratio</u></a> is the constraint that decides whether proactive monitoring pays in fixed-site surveillance, and it transfers directly to a fleet. If an operator can genuinely watch N feeds, a 200-vehicle always-on fleet needs 200 ÷ N seats per shift, each costing 4.2 people.</p><p>Live on trigger inverts the model. Operators are sized to <strong>events</strong>, not feeds. Two hundred vehicles with ten events each a month is 2,000 events; at five minutes of handling each, that is about 167 operator-hours a month — roughly one full-time person's working month (about 173 hours). In practice you still staff for peaks and round-the-clock cover, but the scaling variable is how often something happens, not how many cameras exist.</p><p>The trigger has to come from somewhere, and that is where <a href="https://samvyo.com/blog/why-edge-ai-alone-cant-solve-fleet-video-and-what-the-cloud-layer-needs-to-do?ref=samvyo.com"><u>edge AI in the vehicle and the cloud layer</u></a> earn their place: deciding which moments deserve a human is what keeps the people line small.</p><h2 id="line-3-the-platform"><strong>Line 3: the platform</strong></h2><p>Whatever carries live video from vehicle to operator bills on some combination of minutes, viewers and gigabytes. The volume is what drives it.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="220"><col width="200"><col width="204"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">200-vehicle fleet, per month</span></p></th><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Always-on, 1 camera</span></p></th><th style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Live on trigger</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Publisher minutes</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3,120,000</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">20,000</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Live data from vehicles</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">14 TB</span></p></td><td style="border-left:solid #999999 0.5pt;border-right:solid #999999 0.5pt;border-bottom:solid #999999 0.5pt;border-top:solid #999999 0.5pt;vertical-align:top;padding:3pt 5pt 3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">90 GB</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Three things turn that volume into a bill. Per-minute providers price exactly the first row, and <a href="https://samvyo.com/blog/per-minute-video-pricing-at-scale-what-enterprise-teams-actually-pay?ref=samvyo.com"><u>what enterprise teams actually pay per minute at scale</u></a> covers how quickly those minutes compound. If you run the media servers yourself, cost follows the viewers rather than the vehicles. And every live minute is usually recorded too, so the retention bill grows with it — a question for the retention policy rather than the live budget.</p><p>We deliberately quote no provider rates here. The point is the multiplier: a 150-fold difference in volume, 3.12 million minutes against 20,000, dwarfs any realistic difference between rate cards.</p><h2 id="what-the-budget-buys-honestly"><strong>What the budget buys, honestly</strong></h2><p>A business case needs the other side of the ledger, and here the honest answer is thinner than pitches tend to suggest.</p><p>The use cases where live video changes outcomes — panic alarms, assaults, hijacks, thefts in progress — involve real money. Cargo crime in the US and Canada averaged <a href="https://www.verisk.com/company/newsroom/cargo-theft-losses-surge-to-estimated-$725-million-in-2025-verisk-cargonet-analysis-reveals/?ref=samvyo.com"><u>$273,990 per incident in 2025</u></a>. But we could not find any published, non-vendor measurement of how often live monitoring actually changes the outcome of those incidents. Anyone quoting a prevented-loss percentage should be asked where it comes from.</p><p>What is documented is that the safety gains from fleet cameras come from recorded footage and coaching, which neither design has to pay live rates for. So the defensible business case is narrow: live on trigger buys the ability to respond to rare, expensive, time-critical events, at a data and staffing cost that scales with those events. Always-on buys the same ability at roughly 150 times the volume, plus a staffing model that grows with every camera fitted.</p><p>One more cost belongs in the model even though it has no line in the table: live only works where there is signal, and <a href="https://samvyo.com/blog/why-your-fleet-dashcam-feed-dies-the-moment-the-truck-hits-a-dead-zone?ref=samvyo.com"><u>the feed dies in dead zones</u></a>. Budget for the coverage your routes actually have, not the coverage the contract implies.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Fleet video monitoring cost is driven by one design decision. Always-on live video uses about 150 times the data and minutes of live on trigger, and it forces staffing to scale with cameras rather than with events.</p><p>Price live on trigger for the use cases that need it, keep everything else recorded, and treat any claimed return on always-on live video as unproven until someone shows the data.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>This is the cost half of a pair; its companion, the decision guide linked at the top, sets the scope priced here. For the other half of the fleet video picture — what happens to footage when the live link is gone — <a href="https://samvyo.com/blog/store-and-forward-for-fleet-video-keeping-the-footage-the-network-drops?ref=samvyo.com"><u>store-and-forward for fleet video</u></a> picks up where the live feed stops.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>How much does live fleet video monitoring cost?</strong></p><p>It depends mostly on design. One always-on live camera per vehicle uses about 70 GB of mobile data a month, while live on trigger uses under half a gigabyte for ten ten-minute events. Operator staffing and platform minutes scale with the same ratio, so the design choice outweighs any individual price.</p><p><strong>How much mobile data does a live fleet camera use?</strong></p><p>At a typical live-view bitrate of around 600 kbps, about 0.27 GB per hour per camera. Streaming one camera ten hours a day for 26 days is roughly 70 GB per vehicle per month; four cameras is about 280 GB.</p><p><strong>How many operators does live fleet monitoring need?</strong></p><p>For always-on video, one round-the-clock seat needs about 4.2 full-time staff, and seats scale with the number of feeds each operator can genuinely watch. For live on trigger, staffing scales with events: 2,000 events a month at five minutes each is about 167 operator-hours, roughly one person's working month, before peak cover.</p><p><strong>Is always-on live fleet video worth the cost?</strong></p><p>For most fleets, no. The documented safety gains come from recorded footage and coaching, and no published non-vendor study measures how often live monitoring changes incident outcomes. Live on trigger captures the time-critical use cases at a fraction of the data, minutes and staffing.</p><p><strong>What does a fleet video platform charge for?</strong></p><p>Usually some mix of streaming minutes, viewers and data, plus recording storage. Samvyo, based on SFU architecture, is offered with flat licensing rather than per-minute billing, which changes how the always-on versus on-trigger volume difference shows up in the bill — worth modelling against your own event rates.</p><p><strong>How can a fleet reduce live video monitoring costs?</strong></p><p>Stream live only on triggers such as panic buttons, collision sensors or AI alerts; show operators events rather than walls of feeds; and keep coaching, claims and audits on recorded footage. Keeping the media path, relays and recording on infrastructure you control, as Samvyo allows, also puts the retention side of the bill under your own policy.</p>]]></content:encoded></item><item><title><![CDATA[Air-Gapped Video Conferencing: What Zero Internet Actually Requires]]></title><description><![CDATA[An air gap does not break the call — media never needed the internet. It breaks everything around the call: the certificates a browser demands before it opens a camera, the clock your timestamps depend on, the update path, the licence check. What an isolated deployment actually requires.
]]></description><link>https://www.samvyo.com/blog/air-gapped-video-conferencing-what-zero-internet-actually-requires</link><guid isPermaLink="false">6ab3651e8b45c3f0cd63aac3</guid><category><![CDATA[Self-hosted Video]]></category><category><![CDATA[On-prem Video Conferencing]]></category><category><![CDATA[Video Architecture]]></category><category><![CDATA[data sovereignty]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 23 Sep 2026 05:39:23 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-23--2026--11_07_50-AM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-23--2026--11_07_50-AM.png" alt="Air-Gapped Video Conferencing: What Zero Internet Actually Requires"/><p>Most on-premise video is not air-gapped. On-premise video runs in the customer's data centre and still reaches the internet for certificates, package updates, licence checks, time and telemetry. An air gap removes all of that, and the question that decides a procurement is not whether the video works — it does — but whether everything the video quietly depends on can be rebuilt inside the fence.</p><p>This post walks that list. <strong>Air-gapped video conferencing</strong> fails first at the browser, then at the clock, then at the update path, and almost never at the media. Everything below applies equally to offline video conferencing for one isolated enclave and to a whole estate run that way.</p><h2 id="what-air-gapped-video-conferencing-actually-means"><strong>What air-gapped video conferencing actually means</strong></h2><p>Air-gapped video conferencing is described loosely in most tenders, so start with a definition that procurement can hold you to. NIST's glossary records the <a href="https://csrc.nist.gov/glossary/term/air_gap?ref=samvyo.com"><u>CNSSI 4009 definition of an air gap</u></a> as "an interface between two systems at which (a) they are not connected physically and (b) any logical connection is not automated (i.e., data is transferred through the interface only manually, under human control)."</p><p>Two things follow from that sentence. The first is that no software on the isolated side may assume a route out, however narrow — not a proxy, not "just DNS", not an outbound-only allowance. The second is that the gap is a <strong>human process</strong>, not a technology: every patch, certificate, licence file and exported recording crosses it because a person carried it across, and that person is now part of your threat model.</p><p>There is a sanctioned middle ground. NIST's guide to operational technology security recommends "unidirectional gateways" alongside DMZ architectures to keep traffic from passing directly between corporate and OT networks (<a href="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-82r3.pdf?ref=samvyo.com"><u>NIST SP 800-82r3</u></a>), and asks architects to consider "where physical separation may be required as opposed to logical separation." A one-way path out — logs and recordings leaving, nothing entering — is a common compromise. It is not an air gap, and it should not be sold as one.</p><h2 id="the-call-itself-barely-changes"><strong>The call itself barely changes</strong></h2><p>The media path is the part teams expect to be hard in offline video conferencing, and it is the part that already works. Real-time media has no inherent need for the public internet; it needs a route between endpoints and a server in the middle.</p><p>Connectivity establishment gets simpler, not harder. <a href="https://www.rfc-editor.org/rfc/rfc8445.html?ref=samvyo.com"><u>RFC 8445</u></a> defines a host candidate as "a candidate obtained by binding to a specific port from an IP address on the host," while server-reflexive candidates come from a STUN server and relayed candidates from a TURN server. Inside one routed network with no NAT between clients and the media server, host candidates are enough — the STUN and TURN infrastructure that dominates public deployments has far less to do. Keep TURN where clients sit behind internal firewalls or on segmented VLANs; drop the assumption that you need a public relay address.</p><p>Encryption is unaffected, and this is the first place an air gap surprises people pleasantly. <a href="https://www.rfc-editor.org/rfc/rfc8827?ref=samvyo.com"><u>RFC 8827</u></a> requires that "all media channels MUST be secured via SRTP," and media encryption does not depend on a public certificate authority: <a href="https://www.rfc-editor.org/rfc/rfc8122.html?ref=samvyo.com"><u>RFC 8122</u></a> exists precisely because for many hosts "self-signed certificates are usually the only option," and lets endpoints publish "a secure hash of their certificate, known as the 'certificate fingerprint', within the session description," so that "end hosts can trust even self-signed certificates" when the signalling is integrity-protected. The media plane is fine offline. The signalling plane is where the certificate problem lands.</p><h2 id="the-browser-breaks-before-the-media-does"><strong>The browser breaks before the media does</strong></h2><p>A browser will not open a camera on a page it does not consider secure. `getUserMedia()` "is only available in secure contexts," and if the document is not loaded securely "the `navigator.mediaDevices` property is `undefined`, making access to `getUserMedia()` impossible" (<a href="https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia?ref=samvyo.com"><u>MDN, MediaDevices.getUserMedia</u></a>). On an isolated network there is no public CA that will issue for your internal hostnames, and no ACME challenge that can be validated. So you run your own certificate authority — and inherit its whole lifecycle:</p><ul><li><strong>Root distribution.</strong> The internal root must be installed and trusted on every browser, desktop, mobile device and kiosk that will ever join a call. Devices that arrive later, or get reimaged, arrive broken.</li><li><strong>Revocation that resolves.</strong> <a href="https://www.rfc-editor.org/rfc/rfc5280.html?ref=samvyo.com"><u>RFC 5280</u></a> defines the CRL distribution points extension, which "identifies how CRL information is obtained" via URIs such as HTTP or LDAP. Those URIs must point inside the air gap. A certificate whose CRL lives on the internet fails closed, slowly and confusingly.</li><li><strong>Expiry as a scheduled outage.</strong> With no automated renewal, certificate expiry is a date in a calendar. Short-lived certificates are good security practice and bad air-gap practice unless the renewal runs entirely inside.</li><li><strong>Hostnames and DNS.</strong> Internal DNS has to resolve the names on the certificates, and clients must not be configured with resolvers they cannot reach.</li></ul><p>None of this is exotic, and all of it is work that the deployment plan usually assigns to nobody. It is also the most common reason an air-gapped pilot stalls in week one with cameras that will not turn on.</p><h2 id="time-has-no-upstream"><strong>Time has no upstream</strong></h2><p>Air-gapped video conferencing has no upstream clock: an isolated network cannot reach a public time source, and time is not a cosmetic detail when the deployment exists to record things. In NTP, "primary servers are assigned stratum one" and a primary server is "synchronized to a reference clock directly traceable to UTC (e.g., GPS, Galileo, etc.)" (<a href="https://www.rfc-editor.org/rfc/rfc5905.html?ref=samvyo.com"><u>RFC 5905</u></a>). That is the substitute: a local stratum-1 appliance with its own GNSS receiver, serving the isolated network. The US government distributes UTC "via the GPS signal in space with a time transfer accuracy relative to UTC(USNO) of ≤30 nanoseconds, 95% of the time" (<a href="https://www.gps.gov/gps-accuracy?ref=samvyo.com"><u>GPS.gov</u></a>), which is orders of magnitude better than any recording needs.</p><p>The failure mode without it is quiet. Servers free-run, drift apart by seconds and then minutes, and every recording carries a timestamp that cannot be reconciled with anything outside the room — which is exactly the problem that <a href="https://samvyo.com/blog/evidentiary-video-recording-timestamps-retention-and-export-that-hold-up-later?ref=samvyo.com"><u>timestamps, retention and export that hold up later</u></a> are meant to avoid. If a GNSS antenna cannot be installed, the honest fallback is a disciplined local reference plus a written, signed record of its offset against a trusted clock, taken on a schedule.</p><h2 id="air-gapped-video-conferencing-re-homes-everything-that-phones-home"><strong>Air-gapped video conferencing re-homes everything that phones home</strong></h2><p>The rest of the work is an inventory exercise. Every dependency that normally reaches out has to be replaced with something inside, or removed.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="175"><col width="212"><col width="237"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What normally reaches the internet</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What it does</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What replaces it inside</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Certificate issuance</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Public CA issues and renews TLS certificates</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Internal CA, root distributed to every device, CRL hosted internally</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Time synchronisation</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Public NTP pool</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Local stratum-1 server with a GNSS reference clock</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">OS and package updates</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Distribution mirrors, container registries</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Internal mirror and registry, loaded by hand on a schedule</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Licence activation</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Vendor licence server check-in</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Offline licence file, issued per term and re-issued by hand</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Telemetry and crash reporting</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Vendor endpoints</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Disabled, or written to local storage and exported deliberately</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">TURN relay candidates</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Public relay addresses for NAT traversal</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Internal TURN only where segmentation requires it; host candidates otherwise</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Model and feature updates</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Downloaded AI models, remote inference</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Models shipped with the release; anything remote is simply unavailable</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Two entries on that list are worth dwelling on. Updates become a change-control event with a physical step, so the realistic patch cadence is monthly or quarterly, not continuous — and the media that carries them is, by the CNSSI definition above, the only automated-free path across the gap and therefore the main thing an attacker would target. And licensing is a commercial question, not a technical one: a vendor that only sells per-minute, metered access cannot serve a network that can never report usage.</p><h2 id="what-you-still-owe-gap-or-no-gap"><strong>What you still owe, gap or no gap</strong></h2><p>Isolation is a security control. It is not a compliance answer, and it does not reduce what a recording has to prove. Hashes, access logs, immutable storage and a defensible export path are all still required, for the same reasons set out in <a href="https://samvyo.com/blog/video-chain-of-custody-why-a-record-button-isnt-one?ref=samvyo.com"><u>why a record button is not a chain of custody</u></a>. If anything, the air gap makes export the sharp edge: the copy that leaves for an auditor, a regulator or a court crosses the boundary by hand, and that transfer needs the same hash-and-log discipline as everything before it.</p><p>Storage arithmetic does not change either — retention still multiplies by bitrate and camera count, and there is no elastic tier to fall back on when the array fills. The <a href="https://samvyo.com/blog/self-hosted-video-cost-what-running-it-yourself-actually-costs?ref=samvyo.com"><u>cost of running it yourself</u></a> is the right baseline, plus hardware you cannot scale on demand and a support model that cannot reach in.</p><h2 id="where-the-air-gap-actually-helps-and-where-it-does-not"><strong>Where the air gap actually helps, and where it does not</strong></h2><p>It helps with one specific class of problem: foreign-jurisdiction disclosure, vendor access and unaudited outbound data. A system with no route out cannot be compelled through its provider's remote access, because there is none — which is the sharpest version of the argument in <a href="https://samvyo.com/blog/video-data-residency-where-your-media-legally-has-to-live?ref=samvyo.com"><u>where your media legally has to live</u></a>.</p><p>It does not help with the insider, the contractor with a USB stick, or the badly configured internal firewall that quietly bridges two segments. And it costs you the things connectivity pays for: rapid patching, vendor diagnostics, remote support and anything that depends on a service you do not run. Most organisations that ask for an air gap need it for one enclave, not for the whole estate — and the right answer is usually a small isolated deployment beside a conventional one, not the whole platform pushed offline.</p><h2 id="build-buy-or-deploy"><strong>Build, buy, or deploy</strong></h2><p>Building on open source is the default assumption for air-gapped work, and it is viable — <a href="https://samvyo.com/blog/self-hosted-video-architecture-what-you-actually-run-to-self-host-real-time-video?ref=samvyo.com"><u>the component list you would run</u></a> does not change offline, though every one of those components now needs an internal update path. The trade is engineering time, forever.</p><p>Buying SaaS is simply out. A metered, hosted service cannot run on a network that cannot reach it.</p><p>Samvyo supports fully air-gapped deployment, with the media path, TURN and recording running on your hardware inside the boundary, based on SFU architecture and resilient by design. Two conditions are worth knowing before you scope it: it is available under a licensing agreement rather than the pay-per-use plan, because usage cannot be metered across an air gap; and a fully offline deployment is set up under a specific commercial and legal agreement rather than a standard contract. Where it does not fit: if your requirement is really "keep data in-country" rather than "no route out," a conventional on-premise or regional deployment is cheaper and easier to operate — a conventional on-premise video deployment is cheaper to operate and easier to support.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Air-gapped video conferencing is rarely blocked by the video itself. Media works offline; encryption works offline; connectivity gets simpler. What breaks is the supporting cast — certificates the browser insists on, a clock with no upstream, updates with no mirror, licences with no check-in — and each of those has a known substitute that somebody has to own.</p><p>Scope air-gapped video conferencing by inventorying every outbound dependency before you scope the media servers. The list is longer than the video, and it is where the project actually lives.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>For which component sees cleartext media in any deployment, read </em><a href="https://samvyo.com/blog/video-deployment-architecture-where-the-media-flows-and-what-you-can-prove?ref=samvyo.com"><em><u>where the media flows and what you can prove</u></em></a><em>. For the wider choice this sits at the end of, see </em><a href="https://samvyo.com/blog/video-deployment-models-on-prem-managed-cloud-or-saas-and-your-data-story?ref=samvyo.com"><em><u>on-prem, managed cloud or SaaS and your data story</u></em></a><em>.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What is air-gapped video conferencing?</strong></p><p>It is video conferencing running on a network with no connection to the internet at all — no proxy, no outbound-only route. NIST records the CNSSI definition of an air gap as an interface where two systems are not physically connected and any logical connection is manual, under human control. In practice it means the media servers, signalling, TURN, recording, storage, certificate authority and time source all live inside the isolated network.</p><p><strong>Does WebRTC work without an internet connection?</strong></p><p>Yes. WebRTC needs a route between endpoints, not a route to the internet. On a single routed network, ICE host candidates are usually enough, and STUN and TURN matter only where internal segmentation or firewalls sit between clients and the media server.</p><p><strong>Why does the camera not work on our internal video site?</strong></p><p>Almost always the secure-context rule. Browsers expose getUserMedia only in secure contexts; on a page that is not loaded securely, navigator.mediaDevices is undefined. On an isolated network you need an internal certificate authority, certificates for your internal hostnames, and that root trusted on every device.</p><p><strong>How do you keep time in sync on an air-gapped network?</strong></p><p>With a local stratum-1 time server driven by a GNSS receiver. RFC 5905 defines a primary server as one synchronised to a reference clock directly traceable to UTC. Without it, servers free-run and recording timestamps stop being defensible.</p><p><strong>Is an air gap the same as data residency?</strong></p><p>No. Residency is about where data is stored; an air gap is about whether anything can reach it. An air gap answers a disclosure and remote-access risk that a region setting does not, and it is a much heavier operating burden. Most teams asking for one actually need in-country storage with no vendor access.</p><p><strong>Can Samvyo run fully air-gapped?</strong></p><p>Yes — technically Samvyo supports a fully air-gapped setup, with media, TURN and recording running on customer-controlled hardware and resiliency built in. It is offered under a licensing agreement rather than the pay-per-use plan, since usage cannot be metered offline, and a fully offline deployment is arranged under a specific commercial and legal agreement.</p>]]></content:encoded></item><item><title><![CDATA[Video Data Residency: Where Your Media Legally Has to Live]]></title><description><![CDATA[Video data residency usually gets answered with a region dropdown. That covers the bucket — not the relay, the recorder, the backup copy or the transcription service. What EU, US and Indian law actually require about where video lives, and what in-country has to include.
]]></description><link>https://www.samvyo.com/blog/video-data-residency-where-your-media-legally-has-to-live</link><guid isPermaLink="false">6ab29d7f8b45c3f0cd63aaab</guid><category><![CDATA[video compliance]]></category><category><![CDATA[data sovereignty]]></category><category><![CDATA[data residency]]></category><category><![CDATA[Self-hosted Video]]></category><category><![CDATA[video recording infrastructure]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 23 Sep 2026 05:39:19 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-22--2026--08_56_08-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-22--2026--08_56_08-PM.png" alt="Video Data Residency: Where Your Media Legally Has to Live"/><p>Most video data residency questions get answered with a region dropdown. The dropdown covers the storage bucket.</p><p>It does not cover the relay the call went through, the server that recorded it, the replica written to another region for durability, or the transcription service that turned it into text. Video data residency — the requirement that media and the personal data around it stay within a particular jurisdiction — is a property of every component that touches the media, and the law behind it varies far more than most teams assume. This post sets out what the EU, US and India actually require, from the legal text, and then what "in-country" has to include. It describes how the rules read, not legal advice for a specific case.</p><h2 id="what-video-data-residency-law-actually-requires"><strong>What video data residency law actually requires</strong></h2><p>The three regimes approach location in three different ways.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="100"><col width="262"><col width="262"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Jurisdiction</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The general rule</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Where a location mandate exists</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">EU</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No general requirement to store in the EU. Transfers outside it need a legal basis under the GDPR's transfer rules.</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Indirectly, where no transfer basis is available</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">US</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No general residency law.</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Sector and contract requirements; nothing that applies to video generally</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">India</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">DPDP Act allows transfers except to countries the government restricts.</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Sector rules — e.g. RBI requires V-CIP recordings to be stored in India</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The details of video data residency are what decide an architecture. Start with the regime most often misread as a storage mandate.</p><h2 id="eu-the-gdpr-regulates-transfers-not-storage"><strong>EU: the GDPR regulates transfers, not storage</strong></h2><p>The GDPR does not say personal data must be stored in the EU. It says data leaving the EU needs a basis under Chapter V: an adequacy decision for the destination, or safeguards such as standard contractual clauses under Article 46.</p><p>For the US, the relevant adequacy decision is the <a href="https://eur-lex.europa.eu/eli/dec_impl/2023/1795/oj/eng?ref=samvyo.com"><u>EU-US Data Privacy Framework</u></a>, adopted in July 2023. It is narrower than it sounds. The European Data Protection Board's <a href="https://www.edpb.europa.eu/system/files/2023-07/edpb_informationnoteadequacydecisionus_en.pdf?ref=samvyo.com"><u>information note</u></a> is explicit that "transfers to entities in the US which are not included in the 'Data Privacy Framework List' cannot be based on the Adequacy Decision and will require appropriate data protection safeguards … in accordance with Article 46 GDPR."</p><p>In practice, that makes EU residency a design choice rather than a legal mandate for most organisations. Keeping video in the EU avoids the transfer question entirely; sending it to a US provider is lawful if that provider is on the DPF list or the right safeguards are in place. The obligation is to know which one applies — for every component that receives the data.</p><h2 id="us-no-general-residency-rule-%E2%80%94-and-reach-regardless-of-location"><strong>US: no general residency rule — and reach regardless of location</strong></h2><p>US federal law has no general rule about where video must be stored. Location requirements that do exist come from specific sectors, government contracts or customer agreements, not from a law that applies to video as such.</p><p>What US law does have is reach. Under <a href="https://www.law.cornell.edu/uscode/text/18/2713?ref=samvyo.com"><u>18 U.S.C. § 2713</u></a>, covered providers must disclose data within their "possession, custody, or control, regardless of whether such communication, record, or other information is located within or outside of the United States." That is the reason storing data in-country is not the same as controlling it — the argument made in <a href="https://samvyo.com/blog/video-deployment-models-on-prem-managed-cloud-or-saas-and-your-data-story?ref=samvyo.com"><u>what each deployment model lets you claim</u></a>.</p><h2 id="india-open-by-default-mandated-by-sector"><strong>India: open by default, mandated by sector</strong></h2><p>India's general law is permissive on location — there is no blanket data localization rule for video. Section 16(1) of the <a href="https://www.meity.gov.in/static/uploads/2024/06/2bf1f0e9f04e6fb4f8fef35e82c42aa5.pdf?ref=samvyo.com"><u>Digital Personal Data Protection Act, 2023</u></a> lets the Central Government "restrict the transfer of personal data by a Data Fiduciary for processing to such country or territory outside India as may be so notified." Transfers are allowed unless a destination is restricted — the reverse of a storage mandate.</p><p>The mandates come from sector regulators, and the Reserve Bank of India is the most specific:</p><ul><li><strong>Video KYC.</strong> The RBI's <a href="https://www.rbi.org.in/commonman/Upload/English/Notification/PDFs/MD18KYCF6E92C82E1E1419D87323E3869BC9F13.pdf?ref=samvyo.com"><u>Master Direction on KYC</u></a> requires that "the entire data and recordings of V-CIP shall be stored in a system / systems located in India." For a bank's video verification calls, residency is not a preference; it is the rule.</li><li><strong>Payment data.</strong> A separate RBI direction from April 2018 requires payment system operators to ensure "the entire data relating to payment systems operated by them is stored in a system only in India," and where processing happens abroad, the <a href="https://www.rbi.org.in/commonman/english/scripts/FAQs.aspx?Id=2995&ref=samvyo.com"><u>RBI's FAQ</u></a> says the data "should be deleted from the systems abroad and brought back to India not later than the one business day or 24 hours from payment processing, whichever is earlier." It applies to payment data rather than video, but it shows how strictly the RBI defines "in India" — including processing abroad.</li></ul><p>The consent, notice and retention obligations that sit alongside these location rules are covered in <a href="https://samvyo.com/blog/video-recording-compliance-across-the-eu-us-and-india-what-each-regime-demands?ref=samvyo.com"><u>what each recording regime demands</u></a>.</p><p>Across all three regimes, one question decides video data residency compliance: which components actually hold or process the data.</p><h2 id="video-data-residency-is-a-property-of-every-component"><strong>Video data residency is a property of every component</strong></h2><p>A video call touches more systems than the storage bucket. Each one below holds media or personal data, and each has its own location.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="150"><col width="225"><col width="250"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Component</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What it holds</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What "in-country" requires</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Media servers (SFU)</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Live audio and video, decrypted in memory</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Media servers in-country for every call that must stay in-country</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">TURN relays</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Encrypted media plus connection metadata</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Relays in-country — a relay abroad sends the traffic abroad</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Recorder</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Decrypted media while recording</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Recording workers in-country</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Storage</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The recording at rest</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Bucket or storage in-country</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Replicas and backups</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Copies of the recording</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No replication or backup to another region</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Transcription and AI</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Audio or video sent for processing, plus transcripts</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Processing in-country, or excluded from regulated recordings</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Playback and CDN</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cached copies for viewing</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Delivery nodes in-country, or no CDN caching</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Logs and metadata</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Participant names, IDs, IPs, timings</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Log storage in-country where it counts as personal data</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Support access</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Anything an administrator can view</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Remote access from abroad is itself a question to answer</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Two rows are where residency most often breaks without anyone noticing.</p><p>The first is <strong>relays</strong>. When a user cannot connect directly, media goes through TURN, and if the nearest relay a provider offers is in another country, that call's media has left — even though the servers and storage are local. Relay placement and its cost are in <a href="https://samvyo.com/blog/the-turn-bill-the-self-hosted-video-cost-nobody-forecasts?ref=samvyo.com"><u>The TURN Bill</u></a>.</p><p>The second is <strong>replicas</strong>. Durability features copy data elsewhere by design. On S3, cross-region replication is opt-in — AWS describes it as copying "objects across Amazon S3 buckets in different AWS Regions" for buckets "configured for object replication" — which makes it easy to check, and also easy for someone to turn on later. A residency requirement should include a control that stops replication and backup outside the jurisdiction, not only a note that none is configured today.</p><p>The full inventory of components behind a self-hosted deployment is laid out in <a href="https://samvyo.com/blog/self-hosted-video-architecture-what-you-actually-run-to-self-host-real-time-video?ref=samvyo.com"><u>what you actually run to self-host real-time video</u></a>.</p><h2 id="how-to-show-that-data-is-resident"><strong>How to show that data is resident</strong></h2><p>A video data residency claim is only as good as the evidence behind it, and the evidence is specific:</p><ul><li><strong>Configuration.</strong> The regions of media servers, relays, recorders, storage and any processing service — and the replication and backup settings for each.</li><li><strong>Session records.</strong> For each call, which media server and which relay were actually used. WebRTC statistics record the selected path and relay candidate, as set out in <a href="https://samvyo.com/blog/video-deployment-architecture-where-the-media-flows-and-what-you-can-prove?ref=samvyo.com"><u>where the media flows and what you can prove</u></a>.</li><li><strong>Network records.</strong> Flow logs or firewall logs showing where media traffic went.</li><li><strong>The subprocessor list, with locations.</strong> Every third party that receives media or metadata, and where it processes it.</li></ul><p>If any of those cannot be produced, the honest answer to "is our video stored in-country?" is "the recordings are" — which is a narrower claim than most questionnaires are asking for.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Video data residency law is less uniform than the phrase suggests. The EU regulates transfers rather than storage; the US has no general rule but reaches data regardless of location; India is permissive by default and strict by sector, with RBI requiring V-CIP recordings to be stored in India.</p><p>Whatever the rule, residency applies to every component that touches the media — relays, recorders, replicas, transcription and logs included — not just to the bucket.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>For why in-country storage is not the same as control, read </em><a href="https://samvyo.com/blog/video-deployment-models-on-prem-managed-cloud-or-saas-and-your-data-story?ref=samvyo.com"><em><u>what each deployment model lets you claim</u></em></a><em>. For the consent, notice and retention rules that sit alongside location, see </em><a href="https://samvyo.com/blog/video-recording-compliance-across-the-eu-us-and-india-what-each-regime-demands?ref=samvyo.com"><em><u>what each recording regime demands</u></em></a><em>.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What is video data residency?</strong></p><p>It is the requirement that video, recordings and the personal data around them stay within a particular jurisdiction. In practice it applies to every component that handles the media — media servers, TURN relays, recorders, storage, backups, transcription and logs — not only to where recordings are stored.</p><p><strong>Does the GDPR require video data to be stored in the EU?</strong></p><p>No. The GDPR regulates transfers outside the EU rather than mandating EU storage. Transfers need a basis such as an adequacy decision or Article 46 safeguards. For the US, the Data Privacy Framework covers only organisations on its list; others need safeguards like standard contractual clauses.</p><p><strong>Is there a US data residency law for video?</strong></p><p>Not a general one. Location requirements come from specific sectors, government contracts and customer agreements. Separately, 18 U.S.C. § 2713 requires covered providers to disclose data in their possession, custody or control regardless of where it is stored.</p><p><strong>Does India require video data to be stored in India?</strong></p><p>Not generally. The DPDP Act allows transfers except to countries the government restricts. Sector rules can require it: the RBI requires the entire data and recordings of V-CIP video KYC sessions to be stored in systems located in India.</p><p><strong>Can a TURN server break video data residency?</strong></p><p>Yes. If a user's media is relayed through a TURN server in another country, that call's media leaves the jurisdiction even when the media servers and storage are local. Residency requires relays in-country, not just servers.</p><p><strong>How do I prove my video data stays in-country?</strong></p><p>Keep the region configuration of every component, per-session records of which media server and relay were used, network flow logs, and a subprocessor list with processing locations. Without those, a residency claim covers only the components you can show.</p><p><strong>Can we keep media, relays and recordings in our own jurisdiction?</strong></p><p>Yes, if they run on infrastructure you control. Samvyo keeps the media path, TURN and recording on your infrastructure, so each can be placed in the jurisdiction your rules require. Replication, backup and any third-party processing remain decisions to configure and document.</p>]]></content:encoded></item><item><title><![CDATA[The Recording Architecture Audit: Six Things Your Pipeline Has to Prove]]></title><description><![CDATA[Checkout the business version of this blog to fully understand the business side of this play.

An auditor will not ask whether you recorded the call. You obviously did — the file is right there.

They will ask you to prove six things about that file: that it is complete, when it was made, that it has not changed, that nobody could have removed it, who has touched it since, and that the copy you hand over is the same thing. A file in a bucket answers none of those. Every answer is a piece of evi]]></description><link>https://www.samvyo.com/blog/the-recording-architecture-audit-six-things-your-pipeline-has-to-prove</link><guid isPermaLink="false">6ab28b628b45c3f0cd63a9d8</guid><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 23 Sep 2026 05:39:14 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-22--2026--07_45_36-PM.png" medium="image"/><content:encoded><![CDATA[<blockquote>Checkout the <a href="https://samvyo.com/blog/video-recording-compliance-across-the-eu-us-and-india-what-each-regime-demands?ref=samvyo.com" rel="noreferrer">business version</a> of this blog to fully understand the business side of this play.</blockquote><img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-22--2026--07_45_36-PM.png" alt="The Recording Architecture Audit: Six Things Your Pipeline Has to Prove"/><p>An auditor will not ask whether you recorded the call. You obviously did — the file is right there.</p><p>They will ask you to prove six things about that file: that it is complete, when it was made, that it has not changed, that nobody could have removed it, who has touched it since, and that the copy you hand over is the same thing. A file in a bucket answers none of those. Every answer is a piece of evidence the pipeline had to produce at the moment it did the work, and a recording architecture audit is where you find out which ones it never produced.</p><p>This post walks the pipeline stage by stage and names the evidence each one owes. Recorder pools, scaling and storage tiers are covered in <a href="https://samvyo.com/blog/video-recording-architecture-what-runs-behind-the-pipeline-at-scale?ref=samvyo.com"><u>the recording pipeline at scale</u></a>; this is about what that pipeline has to be able to prove.</p><h2 id="what-a-recording-architecture-audit-actually-asks"><strong>What a recording architecture audit actually asks</strong></h2><p>The legal root is short. <a href="https://www.law.cornell.edu/rules/fre/rule_901?ref=samvyo.com"><u>Federal Rule of Evidence 901(a)</u></a> requires "evidence sufficient to support a finding that the item is what the proponent claims it is." One of the listed ways to meet it, 901(b)(9), is "evidence describing a process or system and showing that it produces an accurate result."</p><p>That clause is the design brief. You do not prove a recording by pointing at it; you prove it by describing the system that made it and showing the system is reliable. India's <a href="https://www.mha.gov.in/sites/default/files/2024-04/250882_english_01042024_0.pdf?ref=samvyo.com"><u>Bharatiya Sakshya Adhiniyam, 2023</u></a> has the same shape: section 63 requires a certificate that identifies the electronic record and describes the manner in which it was produced. If you want the legal side in full, start with <a href="https://samvyo.com/blog/video-chain-of-custody-why-a-record-button-isnt-one?ref=samvyo.com"><u>what a chain of custody actually is</u></a>. What follows is the engineering side.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="187"><col width="275"><col width="162"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The auditor asks</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What proves it</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Stage that owes it</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Is it complete?</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Numbered segments, a manifest, gaps recorded as data</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Capture</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">When was it made?</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Media-to-wall-clock mapping, plus an independent timestamp</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Capture + manifest</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Has it changed?</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Hashes written at capture and chained together</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Write path</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Could it have been removed?</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Retention no administrator can shorten</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Storage</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Who has touched it?</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">An access log that is itself tamper-evident</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Access</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Is this copy the original?</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">An export package that carries its own proof</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Export</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>None of those can be bolted on after the incident. Start with the first.</p><h2 id="completeness-prove-nothing-is-missing"><strong>Completeness: prove nothing is missing</strong></h2><p>A recording that silently lost forty seconds is worse than one that visibly did, and completeness is the first thing a recording architecture audit checks. A gap you disclose is a fact. A gap the other side finds is a credibility problem for every other file you hold.</p><p>The fix is structural. Write the recording as numbered segments of a few seconds each, and append each one to a manifest as it lands. If the recorder crashes, the manifest shows exactly where the sequence stopped; when it restarts, it opens a new sequence that records the gap, its duration and the reason. Missing time becomes an entry in the evidence rather than an absence in it.</p><p>The recorder model changes how much a single failure costs. Composite recorders render the call in a browser and encode the screen — <a href="https://github.com/jitsi/jibri?ref=samvyo.com"><u>Jibri</u></a> works "by launching a Chrome instance rendered in a virtual framebuffer and capturing and encoding the output with ffmpeg," and "only one recording at a time is supported on a single jibri." When that instance dies, the whole session's recording dies with it. Per-track capture writes each participant's media as it arrives — <a href="https://docs.livekit.io/home/egress/overview/?ref=samvyo.com"><u>LiveKit's track egress</u></a> with the passthrough preset "writes the track in its native container" — so a failure costs one track, not the session.</p><p>That is not the only difference between the two, and not the largest one for compliance. The bigger consequence — whether you can redact — belongs to <a href="https://samvyo.com/blog/composite-vs-per-track-recording-the-choice-that-decides-whether-you-can-redact?ref=samvyo.com"><u>composite vs per-track recording</u></a>.</p><p>A complete set of segments still has to say when it was recorded. The timestamp inside the media is not that.</p><h2 id="time-the-media-clock-is-not-the-wall-clock"><strong>Time: the media clock is not the wall clock</strong></h2><p>Real-time media carries RTP timestamps, and <a href="https://datatracker.ietf.org/doc/html/rfc3550?ref=samvyo.com"><u>RFC 3550</u></a> is explicit about what they are not: "RTP timestamps from different media streams may advance at different rates and usually have independent, random offsets." An RTP timestamp tells you how far apart two frames were. It does not tell you what time it was.</p><p>The bridge is the RTCP sender report, which pairs a wall-clock NTP timestamp with the RTP timestamp that corresponds to the same instant (RFC 3550, section 6.4.1). A recorder that keeps those pairs alongside its segments can map every frame to clock time and re-align per-track files later. A recorder that throws them away has files that can be played but not placed in time — and a recording architecture audit will ask exactly where each frame sits in time. Surveillance deployments hit the same problem across cameras, which is <a href="https://samvyo.com/blog/multi-camera-synchronization-why-your-four-angles-drift-out-of-alignment?ref=samvyo.com"><u>why four angles drift out of alignment</u></a>.</p><p>Two more requirements finish the job:</p><ul><li><strong>The recorder's own clock is disciplined and its offset is logged.</strong> A mapping to a wrong clock is precise and useless.</li><li><strong>An independent, trusted timestamp seals the manifest.</strong> A time-stamping authority under <a href="https://www.rfc-editor.org/rfc/rfc3161?ref=samvyo.com"><u>RFC 3161</u></a> provides "proof that a datum existed before a particular time," and it timestamps only a hash — the TSA is required "not to examine the imprint being time-stamped in any way (other than to check its length)." The media never leaves your infrastructure, and one request per manifest is enough.</li></ul><p>Knowing when a recording was made only matters if you can show it has not changed since.</p><h2 id="integrity-hash-the-chain-not-just-the-file"><strong>Integrity: hash the chain, not just the file</strong></h2><p>The common approach is to compute a SHA-256 hash of each file at write time and store it somewhere else. That catches modification: change one byte and the hash no longer matches. It does not catch deletion, which is where many pipelines fail a recording architecture audit. Remove a segment and its entry in the hash list, and what is left is internally consistent.</p><p>The fix is to chain them. Each segment's record includes the hash of the record before it, so deleting or reordering one breaks every link after it. This is a known, working pattern: <a href="https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-log-file-validation-intro.html?ref=samvyo.com"><u>AWS CloudTrail's log file validation</u></a> hashes every log file, writes an hourly digest of those hashes, signs it, and "each digest file also contains the digital signature of the previous digest file," which makes it "computationally infeasible to modify, delete or forge CloudTrail log files without detection." Apply the same structure to recordings: segment hashes roll up into a per-session manifest, the manifest is signed, and each manifest points at the one before.</p><p>At archive scale — years of sessions — a Merkle tree does the same job more efficiently. <a href="https://www.rfc-editor.org/rfc/rfc6962?ref=samvyo.com"><u>RFC 6962</u></a>, the Certificate Transparency spec, uses one to show "that any particular version of the log is a superset of any particular previous version," and an audit path proves a single entry exists in the tree without handing over the rest. For recordings, that means proving one session belongs to an untampered archive without disclosing every other session in it.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="175"><col width="112"><col width="112"><col width="112"><col width="112"/></col></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Approach</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Detects edits</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Detects deletion</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Detects reordering</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Proves one item cheaply</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Per-file hash</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Hash chain</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No — replay the chain</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Merkle tree</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes — audit path</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Detection is half the problem. The other half is making the deletion impossible, and the most common setting for that does not do what teams think it does.</p><h2 id="immutability-the-worm-setting-that-doesnt-protect-you"><strong>Immutability: the WORM setting that doesn't protect you</strong></h2><p><a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html?ref=samvyo.com"><u>S3 Object Lock</u></a> has two retention modes, and the difference between them is the whole question an auditor asks.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="125"><col width="281"><col width="218"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Mode</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What AWS documents</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The auditor's question answered</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Governance</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Users can't delete or alter lock settings "unless they have special permissions" — anyone with s3:BypassGovernanceRetention can</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Who can delete this early? Anyone granted one IAM permission</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Compliance</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Can't be overwritten or deleted "by any user, including the root user"; the retention period "can't be shortened"</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Who can delete this early? Nobody, short of deleting the account</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Governance mode is what gets switched on, because it is reversible and safe to test. It then gets described as WORM in the compliance questionnaire. That is a policy, not immutability, and the distinction is exactly what the recording architecture audit question "who can delete this before retention ends?" is designed to find.</p><p>Compliance mode has a real cost, and it is worth stating plainly. A wrong retention period cannot be fixed: set ten years on the wrong prefix and you store that data for ten years. The workable pattern is to test in governance mode, move production to compliance mode, and set retention per class of record rather than per bucket. Litigation is handled separately with a legal hold, which "doesn't have an associated fixed amount of time and remains in effect until removed." On-premise object stores offer equivalents; ask them the same question.</p><p>That settles who can delete a recording. It leaves who can read one.</p><h2 id="the-access-log-is-evidence-too"><strong>The access log is evidence too</strong></h2><p>Every play, download, export, retention change and legal hold is an event the audit will ask about: who, when, which object, from where. A log kept in the same place, editable by the same administrator, proves nothing about that administrator.</p><p>So the log gets the same treatment as the recordings: chained hashes, a separate store with its own lock, and no write path from the people it records. CloudTrail validation covers this for calls to the storage API. It does not cover your application — a support agent pressing play inside your own dashboard is invisible to it — so application-level access needs its own log, built the same way.</p><p>Everything so far lives inside your system. The final test happens outside it.</p><h2 id="passing-a-recording-architecture-audit-the-export-package"><strong>Passing a recording architecture audit: the export package</strong></h2><p>The copy you hand over is what gets examined, so the copy has to carry its own proof. The forensic video community is specific about format. <a href="https://www.swgde.org/wp-content/uploads/2025/03/2025-02-28-Best-Practices-for-Data-Acquisition-from-Digital-Video-Recorders-17-V-002-1.3.pdf?ref=samvyo.com"><u>SWGDE's guidance on acquiring video from recorders</u></a> states that "a native file format or proprietary file format is likely to provide best evidence for legal authenticity purposes as it is closest to the original manner of recording." A convenient MP4 is fine as a working copy. It is not the evidence.</p><p>Nor can the file vouch for itself. <a href="https://www.swgde.org/documents/published-complete-listing/23-v-001-best-practices-for-digital-video-authentication/?ref=samvyo.com"><u>SWGDE's video authentication guidance</u></a> warns that metadata "is susceptible to alteration without affecting the playback of the file" and "cannot be relied upon in isolation." The proof travels beside the file:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="262"><col width="362"/></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">In the package</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What it proves</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Native segments or per-track files</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Closest to the original recording</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Manifest with segment hashes and recorded gaps</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Completeness</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Sender-report timing pairs and recorder clock offset</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">When each frame happened</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">RFC 3161 timestamp tokens</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Time, independent of your own clock</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Chain or Merkle proof for the session</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Nothing changed, nothing removed</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Verified extract of the access log</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Who touched it</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A hash of the package itself</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The copy is the copy</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Both legal systems ask for the same number at the end. In the US, <a href="https://www.law.cornell.edu/rules/fre/rule_902?ref=samvyo.com"><u>Rule 902(14)</u></a> lets copied data self-authenticate "by a process of digital identification," and the Committee Notes explain this is "ordinarily" done by hash value. In India, the certificate in the BSA's Schedule asks for "the HASH value/s of the electronic/digital record/s" and the algorithm used — SHA1, SHA256, MD5 or another acceptable standard — in both the party's part and the expert's. The architecture decides whether you have had that hash since the moment of capture, or compute it the day before the hearing. Who signs, and how exports are handled, are <a href="https://samvyo.com/blog/evidentiary-video-recording-timestamps-retention-and-export-that-hold-up-later?ref=samvyo.com"><u>the procedures and people that make footage usable later</u></a>.</p><p>Every item in that package is produced where the recording is processed and stored. Which makes the location of that processing an audit question in its own right.</p><h2 id="where-the-chain-has-to-run"><strong>Where the chain has to run</strong></h2><p>If a hosted service records and stores for you, part of the custody chain runs inside the vendor's systems, and your evidence of what happened there is whatever the vendor chooses to expose. That can be perfectly adequate. Ask for it in writing: segment manifests, retention mode, access logs and export format.</p><p>Building on open source puts the whole chain in your hands. The recorders produce files; the manifest, the hash chain, the timestamp tokens and the log integrity are yours to build, and they are where the audit is actually passed. Because an SFU forwards media without decoding it — <a href="https://samvyo.com/blog/what-is-an-sfu-and-why-does-every-video-platform-use-one?ref=samvyo.com"><u>the property that makes it scale</u></a> — per-track capture fits it naturally, while a composite recording has to mix, <a href="https://samvyo.com/blog/sfu-vs-mcu-vs-mesh-which-topology-your-call-size-actually-needs?ref=samvyo.com"><u>as an MCU does</u></a>.</p><p>A commercial platform deployed on your infrastructure sits between the two. Samvyo is one such option: based on SFU architecture, with recording processing and storage kept on infrastructure you control, so the custody chain runs inside your own boundary. Where it does not fit: if nothing you record will ever need to be proven, all of this is overhead, and a hosted recording API is the simpler choice.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>A recording architecture audit does not test whether you recorded. It tests whether the pipeline produced evidence of completeness, time, integrity, immutability, access and faithful export at the moment it did the work — and none of those can be reconstructed afterwards.</p><p>Check two things first, because they fail most often: whether your hashes are chained or merely stored, and whether your object lock is in compliance mode or only described as if it were.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>For the recorder models, scaling and storage tiers underneath every recording architecture audit, read </em><a href="https://samvyo.com/blog/video-recording-architecture-what-runs-behind-the-pipeline-at-scale?ref=samvyo.com"><em><u>what runs behind the recording pipeline at scale</u></em></a><em>. For why storage and compliance break before live streaming does, see </em><a href="https://samvyo.com/blog/video-recording-at-scale-architecture-storage-and-the-compliance-trap?ref=samvyo.com"><em><u>the compliance trap in recording at scale</u></em></a><em>. </em><a href="https://samvyo.com/blog/video-recording-compliance-across-the-eu-us-and-india-what-each-regime-demands?ref=samvyo.com"><em><u>The business companion</u></em></a><em> covers what each regime in the EU, US and India actually demands.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What does a recording architecture audit check?</strong></p><p>It checks whether you can prove six things about a recording: that it is complete, when it was made, that it has not changed, that it could not have been deleted, who has accessed it, and that an exported copy matches the original. Each of those needs evidence the pipeline produced at capture time — segment manifests, timing data, chained hashes, locked retention, a tamper-evident access log and a self-proving export package.</p><p><strong>Is SHA-256 hashing enough to pass a recording architecture audit?</strong></p><p>It proves a file has not been modified, but not that a file has not been removed. If someone deletes a segment and its hash entry, what remains is consistent. Chaining the hashes — each record including the hash of the previous one — makes deletion and reordering detectable too.</p><p><strong>What is the difference between S3 Object Lock governance mode and compliance mode?</strong></p><p>In governance mode, any user with the s3:BypassGovernanceRetention permission can delete a locked object early. In compliance mode, no user can, including the root user, and the retention period cannot be shortened. Only compliance mode answers "who can delete this before retention ends?" with "nobody."</p><p><strong>Why can't I use the timestamps inside the video file as proof of when it was recorded?</strong></p><p>RTP media timestamps measure the spacing between frames, not the time of day, and each stream starts from a random offset. Wall-clock time comes from RTCP sender reports, which the recorder has to keep, plus a disciplined recorder clock. For time that does not depend on your own systems, add an RFC 3161 timestamp over the manifest hash.</p><p><strong>Does an RFC 3161 timestamp send my recording to a third party?</strong></p><p>No. The time-stamping authority receives only a hash of the data and is required not to examine it beyond checking its length. The recording itself never leaves your infrastructure.</p><p><strong>Is composite or per-track recording better for audits?</strong></p><p>Per-track capture limits the damage of a recorder failure to one track and keeps each participant's media separate, which matters later for redaction. Composite recording produces one polished file but depends on a single recorder instance for the whole session. Many deployments capture per-track and compose afterwards.</p><p><strong>Can we keep recordings and their audit evidence on our own infrastructure?</strong></p><p>Yes, if the platform lets recording processing and storage run on infrastructure you choose. Samvyo works this way, so the manifests, hashes and logs that make up the custody chain stay inside your own boundary. You still own the retention and key-management decisions.</p>]]></content:encoded></item><item><title><![CDATA[Video Recording Compliance Across the EU, US and India: What Each Regime Demands]]></title><description><![CDATA[Video recording compliance is three rulebooks: a lawful basis in Dublin, everyone's consent in California, and — for a bank's video KYC in India — five years of in-country storage. What the EU, US and India each demand, taken from the legal text, not summaries.]]></description><link>https://www.samvyo.com/blog/video-recording-compliance-across-the-eu-us-and-india-what-each-regime-demands</link><guid isPermaLink="false">6ab29c3c8b45c3f0cd63aa8c</guid><category><![CDATA[video compliance]]></category><category><![CDATA[Compliance Rules]]></category><category><![CDATA[data sovereignty]]></category><category><![CDATA[Video Infrastructure]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 23 Sep 2026 05:39:09 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-22--2026--08_50_23-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-22--2026--08_50_23-PM.png" alt="Video Recording Compliance Across the EU, US and India: What Each Regime Demands"/><p>The same recorded call can need a lawful basis in Dublin, everyone's consent in California, and — if it verifies a bank customer in India — storage inside the country for at least five years after the relationship ends.</p><p>Video recording compliance is not one rulebook. It is several, and they answer the same four questions differently: may you record, must you tell people, how long may or must you keep it, and where may it live. This post takes the EU, the US and India in turn, quoting the legal text itself rather than summaries of it. It describes how the rules read, not legal advice for a specific case.</p><h2 id="four-questions-every-video-recording-compliance-regime-asks"><strong>Four questions every video recording compliance regime asks</strong></h2>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="137"><col width="162"><col width="162"><col width="162"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Question</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">EU (GDPR)</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">US</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">India</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">May you record?</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Needs a lawful basis — often legitimate interest for surveillance</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Federally, one party's consent; some states require all parties'</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">DPDP consent after a notice (or another lawful ground)</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Must you tell people?</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes — transparency is built in</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">In all-party states, effectively yes</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes — the notice comes with or before the consent request</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">How long?</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No longer than necessary</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Mostly set by sector rules and litigation holds</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Erase when the purpose ends — unless another law requires retention (e.g. RBI: 5 years)</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Where, and how protected?</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Security obligations; transfer rules</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No general location rule</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Security safeguards; RBI V-CIP recordings stored in India</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The detail of video recording compliance is in the text. Start with the regime that is strictest about keeping things.</p><h2 id="eu-a-lawful-basis-and-no-longer-than-necessary"><strong>EU: a lawful basis, and no longer than necessary</strong></h2><p>The GDPR does not ban recording. It requires a reason and limits how long you keep what you record.</p><ul><li><strong>A lawful basis.</strong> For video surveillance, the European Data Protection Board's <a href="https://www.edpb.europa.eu/system/files/documents/files/file1/edpb_guidelines_201903_video_devices_en_0.pdf?ref=samvyo.com"><u>guidelines on video devices</u></a> identify legitimate interest under Article 6(1)(f), and public-interest tasks under Article 6(1)(e), as "the provisions most likely to be used." For recorded meetings and customer calls, the basis depends on the purpose and has to be chosen and documented before recording starts.</li><li><strong>Storage limitation.</strong> <a href="https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX%3A32016R0679&ref=samvyo.com"><u>Article 5(1)(e)</u></a> requires personal data to be kept "for no longer than necessary for the purposes for which the personal data are processed." For surveillance footage, the EDPB goes further: in most cases — its example is detecting vandalism — data should be "erased, ideally automatically, after a few days."</li><li><strong>Security.</strong> Article 5(1)(f) requires "appropriate security and confidentiality of the personal data, including for preventing unauthorised access to or use of personal data and the equipment used for the processing."</li><li><strong>Access with redaction.</strong> Under Article 15(3), "the controller shall provide a copy," and under 15(4) that copy "shall not adversely affect the rights or freedoms of others." The EDPB says controllers should use masking or scrambling rather than refuse — which is why the recording mode matters, as argued in <a href="https://samvyo.com/blog/composite-vs-per-track-recording-the-choice-that-decides-whether-you-can-redact?ref=samvyo.com"><u>composite vs per-track recording</u></a>.</li></ul><p>For video recording compliance, the EU's pressure is toward keeping less, for less time. The US starts from a different question entirely.</p><h2 id="us-consent-to-record-set-state-by-state"><strong>US: consent to record, set state by state</strong></h2><p>There is no general US federal privacy law for recordings. The binding question is interception: whose consent do you need to record a conversation?</p><p>The federal answer is one party. <a href="https://www.law.cornell.edu/uscode/text/18/2511?ref=samvyo.com"><u>18 U.S.C. § 2511(2)(d)</u></a> says it is not unlawful to intercept a communication "where such person is a party to the communication or where one of the parties to the communication has given prior consent," unless it is done to commit a crime or tort. Some states set a higher bar — often called two-party or all-party consent:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="137"><col width="487"/></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">State</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The statutory text</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">California</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><a href="https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=PEN&sectionNum=632&ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#2860d0;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Penal Code § 632</span></a><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> applies to anyone who, "intentionally and without the consent of all parties to a confidential communication," records it — where a confidential communication is one "carried on in circumstances as may reasonably indicate that any party to the communication desires it to be confined to the parties thereto."</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Florida</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><a href="https://www.flsenate.gov/Laws/Statutes/2024/934.03?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#2860d0;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">§ 934.03(2)(d)</span></a><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> makes interception lawful "when all of the parties to the communication have given prior consent."</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Washington</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><a href="https://app.leg.wa.gov/rcw/default.aspx?cite=9.73.030&ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#2860d0;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">RCW 9.73.030</span></a><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> prohibits recording private communications "without first obtaining the consent of all the participants" — but consent "shall be considered obtained whenever one party has announced to all other parties … that such communication or conversation is about to be recorded," and the announcement must itself be recorded.</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>These three are examples, not a complete list, and the wording differs in ways that matter. The design consequence is consistent, though. A video call can include participants in several states at once, and the recording system rarely knows which. The practical approach is to meet the strictest rule on every call: announce recording to everyone, make the announcement visible and audible, and keep a record that it happened. Washington's statute is a useful template, because it treats a recorded announcement as consent.</p><p>Retention in the US is then driven by sector rules and by litigation: once a dispute is anticipated, footage has to be preserved, which is covered in <a href="https://samvyo.com/blog/evidentiary-video-recording-timestamps-retention-and-export-that-hold-up-later?ref=samvyo.com"><u>evidentiary video recording</u></a>.</p><h2 id="india-dpdp-notice-and-consent-and-rbis-sector-rules"><strong>India: DPDP notice and consent, and RBI's sector rules</strong></h2><p>For video recording compliance, India now has both a general data protection law and, for banking, detailed recording rules.</p><p>The <a href="https://www.meity.gov.in/static/uploads/2024/06/2bf1f0e9f04e6fb4f8fef35e82c42aa5.pdf?ref=samvyo.com"><u>Digital Personal Data Protection Act, 2023</u></a> applies to "personal data in digital form," which includes recorded video of identifiable people. Its core obligations for recording are:</p><ul><li><strong>Notice first.</strong> Section 5(1): every request for consent "shall be accompanied or preceded by a notice given by the Data Fiduciary to the Data Principal," setting out the personal data and the purpose.</li><li><strong>Consent that means something.</strong> Section 6(1): consent must be "free, specific, informed, unconditional and unambiguous with a clear affirmative action."</li><li><strong>Security.</strong> Section 8(5): protect personal data "by taking reasonable security safeguards to prevent personal data breach."</li><li><strong>Erasure — with an exception.</strong> Section 8(7): unless "retention is necessary for compliance with any law for the time being in force," erase personal data when consent is withdrawn or "as soon as it is reasonable to assume that the specified purpose is no longer being served," and make your processors erase it too.</li><li><strong>Transfers.</strong> Section 16(1) lets the Central Government "restrict the transfer of personal data … to such country or territory outside India as may be so notified."</li></ul><p>Timing matters. The government <a href="https://static.pib.gov.in/WriteReadData/specificdocs/documents/2025/nov/doc20251117695301.pdf?ref=samvyo.com"><u>notified the DPDP Rules on 14 November 2025</u></a>, and they "introduce an eighteen-month period for phased compliance." Recording systems being designed now will be operating when those obligations are in force.</p><p>For banking video KYC, the Reserve Bank of India is specific. Its <a href="https://www.rbi.org.in/commonman/Upload/English/Notification/PDFs/MD18KYCF6E92C82E1E1419D87323E3869BC9F13.pdf?ref=samvyo.com"><u>Master Direction on KYC</u></a> (updated 14 August 2025) requires for video-based customer identification that "the entire data and recordings of V-CIP shall be stored in a system / systems located in India," that "the video recording is stored in a safe and secure manner and bears the date and time stamp that affords easy historical data search," and that the Direction's record-management rules apply — under which "records shall be maintained for a minimum period of five years after the business relationship is ended or the account is closed."</p><p>The DPDP exception in section 8(7) is what reconciles the two: the RBI retention requirement is a law that makes retention necessary, so it overrides the general duty to erase for those recordings. Proving those recordings later falls under the Bharatiya Sakshya Adhiniyam's certificate, covered in <a href="https://samvyo.com/blog/video-chain-of-custody-why-a-record-button-isnt-one?ref=samvyo.com"><u>what a video chain of custody requires</u></a>.</p><h2 id="where-the-regimes-pull-in-different-directions"><strong>Where the regimes pull in different directions</strong></h2><p>Put side by side, the video recording compliance rules conflict in two predictable places.</p><ul><li><strong>Retention.</strong> The GDPR and DPDP push toward deleting as soon as the purpose is served; sector rules like RBI's require years. Both regimes resolve it the same way — a legal obligation to retain is itself a valid purpose — so the answer is retention by class: short by default, long only where a specific rule requires it, and legal holds for disputes. The cost side of that choice is in <a href="https://samvyo.com/blog/video-recording-storage-cost-the-24-7-bill-your-retention-policy-controls?ref=samvyo.com"><u>the storage bill for 24/7 recording</u></a>.</li><li><strong>Consent.</strong> The US varies by state, the EU asks for a lawful basis that may not be consent at all, and India's DPDP centres on notice and consent. Designing for the strictest reading — announce to everyone, capture the acknowledgement — satisfies all three far more easily than designing per jurisdiction.</li></ul><p>Location is the third tension, and the largest. Where recordings are allowed to live, and what storing them in-country does and does not achieve, is the subject of <a href="https://samvyo.com/blog/video-data-residency-where-your-media-legally-has-to-live?ref=samvyo.com"><u>where your media legally has to live</u></a>.</p><h2 id="what-video-recording-compliance-asks-of-the-architecture"><strong>What video recording compliance asks of the architecture</strong></h2><p>Every requirement above lands on a specific capability in the recording system.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="281"><col width="343"/></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Requirement</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What the system has to do</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Tell people, and in some states get everyone's consent</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Announce recording to all participants, and record that the announcement was made</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Provide a copy while protecting others</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Keep tracks separable so others can be masked — </span><a href="https://samvyo.com/blog/composite-vs-per-track-recording-the-choice-that-decides-whether-you-can-redact?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#2860d0;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">composite vs per-track recording</span></a></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Keep no longer than necessary, but years where required</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Retention by class, automated deletion, and legal holds</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Store in a specific country</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Pin the recorder, storage and relays — not just the bucket — to that country</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Protect against unauthorised access</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Encryption, access control and an access log that is itself tamper-evident</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Prove it later</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Completeness, timing and integrity evidence produced at capture</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The last row is where the engineering begins. How a pipeline produces that evidence stage by stage is laid out in the technical companion, <a href="https://samvyo.com/blog/the-recording-architecture-audit-six-things-your-pipeline-has-to-prove?ref=samvyo.com"><u>the recording architecture audit</u></a>.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Video recording compliance asks four questions — may you record, must you tell, how long, and where — and the EU, US and India answer each differently. The GDPR limits purpose and duration; US law turns on consent, with some states requiring every party's; India combines DPDP notice-and-consent with sector rules such as RBI's five-year, in-country V-CIP storage.</p><p>Design for the strictest reading of each question, keep retention by class, and make sure the architecture can prove what the law asks you to claim.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>The technical companion, </em><a href="https://samvyo.com/blog/the-recording-architecture-audit-six-things-your-pipeline-has-to-prove?ref=samvyo.com"><em><u>the recording architecture audit</u></em></a><em>, walks the evidence a recording pipeline has to produce to meet these obligations. For where media is allowed to live and why in-country storage is not the whole answer, read </em><a href="https://samvyo.com/blog/video-data-residency-where-your-media-legally-has-to-live?ref=samvyo.com"><em><u>where your media legally has to live</u></em></a><em>.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What are the main video recording compliance requirements in the EU?</strong></p><p>Under the GDPR you need a lawful basis for recording, must keep recordings no longer than necessary, must secure them, and must provide people a copy of their data while protecting others in it. EDPB guidance names legitimate interest as a likely basis for surveillance and says such footage should usually be erased after a few days.</p><p><strong>Is it legal to record a video call in the US without telling everyone?</strong></p><p>Under federal law, one party's consent is enough. Some states, including California, Florida and Washington, require the consent of all parties, and Washington treats a recorded announcement as consent. Because participants may be in several states, announcing recording to everyone is the practical default.</p><p><strong>Does India's DPDP Act apply to video recordings?</strong></p><p>Yes. The DPDP Act covers personal data in digital form, which includes recordings of identifiable people. It requires a notice with or before any consent request, valid consent, reasonable security safeguards and erasure once the purpose ends — unless another law requires retention. The DPDP Rules were notified on 14 November 2025 with an eighteen-month phased compliance period.</p><p><strong>How long must RBI video KYC recordings be kept?</strong></p><p>The RBI Master Direction applies its record-management rules to V-CIP, under which records are maintained for a minimum of five years after the business relationship ends or the account is closed. V-CIP recordings must also be stored in systems located in India, securely, with a date and time stamp.</p><p><strong>How do GDPR storage limits and sector retention rules fit together?</strong></p><p>A legal obligation to retain is a valid purpose in its own right, so sector rules can require longer retention for specific recordings. India's DPDP Act makes this explicit: the duty to erase applies unless retention is necessary for compliance with another law. Use retention by class rather than one period for everything.</p><p><strong>Does video recording compliance require keeping recordings in-country?</strong></p><p>Not generally — but specific rules can. RBI requires V-CIP recordings to be stored in India, and India's DPDP Act lets the government restrict transfers to notified countries. Location rules are covered in depth in the post on video data residency.</p><p><strong>Can our recordings stay on infrastructure we control?</strong></p><p>Yes, if the platform keeps recording processing and storage on your side. Samvyo works this way, which lets you pin recordings, relays and storage to the jurisdiction your rules require. The retention schedule, notices and consent flow remain your decisions.</p>]]></content:encoded></item><item><title><![CDATA[Video Deployment Architecture: Where the Media Flows and What You Can Prove]]></title><description><![CDATA[In any video deployment architecture, WebRTC encrypts every hop — and the SFU decrypts, because forwarding requires it. Which component sees cleartext, where each of a call's four flows goes in each deployment model, and the evidence that proves it.]]></description><link>https://www.samvyo.com/blog/video-deployment-architecture-where-the-media-flows-and-what-you-can-prove</link><guid isPermaLink="false">6ab29aef8b45c3f0cd63aa71</guid><category><![CDATA[Video Architecture]]></category><category><![CDATA[Self-hosted Video]]></category><category><![CDATA[data sovereignty]]></category><category><![CDATA[data residency]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 23 Sep 2026 05:39:04 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-22--2026--08_47_11-PM.png" medium="image"/><content:encoded><![CDATA[<blockquote><em>If you arrived here from the </em><a href="https://samvyo.com/blog/video-deployment-models-on-prem-managed-cloud-or-saas-and-your-data-story?ref=samvyo.com" rel="noreferrer"><em>business version</em></a><em>, you are in the right place. That piece compared what on-prem, managed cloud and SaaS let you claim about your data. This is the companion "why": where the media actually flows in each, and what you can prove about it.</em></blockquote><img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-22--2026--08_47_11-PM.png" alt="Video Deployment Architecture: Where the Media Flows and What You Can Prove"/><p>Tell a customer that their video never leaves your infrastructure and the next question, from anyone serious, is: prove it.</p><p>The answer lives in the video deployment architecture — not the logo on the contract, but which component each packet passes through, which of those components can read it, and what record that leaves behind. Every WebRTC call has four distinct flows, and they do not all go to the same place.</p><h2 id="the-four-flows-in-every-video-deployment-architecture"><strong>The four flows in every video deployment architecture</strong></h2>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="100"><col width="175"><col width="162"><col width="187"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Flow</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What it carries</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Protection in transit</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Who can read the content</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Signalling</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Room joins, offers/answers, tokens, participant lists</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">TLS (WSS/HTTPS)</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Whoever runs the signalling server</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Media</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Audio and video between client and SFU</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">DTLS-SRTP, mandatory</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The client and the SFU</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Relay</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The same media, via TURN, for users who can't connect directly</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">DTLS-SRTP inside the relayed packets</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Not the relay — only the endpoints</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Recording</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Media captured and written to storage</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Depends on the recorder and store</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Whoever runs the recorder and holds the storage keys</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The third column looks reassuring — everything is encrypted. The fourth column is the one that matters, and it starts with a property of every SFU.</p><h2 id="encrypted-on-every-hop-readable-at-the-sfu"><strong>Encrypted on every hop, readable at the SFU</strong></h2><p>WebRTC encryption is mandatory — unencrypted media is not allowed. The <a href="https://www.rfc-editor.org/rfc/rfc8827?ref=samvyo.com"><u>WebRTC security architecture, RFC 8827</u></a>, is flat about it: "All media channels MUST be secured via SRTP," and "media traffic MUST NOT be sent over plain (unencrypted) RTP or RTCP."</p><p>But that encryption is hop by hop. Each client negotiates DTLS-SRTP with the media server it connects to, not with the other participants, because the SFU has to receive, inspect and re-send each stream — <a href="https://samvyo.com/blog/what-is-an-sfu-and-why-does-every-video-platform-use-one?ref=samvyo.com"><u>that is what an SFU is for</u></a>. The SFU decrypts what arrives and re-encrypts what it forwards. <strong>Wherever the SFU runs is where your media exists in the clear</strong>, in memory, for as long as the call lasts.</p><p>That single fact does most of the work in any video deployment architecture. "Encrypted in transit" is true of every WebRTC service. "Nobody outside our organisation can see the media" is only true if the SFU is yours — or if the media is encrypted a second time, end to end, which comes later. How the handshake reaches this point is walked through in <a href="https://samvyo.com/blog/webrtc-architecture-everything-that-runs-between-two-video-tabs?ref=samvyo.com"><u>the WebRTC architecture overview</u></a>.</p><p>The relay is different, and more benign than it looks.</p><h2 id="turn-sees-traffic-not-content"><strong>TURN sees traffic, not content</strong></h2><p>When a user sits behind a network that blocks direct paths — the situation <a href="https://samvyo.com/blog/nat-traversal-in-webrtc-why-the-call-connects-on-wi-fi-but-not-on-4g?ref=samvyo.com"><u>NAT traversal</u></a> is about — their media goes through a TURN relay. <a href="https://www.rfc-editor.org/rfc/rfc8656?ref=samvyo.com"><u>RFC 8656</u></a> describes a TURN server as one that "relays data between a TURN client and its peer(s)," and is explicit that "applications that want end-to-end security should encrypt the data sent between the client and a peer."</p><p>WebRTC does exactly that: the DTLS-SRTP session runs between the client and the SFU, through the relay. The relay forwards packets it cannot decrypt. What it does see is metadata — which IP addresses talked, when, and how much — and that metadata is itself sensitive. A third-party TURN service cannot watch your calls, but it can see that they happened, from where and for how long. Where the relay runs is therefore a metadata question and a cost question; the cost side is <a href="https://samvyo.com/blog/the-turn-bill-the-self-hosted-video-cost-nobody-forecasts?ref=samvyo.com"><u>The TURN Bill</u></a>.</p><p>Live media is transient. Recorded media is the part of a video deployment architecture that lasts.</p><h2 id="recording-where-media-becomes-data-at-rest"><strong>Recording: where media becomes data at rest</strong></h2><p>A recorder is a subscriber: it receives decrypted media from the SFU and writes it somewhere. Two locations matter — where the recorder runs, because it holds cleartext media, and where the files land, because that is the copy that outlives the call and can be demanded later. Whoever holds the storage encryption keys decides who can read it.</p><p>This is also where the long-term evidence obligations sit: completeness, integrity, access logs and export, covered in <a href="https://samvyo.com/blog/the-recording-architecture-audit-six-things-your-pipeline-has-to-prove?ref=samvyo.com"><u>the recording architecture audit</u></a>.</p><h2 id="tracing-the-video-deployment-architecture-in-each-model"><strong>Tracing the video deployment architecture in each model</strong></h2><p>Put the four flows against the deployment models from <a href="https://samvyo.com/blog/video-deployment-models-on-prem-managed-cloud-or-saas-and-your-data-story?ref=samvyo.com"><u>the business companion</u></a> and the differences become concrete.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="100"><col width="131"><col width="131"><col width="131"><col width="131"/></col></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Flow</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">SaaS</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Managed cloud</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">On-prem</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Hybrid</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Signalling</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Vendor</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your cloud account</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your network</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Often vendor</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Media (cleartext at SFU)</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Vendor</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your cloud account</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your network</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your infrastructure</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Relay (metadata)</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Vendor or its TURN supplier</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your cloud account</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your network</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your infrastructure</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Recording (at rest)</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Vendor's storage</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your bucket, provider's custody</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your storage</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your storage</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Two readings of that table are worth drawing out. In managed cloud, media and recordings are yours to configure but physically in a provider's custody — which is why the business companion separates residency from who can be compelled to disclose. And in a hybrid, the media, relay and recording rows are yours while signalling may not be, so the precise question is what the signalling side carries: room identifiers, participant identities and timings are metadata, not media, but they are not nothing.</p><p>Knowing where the flows go is the video deployment architecture. Showing it is the evidence.</p><h2 id="what-you-can-prove-and-how"><strong>What you can prove, and how</strong></h2><p>Every claim about a flow in your video deployment architecture can be backed by a record the system already produces, if you keep it.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="212"><col width="412"/></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Claim</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Evidence</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">"This call used our SFU and our relay"</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Client-side WebRTC statistics. The </span><a href="https://www.w3.org/TR/webrtc-stats/?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#2860d0;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">W3C stats spec</span></a><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> exposes the selected ICE candidate pair and each candidate's type — host, srflx, prflx or relay — so each session can record which path and which relay address it used.</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">"Media traffic stayed inside our network"</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Network flow records at the media servers. AWS describes </span><a href="https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#2860d0;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">VPC Flow Logs</span></a><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;"> as capturing "information about the IP traffic going to and from network interfaces"; on-prem, the firewall and switch logs do the same job.</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">"Only our relays were used"</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">TURN server allocation logs, matched against the relay candidates reported in client statistics.</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">"Recordings are stored here, readable only by us"</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Storage location configuration, key ownership, and the access log for every read.</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">"The vendor cannot see our media"</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Either the SFU is outside the vendor's control — shown by the rows above — or the media is end-to-end encrypted.</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The last row points at the one technique that changes the fourth column of the first table.</p><h2 id="end-to-end-encryption-the-strongest-claim-and-what-it-costs"><strong>End-to-end encryption: the strongest claim, and what it costs</strong></h2><p>End-to-end encryption adds a second layer that the SFU cannot remove. <a href="https://www.rfc-editor.org/rfc/rfc9605?ref=samvyo.com"><u>SFrame, RFC 9605</u></a>, describes a mechanism "in which central media servers (Selective Forwarding Units or SFUs) can access the media metadata needed to make forwarding decisions without having access to the actual media." With it, even a vendor-operated SFU forwards media it cannot read.</p><p>The cost is real and usually underestimated. Anything that needs to see the media on the server side stops working unless it holds the keys: server-side recording, transcription, live captioning, real-time AI features and compliance review all depend on cleartext. For many regulated uses — where a recording must exist and be retrievable — end-to-end encryption conflicts directly with the requirement.</p><p>That leaves two honest ways to make the strongest claim. Run the SFU, relay and recorder yourself, so the point of cleartext is inside your boundary; or use end-to-end encryption and accept that the server can do nothing with the media. Which one fits depends on whether you need the server to see it.</p><h2 id="build-buy-or-deploy"><strong>Build, buy, or deploy</strong></h2><p>Building on open source puts every flow on infrastructure you choose — <a href="https://samvyo.com/blog/self-hosted-video-architecture-what-you-actually-run-to-self-host-real-time-video?ref=samvyo.com"><u>the full component list</u></a> is the price. Buying SaaS puts every flow with the vendor, which is fine where the claims you need are the vendor's to make. Samvyo sits between: based on SFU architecture, with the media path, TURN and recording — the flows that carry media — running on infrastructure you control, resilient by design. Where it does not fit: if you need the server to never see media at all, end-to-end encryption is the requirement, not deployment location; and if no claim about media location matters to your customers, a hosted service is simpler.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>WebRTC encrypts every hop, but the SFU decrypts media to forward it, so the SFU's location is where your media exists in the clear. TURN relays see traffic, not content; recorders and their storage hold the copy that lasts.</p><p>Trace the four flows in your video deployment architecture, keep the evidence each one produces, and make only the claims those records support.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>For which claims each deployment model supports at the business level, read </em><a href="https://samvyo.com/blog/video-deployment-models-on-prem-managed-cloud-or-saas-and-your-data-story?ref=samvyo.com"><em><u>the business companion on video deployment models</u></em></a><em>. For the full component inventory behind these flows, see </em><a href="https://samvyo.com/blog/self-hosted-video-architecture-what-you-actually-run-to-self-host-real-time-video?ref=samvyo.com"><em><u>what you actually run to self-host real-time video</u></em></a><em>.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What is a video deployment architecture?</strong></p><p>It is the map of where each part of a video call runs and flows: signalling, media through the SFU, relayed media through TURN, and recordings into storage. It determines which component can read the media and which records exist to prove where it went.</p><p><strong>Is WebRTC media encrypted?</strong></p><p>Always in transit. RFC 8827 requires all media channels to be secured with SRTP and forbids unencrypted RTP. But the encryption is hop by hop: the SFU decrypts media to forward it, so it can read the content.</p><p><strong>Can a TURN server see my video?</strong></p><p>No. TURN relays the encrypted DTLS-SRTP packets between the client and the media server without the keys to decrypt them. It does see metadata — IP addresses, timing and traffic volume — which is why relay location still matters.</p><p><strong>How can I prove what my video deployment architecture actually did on a call?</strong></p><p>Record client-side WebRTC statistics for the selected ICE candidate pair, which show the path and candidate type, including relay addresses. Match them against TURN allocation logs and network flow logs at your media servers.</p><p><strong>Does end-to-end encryption work with an SFU?</strong></p><p>Yes. SFrame, RFC 9605, lets SFUs forward media using metadata without access to the content. The trade-off is that server-side recording, transcription and other processing cannot work unless they hold the keys.</p><p><strong>Where does media exist in the clear in a hybrid deployment?</strong></p><p>At the SFU and the recorder. In a hybrid where those run on your infrastructure, cleartext media stays inside your boundary even if some management runs elsewhere. Samvyo keeps the media path, TURN and recording on infrastructure you control.</p>]]></content:encoded></item><item><title><![CDATA[Video Deployment Models: On-Prem, Managed Cloud or SaaS — and Your Data Story]]></title><description><![CDATA[Every security questionnaire asks where your data goes and who can reach it. Your choice among video deployment models has already answered. On-prem, managed cloud and SaaS, compared on the claims each lets you make — and why in-country is not the same as in control.
]]></description><link>https://www.samvyo.com/blog/video-deployment-models-on-prem-managed-cloud-or-saas-and-your-data-story</link><guid isPermaLink="false">6ab29a248b45c3f0cd63aa58</guid><category><![CDATA[Self-hosted Video]]></category><category><![CDATA[Embedded WebRTC]]></category><category><![CDATA[data sovereignty]]></category><category><![CDATA[On-prem Video Conferencing]]></category><category><![CDATA[Video Infrastructure]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 23 Sep 2026 05:38:59 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-22--2026--08_41_46-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-22--2026--08_41_46-PM.png" alt="Video Deployment Models: On-Prem, Managed Cloud or SaaS — and Your Data Story"/><p>Every security questionnaire asks the same question forty different ways: where does our data go, and who can get to it?</p><p>By the time that questionnaire arrives, your deployment model has already answered. On-prem, managed cloud and SaaS are usually compared on cost and convenience. The more consequential difference is what each one lets you truthfully say about your customers' audio, video and recordings — and a deployment diagram is a compliance argument whether or not anyone drew it that way.</p><p>This post compares the video deployment models on that basis: the claims each supports, and the ones it quietly rules out.</p><h2 id="the-three-video-deployment-models"><strong>The three video deployment models</strong></h2><p>The labels get used loosely, so here they are pinned to the two questions that matter: whose infrastructure the media runs on, and who operates the software.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="112"><col width="168"><col width="168"><col width="175"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Model</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Media runs on</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Software operated by</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Typical example</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">On-prem</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Your own hardware, in your own facilities</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">You (or a vendor under your access rules)</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Government, defence, regulated banking</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Managed cloud</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Infrastructure dedicated to you — your cloud account or a single-tenant environment</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A vendor, or shared with you</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Enterprises that want control without running hardware</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">SaaS</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The vendor's shared, multi-tenant infrastructure</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The vendor</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Most meeting tools and video APIs</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Hybrid</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Media on your side; some management functions on the vendor's</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Split</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Platforms that separate the media path from administration</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The components underneath are the same in every model — <a href="https://samvyo.com/blog/self-hosted-video-architecture-what-you-actually-run-to-self-host-real-time-video?ref=samvyo.com"><u>the seven things a self-hosted stack runs</u></a> — and the three that carry media, the SFU, TURN and recording, are the ones whose location changes the story. So what does each model let you say?</p><h2 id="what-the-video-deployment-models-let-you-claim"><strong>What the video deployment models let you claim</strong></h2><p>Here are the claims customers and auditors actually ask about, and whether each model can support them without qualification.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="212"><col width="137"><col width="137"><col width="137"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Claim</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">On-prem</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Managed cloud</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">SaaS</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">"Media never leaves our network or country"</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes, if the region and relays are pinned</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Only if the vendor contractually pins every component</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">"Only our people can access recordings"</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Depends on who holds admin access and keys</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No — the vendor's operators can, under their policies</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">"We can name every party that touches the data"</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">You plus the cloud provider plus the vendor</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The vendor's full subprocessor list</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">"We decide when the software changes"</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Usually</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No — the vendor ships on its schedule</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">"A legal order served on a vendor cannot reach our media"</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Depends on who has possession or control</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">"We are covered by the vendor's certifications"</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No — you earn your own</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Partly</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes, within the vendor's scope</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Read down the SaaS column and the pattern is not that SaaS is insecure — the last row is a real advantage. It is that SaaS converts most claims about your data into claims about someone else's policies. Two rows in that table do more work than the rest in comparing video deployment models, starting with the one people most often get wrong.</p><h2 id="residency-is-not-sovereignty"><strong>Residency is not sovereignty</strong></h2><p>Residency is where data physically sits. Sovereignty is who can be compelled to hand it over. They are routinely treated as the same thing, and they are not.</p><p>The clearest illustration is US law. Under <a href="https://www.law.cornell.edu/uscode/text/18/2713?ref=samvyo.com"><u>18 U.S.C. § 2713</u></a>, added by the CLOUD Act in 2018, a provider of electronic communication or remote computing services must disclose data "within such provider's possession, custody, or control, regardless of whether such communication, record, or other information is located within or outside of the United States."</p><p>The operative words are possession, custody or control — not location. A recording stored in an Indian or European data centre by a provider subject to that statute is resident in-country and still within reach of the order. Choosing a local region answers the residency question and leaves the sovereignty question where it was. What each jurisdiction actually requires about location is the subject of <a href="https://samvyo.com/blog/video-data-residency-where-your-media-legally-has-to-live?ref=samvyo.com"><u>where your media legally has to live</u></a>.</p><p>The same logic cuts against self-hosting done carelessly. Running your own SFU on a hyperscaler still places stored recordings in that provider's custody; encrypting them with keys only you hold is what narrows the question to "who can compel <em>you</em>." The deployment model sets the starting point. Key custody and relay placement finish the answer — the argument made at a strategic level in <a href="https://samvyo.com/blog/communication-sovereignty-building-own-video-conferencing-infrastructure?ref=samvyo.com"><u>the case for communication sovereignty</u></a>.</p><p>The second row that matters across video deployment models is about everyone else in the chain.</p><h2 id="every-subprocessor-is-part-of-your-data-story"><strong>Every subprocessor is part of your data story</strong></h2><p>A video service is rarely one company. The media servers may run on one cloud, TURN relays on another, recordings in a third-party object store, and transcription through an AI provider. Under the GDPR, each of those is a sub-processor, and <a href="https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX%3A32016R0679&ref=samvyo.com"><u>Article 28(2)</u></a> requires that "the processor shall not engage another processor without prior specific or general written authorisation of the controller."</p><p>In practice, that means the list of parties who can touch a customer's video is your vendor's subprocessor list, and it changes when the vendor's suppliers change. On-prem shortens that list to you. Managed cloud shortens it to you, your cloud provider and your vendor. SaaS inherits all of it — and when the vendor itself changes hands, the list can change wholesale, <a href="https://samvyo.com/blog/what-happens-when-your-video-api-provider-gets-acquired-or-shuts-down?ref=samvyo.com"><u>as happens when a video provider is acquired or shuts down</u></a>.</p><h2 id="the-honest-counterweight-on-prem-moves-responsibility-not-risk"><strong>The honest counterweight: on-prem moves responsibility, not risk</strong></h2><p>None of this makes on-prem automatically the safest of the video deployment models. It makes you responsible.</p><p>Cloud providers draw this line explicitly. AWS's <a href="https://aws.amazon.com/compliance/shared-responsibility-model/?ref=samvyo.com"><u>shared responsibility model</u></a> says the provider is responsible for "protecting the infrastructure that runs all of the services offered in the AWS Cloud," while for services like EC2 the customer owns guest operating system updates, security patches, installed applications and firewall configuration. Move from SaaS to managed cloud and more of that list becomes yours. Move to on-prem and all of it does — including the physical security and certifications a large vendor already holds.</p><p>For many organisations, a well-run SaaS is more secure than the on-prem deployment they would actually operate. The right question is not "which model is most secure" but "which claims do we need to make, and can we operate the model that supports them?"</p><h2 id="choosing-a-video-deployment-model"><strong>Choosing a video deployment model</strong></h2><p>Start from the claims you must be able to make, then pick the least demanding of the video deployment models that supports them.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="343"><col width="281"/></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">If you must be able to say…</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The least demanding model that supports it</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">"We use a reputable, certified provider"</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">SaaS</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">"Our data stays in this country"</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">SaaS with contractually pinned regions and relays, or managed cloud</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">"Only our staff can reach recordings"</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Managed cloud with customer-held keys, or on-prem</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">"No foreign order to a vendor reaches our media"</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">On-prem, or a hybrid where the media path, relays and recordings are yours</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">"Media never touches the public internet"</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">On-prem on an isolated network</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The hybrid row deserves a closer look, because it is where many organisations land: the media path, TURN relays and recordings run on infrastructure you control, while a vendor handles software delivery and administration. The questions to ask of any hybrid are precise ones — which data crosses to the vendor side, in what form, and under whose jurisdiction — and they are answered by tracing <a href="https://samvyo.com/blog/video-deployment-architecture-where-the-media-flows-and-what-you-can-prove?ref=samvyo.com"><u>where the media flows in each deployment</u></a>.</p><h2 id="build-buy-or-deploy"><strong>Build, buy, or deploy</strong></h2><p>Building on open source gives you whichever model you are prepared to operate, with every responsibility that comes with it; what that costs is laid out in <a href="https://samvyo.com/blog/self-hosted-video-cost-what-running-it-yourself-actually-costs?ref=samvyo.com"><u>what running it yourself actually costs</u></a>. Buying SaaS gives you certifications and speed, and makes your data story the vendor's. Deploying a platform on your own infrastructure sits between them.</p><p>Samvyo is one such option: based on SFU architecture, shipping the same embeddable SDKs a CPaaS provides, with OEM and white-label depth and a managed-service option — and with the media path, TURN and recording running on infrastructure you control, resilient by design. Where it does not fit: if your requirements are met by a certified SaaS provider's standard terms, that is simpler; and if you need to operate and modify every layer yourself, building is the more direct route.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Video deployment models are usually compared on cost and convenience, but their real difference is what they let you truthfully claim about your customers' media. Residency is not sovereignty — a legal order follows possession and control, not location — and every subprocessor is part of the story.</p><p>Decide which claims you need to make first. Then choose the least demanding model that lets you make them, and one you can actually operate.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>The technical companion traces </em><a href="https://samvyo.com/blog/video-deployment-architecture-where-the-media-flows-and-what-you-can-prove?ref=samvyo.com"><em><u>where the media flows in each deployment</u></em></a><em> and what each path lets you prove. For the legal side of location, see </em><a href="https://samvyo.com/blog/video-data-residency-where-your-media-legally-has-to-live?ref=samvyo.com"><em><u>where your media legally has to live</u></em></a><em>.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What are the main video deployment models?</strong></p><p>On-prem, where media runs on your own hardware; managed cloud, where it runs on infrastructure dedicated to you but may be operated by a vendor; and SaaS, where it runs on the vendor's shared infrastructure. Hybrids keep the media path on your side and leave some administration to a vendor.</p><p><strong>Is data residency the same as data sovereignty?</strong></p><p>No. Residency is where data is stored; sovereignty is who can be compelled to disclose it. Under 18 U.S.C. § 2713, US-covered providers must disclose data in their possession, custody or control regardless of where it is located, so in-country storage alone does not settle who can reach it.</p><p><strong>Which of the video deployment models is most secure — on-prem or SaaS?</strong></p><p>Not automatically. On-prem gives you control and makes you responsible for patching, configuration, physical security and certification. Many organisations are more secure on a well-run SaaS than on the on-prem deployment they would realistically operate. Choose by the claims you need to make and your ability to operate the model.</p><p><strong>What should I ask a video vendor about subprocessors?</strong></p><p>Ask for the full list of parties that can process your media — cloud hosts, TURN relay providers, storage, transcription and support — and how you are notified of changes. Under GDPR Article 28(2), a processor needs the controller's written authorisation to engage another processor.</p><p><strong>Can a hybrid deployment keep media on our infrastructure?</strong></p><p>Yes. In a hybrid, the media path, TURN relays and recordings run on infrastructure you control while the vendor handles software delivery and administration. Samvyo works this way. Ask any hybrid vendor exactly which data crosses to their side and in what form.</p><p><strong>Which video deployment model do I need to keep recordings in-country?</strong></p><p>Any model can, provided every component that stores or relays media — including TURN and recording storage — is pinned to the country. SaaS needs that commitment in the contract; managed cloud and on-prem let you configure it directly.</p>]]></content:encoded></item><item><title><![CDATA[Self-Hosted Video Architecture: What You Actually Run to Self-Host Real-Time Video]]></title><description><![CDATA[A self-hosted video architecture is seven components, not one media server: signalling, SFUs, TURN, recording, storage, capacity and the network edge. Three of them decide where your media actually goes. The inventory, with what breaks when each is missing.]]></description><link>https://www.samvyo.com/blog/self-hosted-video-architecture-what-you-actually-run-to-self-host-real-time-video</link><guid isPermaLink="false">6ab298fb8b45c3f0cd63aa3e</guid><category><![CDATA[Self-hosted Video]]></category><category><![CDATA[Video Architecture]]></category><category><![CDATA[Embedded WebRTC]]></category><category><![CDATA[STUN/TURN]]></category><category><![CDATA[Video Infrastructure]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 23 Sep 2026 05:38:53 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-22--2026--08_38_48-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-22--2026--08_38_48-PM.png" alt="Self-Hosted Video Architecture: What You Actually Run to Self-Host Real-Time Video"/><p><em>If you arrived here from the business version, you are in the right place. That piece covered what self-hosting costs and where the break-even sits. This is the companion "what": the components you actually run, and which of them decide where your data goes.</em></p><p>Install an SFU and you have a demo. The first production incident usually teaches you that the SFU was one of seven things you had to run.</p><p>A self-hosted video architecture is the whole set of services that turn a media server into something people can depend on: signalling, the media servers themselves, relays for users behind restrictive networks, recording, storage, capacity management and the network edge. This post walks each one — what it does, what breaks without it — and ends on the three that matter most for control.</p><h2 id="the-self-hosted-video-architecture-at-a-glance"><strong>The self-hosted video architecture at a glance</strong></h2>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="112"><col width="187"><col width="187"><col width="137"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Component</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What it does</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What breaks without it</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Carries media?</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Signalling + auth</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Exchanges offers/answers, issues room tokens</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Nobody can join; or anyone can</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Media servers (SFU)</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Receives and forwards audio/video</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No call at all</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">TURN relays</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Relays media for users who can't connect directly</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Calls fail behind strict NATs and firewalls</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Recording</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Captures tracks or composites sessions</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No record, or a record you can't defend</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Storage</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Keeps recordings under a retention policy</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Recordings lost, or kept forever</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">At rest</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Capacity + placement</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Decides which server a room lands on; handles failure</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Hot servers, dropped calls on failure</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The edge</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">TLS, DNS, certificates, firewall ports, public IPs</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Browsers refuse to connect</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The last column is the one this self-hosted video architecture walkthrough keeps returning to. Start with the component everyone forgets is a component.</p><h2 id="signalling-the-part-webrtc-leaves-to-you"><strong>Signalling: the part WebRTC leaves to you</strong></h2><p>WebRTC standardises how media flows. It deliberately does not standardise how two endpoints agree to start. <a href="https://www.rfc-editor.org/rfc/rfc8829?ref=samvyo.com"><u>RFC 8829, the JavaScript Session Establishment Protocol</u></a>, says call setup was designed "to focus on controlling the media plane, leaving signaling-plane behavior up to the application as much as possible," and that transport of offers and answers is "left entirely up to the application."</p><p>Media servers follow the same philosophy. mediasoup describes itself as <a href="https://mediasoup.org/documentation/v3/mediasoup/design/?ref=samvyo.com"><u>"not a standalone server but an unopinionated Node.js module"</u></a> to be integrated into a larger application. So a self-hosted deployment always includes a signalling service you write or adopt — usually a WebSocket server — plus the authentication around it: who may create a room, who may join, and with what permissions. That token service is where access control lives, and it is easy to under-build.</p><p>Signalling only introduces the parties. In a self-hosted video architecture, the media goes somewhere else.</p><h2 id="media-servers-where-the-calls-physically-run"><strong>Media servers: where the calls physically run</strong></h2><p>The SFU is the component that receives each participant's streams and forwards them to everyone else — the reason <a href="https://samvyo.com/blog/sfu-vs-mcu-vs-mesh-which-topology-your-call-size-actually-needs?ref=samvyo.com"><u>an SFU beats an MCU or mesh</u></a> at meeting sizes. Self-hosting it brings three requirements that a managed service hides:</p><ul><li><strong>A public address that browsers can reach.</strong> mediasoup documents an announced address for exactly this, "useful when running mediasoup behind NAT with private IP." Get it wrong and connections negotiate successfully, then carry no media.</li><li><strong>A range of open UDP ports.</strong> mediasoup's defaults span ports 10000–59999 (<a href="https://mediasoup.org/documentation/v3/mediasoup/api/?ref=samvyo.com"><u>API reference</u></a>); LiveKit's sample Helm configuration uses 50000–60000 plus TCP 7881 (<a href="https://github.com/livekit/livekit-helm/blob/master/server-sample.yaml?ref=samvyo.com"><u>server-sample.yaml</u></a>). Those ports have to be open end to end, through cloud security groups and any corporate firewall in between.</li><li><strong>Host-level networking.</strong> The same LiveKit configuration notes that "you can run only one instance of LiveKit per physical node" because of those port requirements. Media servers do not sit comfortably behind the load balancers and container networking most web services use.</li></ul><p>Capacity per server is well documented — mediasoup cites "over ~500 consumers" per worker on one core in its <a href="https://mediasoup.org/documentation/v3/scalability/?ref=samvyo.com"><u>scalability notes</u></a> — and growing past one server means clustering or cascading, which moves the bottleneck in ways covered in <a href="https://samvyo.com/blog/sfu-scaling-clustering-cascading-and-where-the-bottleneck-moves?ref=samvyo.com"><u>SFU scaling</u></a>.</p><p>The SFU reaches most users directly. Not all of them.</p><h2 id="turn-the-relay-you-cant-skip"><strong>TURN: the relay you can't skip</strong></h2><p>Some users sit behind networks that block direct UDP — symmetric NATs, corporate proxies, guest Wi-Fi. For them, media goes through a TURN relay, and TURN over TLS on port 443 is often the only path that works.</p><p>Two things make TURN an architecture decision rather than a checkbox. It carries media, so wherever the relay runs is somewhere your users' audio and video pass through. And it carries a bill that scales with the share of users who need it, which is the subject of <a href="https://samvyo.com/blog/the-turn-bill-the-self-hosted-video-cost-nobody-forecasts?ref=samvyo.com"><u>The TURN Bill</u></a>. A self-hosted deployment that uses a third-party TURN service has quietly moved part of its media path back outside its own boundary.</p><h2 id="recording-and-storage-media-that-stays"><strong>Recording and storage: media that stays</strong></h2><p>Live media passes through and is gone. Recorded media stays, which makes recording the component with the longest-lasting consequences.</p><p>Composite recorders render the call in a browser — <a href="https://github.com/jitsi/jibri?ref=samvyo.com"><u>Jibri</u></a> launches "a Chrome instance rendered in a virtual framebuffer," and "only one recording at a time is supported on a single jibri" — so capacity is one recorder per concurrent session. Per-track capture sits next to the SFU and scales far better; the choice between them also decides <a href="https://samvyo.com/blog/composite-vs-per-track-recording-the-choice-that-decides-whether-you-can-redact?ref=samvyo.com"><u>whether you can redact later</u></a>. Either way, recordings need a storage tier with a retention policy, integrity controls and an access log, each of which is its own design decision.</p><p>Those five components carry the load of a self-hosted video architecture. Two more keep them upright.</p><h2 id="capacity-placement-and-failure"><strong>Capacity, placement and failure</strong></h2><p>With more than one media server, something has to decide which server each room lands on, notice when a server is overloaded or unhealthy, and move new rooms elsewhere. Without it, one server runs hot while another idles, and a single failure drops every call on the machine that failed.</p><p>Media server state lives in memory, so a server that dies takes its rooms with it; what the user experiences depends on whether clients reconnect quickly to a healthy server. In a self-built stack, you design that behaviour: health checks, draining a server before maintenance, reconnection logic in the client, and the monitoring that tells you which of these is failing. It is the least visible component and the one that most often turns a stable demo into an unstable service — the gap described in <a href="https://samvyo.com/blog/add-video-to-your-app-why-the-demo-takes-an-afternoon-and-production-takes-months?ref=samvyo.com"><u>why the demo takes an afternoon and production takes months</u></a>.</p><h2 id="the-edge-tls-dns-and-certificates"><strong>The edge: TLS, DNS and certificates</strong></h2><p>Browsers will not give a page camera or microphone access unless the page is secure. MDN is explicit that getUserMedia is <a href="https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia?ref=samvyo.com"><u>"available only in secure contexts (HTTPS)"</u></a>. That makes valid certificates, DNS records for every public endpoint, and renewal automation hard requirements — for the web app, the signalling endpoint and TURN over TLS alike. An expired certificate does not degrade a video service; it stops it.</p><p>That is the full self-hosted video architecture inventory. What turns it into a decision is the question of which parts you need to own.</p><h2 id="the-three-parts-of-a-self-hosted-video-architecture-that-decide-where-data-goes"><strong>The three parts of a self-hosted video architecture that decide where data goes</strong></h2><p>Look back at the last column of the first table. Three components carry media: the SFU, TURN and recording. Everything else — signalling, placement, the edge — handles metadata, control and configuration.</p><p>That split is the practical core of self-hosting. If the goal is to control where audio and video go, those three have to run on infrastructure you control, and a deployment that self-hosts the SFU but uses a third-party TURN service or a hosted recorder has not achieved it. The other components still matter for reliability and access control, but they are not where the media is. How that plays out across on-prem, managed-cloud and SaaS deployments — and what each lets you prove — is the subject of <a href="https://samvyo.com/blog/video-deployment-architecture-where-the-media-flows-and-what-you-can-prove?ref=samvyo.com"><u>where the media flows in each deployment</u></a>.</p><h2 id="build-buy-or-deploy"><strong>Build, buy, or deploy</strong></h2><h3 id="build-on-open-source"><strong>Build on open source</strong></h3><p>mediasoup, Janus, Pion, LiveKit and coturn cover the media, relay and recording components well. You build signalling, authentication, placement, failure handling, the recording pipeline and the operational tooling around them. This fits teams with WebRTC depth who want every layer under their control.</p><h3 id="buy-a-hosted-service"><strong>Buy a hosted service</strong></h3><p>Every component above is run for you, which removes most of the operational work and all of the control over where media flows. For many products that is the right trade.</p><h3 id="deploy-a-platform-on-your-own-infrastructure"><strong>Deploy a platform on your own infrastructure</strong></h3><p>Samvyo is one option between the two: based on SFU architecture, shipping embeddable SDKs, with the media path, TURN and recording — the three components that carry media — running on infrastructure you control, and resilient by design. Where it does not fit: if you have no requirement about where media flows, a hosted service is simpler; and if you want to own and modify every layer yourself, building on open source gives you that.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>A self-hosted video architecture is seven components, not one media server: signalling, SFUs, TURN, recording, storage, capacity management and the edge. Three of them — the SFU, TURN and recording — carry media, and those three are what decide whether self-hosting actually keeps your data where you intended.</p><p>Inventory all seven before you commit, and draw the boundary around the three.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>For what running these components costs and where self-hosting breaks even, read </em><a href="https://samvyo.com/blog/self-hosted-video-cost-what-running-it-yourself-actually-costs?ref=samvyo.com"><em><u>the business companion on self-hosted video cost</u></em></a><em>. For how the media path differs across deployment models, see </em><a href="https://samvyo.com/blog/video-deployment-architecture-where-the-media-flows-and-what-you-can-prove?ref=samvyo.com"><em><u>where the media flows in each deployment</u></em></a><em>.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What does a self-hosted video architecture include?</strong></p><p>Seven components: a signalling and authentication service, one or more SFU media servers, TURN relays, a recording pipeline, storage with retention, capacity and placement management, and the network edge — TLS, DNS, certificates and firewall ports. The media server alone is a demo, not a deployment.</p><p><strong>Does WebRTC include signalling?</strong></p><p>No. The JSEP specification leaves signalling to the application, and media servers such as mediasoup are libraries without a built-in signalling layer. Self-hosted deployments run their own signalling service, usually over WebSockets, plus the token-based authentication around it.</p><p><strong>Which ports does a self-hosted video architecture need open?</strong></p><p>A range of UDP ports for media plus a few fixed ports for signalling and TURN. mediasoup's defaults span 10000–59999; LiveKit's sample configuration uses UDP 50000–60000 and TCP 7881. TURN over TLS on 443 is usually added for users behind strict firewalls.</p><p><strong>Do I need my own TURN server if I self-host?</strong></p><p>If you want the media path to stay on your infrastructure, yes. TURN relays carry audio and video for users who cannot connect directly, so a third-party TURN service moves part of your media outside your boundary. It also carries its own bandwidth bill.</p><p><strong>What happens to a call if a self-hosted media server fails?</strong></p><p>Rooms on that server drop, because media server state is held in memory. What users experience depends on whether clients reconnect quickly to a healthy server, which in a self-built stack you design with health checks, draining and client reconnection logic.</p><p><strong>Which parts of the stack control where my data goes?</strong></p><p>The three that carry media: the SFU, TURN relays and recording. Samvyo keeps exactly those three on infrastructure you control and is resilient by design; signalling, placement and the edge handle control and configuration rather than audio and video.</p>]]></content:encoded></item><item><title><![CDATA[Self-Hosted Video Cost: What Running It Yourself Actually Costs]]></title><description><![CDATA[Servers are the cheapest line in self-hosted video cost: a million participant-minutes a month needs under $300 of compute at list prices. The bill is decided by where your egress lands and how much engineering time you commit — and the break-even moves with both.]]></description><link>https://www.samvyo.com/blog/self-hosted-video-cost-what-running-it-yourself-actually-costs</link><guid isPermaLink="false">6ab297c68b45c3f0cd63aa2a</guid><category><![CDATA[Self-hosted Video]]></category><category><![CDATA[cost-benefit analysis]]></category><category><![CDATA[Video Architecture]]></category><category><![CDATA[build vs buy RTC]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 23 Sep 2026 05:38:48 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-22--2026--08_37_02-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-22--2026--08_37_02-PM.png" alt="Self-Hosted Video Cost: What Running It Yourself Actually Costs"/><p>On public list prices, the servers needed to carry a million participant-minutes of video a month cost less than $300.</p><p>That figure is real, and it is why so many self-hosting business cases look better on paper than in practice. Self-hosted video cost is not mostly servers. It is decided by two other lines: where your outbound traffic lands, and how much engineering time you commit to running the thing. Get those two right and, at enough volume, self-hosting beats any provider. Get them wrong and it costs several times more for the same calls.</p><p>Here is the self-hosted video cost model, line by line, with every price taken from a published page.</p><h2 id="the-workload-this-model-prices"><strong>The workload this model prices</strong></h2><p>Every cost model is a conclusion about a particular workload, so here is this one stated plainly:</p><ul><li><strong>1,000,000 participant-minutes a month</strong>, in rooms of five where everyone sees everyone.</li><li><strong>600 kbps average per forwarded stream</strong>, the planning figure used across our scaling-cost analysis. Each participant receives four streams, so each participant-minute sends about 18 MB out of the server.</li><li><strong>Business-hours usage</strong>: 8 hours a day, 22 days a month. That averages about 95 people on calls at once; allowing for a 2× peak puts the busiest hour near 760 outbound streams and about 455 Mbps.</li></ul><p>Change any of those and the numbers change — room size above all, because <a href="https://samvyo.com/blog/why-your-sfu-bandwidth-cost-scales-with-viewers-not-publishers?ref=samvyo.com"><u>the bill follows viewers, not publishers</u></a>. What stays the same is which lines matter.</p><h2 id="line-by-line-the-self-hosted-video-cost-sourced"><strong>Line by line: the self-hosted video cost, sourced</strong></h2>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="162"><col width="212"><col width="125"><col width="125"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Line item</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Basis</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Public cloud / month</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Bundled-bandwidth host / month</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Media servers</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2 × c3-standard-4 at $0.2016/hr (</span><a href="https://cloud.google.com/products/compute/pricing/general-purpose?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#2860d0;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Google Cloud list</span></a><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">), for redundancy</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$294</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$294 (held at cloud price for comparison)</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Egress</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">18 TB at $0.09/GB (</span><a href="https://aws.amazon.com/s3/pricing/?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#2860d0;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">AWS list</span></a><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">, first-10 TB tier, used as an upper bound)</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$1,620</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$0 — e.g. </span><a href="https://docs.hetzner.com/robot/general/traffic/?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#2860d0;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Hetzner</span></a><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">: "unlimited traffic" on a 1 Gbit uplink</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">TURN relay</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Depends on how many users need relaying</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">See </span><a href="https://samvyo.com/blog/the-turn-bill-the-self-hosted-video-cost-nobody-forecasts?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#2860d0;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The TURN Bill</span></a></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Same</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Recording storage</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Depends on retention</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">See </span><a href="https://samvyo.com/blog/video-recording-storage-cost-the-24-7-bill-your-retention-policy-controls?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#2860d0;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">the storage bill</span></a></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Same</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Engineering time</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Per 0.25 FTE, loaded (below)</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$4,047</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$4,047</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Total at 0.25 FTE</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Excluding TURN and storage</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$5,961</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$4,341</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Compute is sized from <a href="https://mediasoup.org/documentation/v3/scalability/?ref=samvyo.com"><u>mediasoup's own scalability guidance</u></a> — one worker on one core handles "over ~500 consumers," so 760 streams fit in two cores. Two four-vCPU machines is generous, and it is still the smallest line on the page.</p><p>Egress is the line the venue decides. At 455 Mbps peak, this workload fits inside one 1 Gbit uplink, so on a host with bundled traffic the line goes to zero. On metered cloud egress it is the largest non-people cost. That gap — roughly 90× between cloud list egress and a dedicated server's bundled transfer — is the argument of <a href="https://samvyo.com/blog/scaling-video-cost-what-happens-when-one-media-server-isnt-enough?ref=samvyo.com"><u>scaling video cost past one media server</u></a>, and it is not repeated here.</p><p>Which leaves the line that dwarfs the others in any self-hosted video cost model.</p><h2 id="engineering-time-is-the-real-self-hosted-video-cost"><strong>Engineering time is the real self-hosted video cost</strong></h2><p>The <a href="https://www.bls.gov/ooh/computer-and-information-technology/software-developers.htm?ref=samvyo.com"><u>US Bureau of Labor Statistics</u></a> puts the median annual wage for software developers at $135,980 (May 2025). Wages are not what an employer pays: in <a href="https://www.bls.gov/opub/ted/2026/compensation-costs-for-private-industry-workers-averaged-46-89-per-hour-worked-in-june-2026.htm?ref=samvyo.com"><u>BLS compensation data for June 2026</u></a>, wages and salaries were 70.0% of private-industry employer costs, with benefits the other 30.0%. Applying that ratio — an approximation, since it is the all-industry figure — gives a loaded cost of about <strong>$194,000 a year, or $16,188 a month, per full-time engineer.</strong></p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="212"><col width="206"><col width="206"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Engineering allocation</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Monthly loaded cost</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What that usually buys</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">0.25 FTE</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$4,047</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Upgrades, patching, on-call for a stable deployment</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">0.5 FTE</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$8,094</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The above, plus scaling work and incident follow-up</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1.0 FTE</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$16,188</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A dedicated owner for the video stack</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The right fraction cannot be looked up; it depends on how much the deployment changes and how much downtime costs you. But the arithmetic is unforgiving: <strong>a quarter of one engineer costs more than the servers and the metered egress combined.</strong> Any self-hosting case that leaves this line out, or rounds it to "a few hours a month," is comparing a real invoice against an imaginary one.</p><p>The fair comparison is self-hosted video cost against what the same calls cost to buy.</p><h2 id="what-the-same-calls-cost-from-a-provider"><strong>What the same calls cost from a provider</strong></h2><p>Providers price this workload in two different ways, and the difference matters more than the headline rate.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="150"><col width="287"><col width="187"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Provider</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Published rate</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">This workload / month</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Twilio Video</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">"$0.004 per participant per minute" (</span><a href="https://www.twilio.com/en-us/video/pricing?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#2860d0;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">pricing</span></a><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">)</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$4,000</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">LiveKit Cloud (Scale)</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$500/month including 1.5M WebRTC minutes and 3 TB; then $0.10/GB downstream (</span><a href="https://livekit.com/pricing?ref=samvyo.com" style="text-decoration:none;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#2860d0;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">pricing</span></a><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">)</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$2,000 ($500 + 15 TB of overage)</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>At a million participant-minutes, both providers are cheaper than self-hosting on public cloud with a quarter of an engineer, and LiveKit's bandwidth-based model is cheaper than self-hosting even on free egress. That is the honest starting point: <strong>at this scale, self-hosting does not save money.</strong> The broader shape of per-minute pricing is covered in <a href="https://samvyo.com/blog/per-minute-video-pricing-at-scale-what-enterprise-teams-actually-pay?ref=samvyo.com"><u>what enterprise teams actually pay per minute</u></a>.</p><p>The picture changes with volume, because the provider bill grows with every minute and most of the self-hosted video cost does not.</p><h2 id="where-self-hosting-breaks-even"><strong>Where self-hosting breaks even</strong></h2><p>Self-hosting has a fixed cost (engineering plus servers) and a small cost per minute (egress, if metered). A provider has almost no fixed cost and a larger cost per minute. Break-even is the volume at which the per-minute savings pay for the fixed cost:</p><p><strong>break-even minutes = fixed monthly cost ÷ (provider cost per minute − your cost per minute)</strong></p><p>On this workload, the provider costs per participant-minute are $0.004 for Twilio and about $0.0022 for LiveKit beyond its included allowance ($0.0004 per minute plus 18 MB at $0.10/GB). Self-hosting costs about $0.0016 per minute on metered egress and effectively zero on bundled bandwidth.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="137"><col width="125"><col width="125"><col width="119"><col width="119"/></col></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Engineering allocation</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">vs Twilio — cloud egress</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">vs Twilio — bundled</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">vs LiveKit — cloud egress</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">vs LiveKit — bundled</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">0.25 FTE</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1.8M min/month</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1.1M</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">7.5M</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2.0M</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">0.5 FTE</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3.5M</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2.1M</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">14.5M</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3.8M</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1.0 FTE</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">6.9M</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">4.1M</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">28.4M</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">7.5M</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Three things fall out of that table:</p><ul><li><strong>Headcount moves the break-even more than anything else.</strong> Each step up in engineering allocation roughly doubles the volume you need.</li><li><strong>Venue decides whether the break-even is reachable.</strong> Against a bandwidth-priced provider on metered cloud egress, the per-minute saving is so thin that break-even runs to tens of millions of minutes. On bundled bandwidth it drops to a few million.</li><li><strong>The provider's pricing model matters as much as its rate.</strong> Per-participant-minute pricing charges the same for a viewer in a five-person room as for a speaker; bandwidth pricing tracks the real cost more closely, which leaves less margin to capture by self-hosting.</li></ul><p>None of these break-evens include TURN or recording, which exist on both sides of the comparison — and providers charge for recording separately. Twilio lists participant track recordings at the same $0.004 per participant-minute and compositions at $0.01 per composed minute.</p><p>Which is why self-hosted video cost is rarely the whole reason anyone self-hosts.</p><h2 id="the-cost-question-and-the-control-question"><strong>The cost question and the control question</strong></h2><p>Below a few million minutes a month, the numbers above say to buy. Teams self-host anyway when something other than the invoice decides it: where the media is allowed to go, who can access recordings, and what they can prove to a regulator or customer about both. Those are control questions, and the answer to them is the same one that makes self-hosting cheap at scale — owning the media path.</p><p>The practical reading is that the cost model tells you <strong>what control costs</strong>, not whether to want it. If control is a requirement, the model tells you how to buy it efficiently: bundled bandwidth, a realistic engineering allocation, and a platform that does not make you build every piece yourself. What that deployment consists of is laid out in <a href="https://samvyo.com/blog/self-hosted-video-architecture-what-you-actually-run-to-self-host-real-time-video?ref=samvyo.com"><u>what you actually run to self-host real-time video</u></a>.</p><h2 id="build-buy-or-deploy"><strong>Build, buy, or deploy</strong></h2><h3 id="build-on-open-source"><strong>Build on open source</strong></h3><p>mediasoup, Janus, Pion and LiveKit's open-source server are production-grade and free to license — <a href="https://samvyo.com/blog/webrtc-media-servers-why-when-and-how-to-choose-one-for-your-next-app?ref=samvyo.com"><u>choosing between them</u></a> is its own decision. This route has the lowest cost per minute of any option once the engineering is in place, and the highest fixed cost. It wins at high volume, on bundled bandwidth, with an engineer who owns it.</p><h3 id="buy-from-a-provider"><strong>Buy from a provider</strong></h3><p>At low or unpredictable volume, a provider is cheaper than anything you can run, and the numbers above show that holds well past a million minutes a month. The trade is control: the media path, relay and recording run on the provider's infrastructure and terms.</p><h3 id="deploy-a-commercial-platform-on-your-own-infrastructure"><strong>Deploy a commercial platform on your own infrastructure</strong></h3><p>The middle path puts the media on infrastructure you choose while shrinking the engineering line. Samvyo is one such option: based on SFU architecture, shipping embeddable SDKs, with the media path, TURN and recording running on infrastructure you control, and resilient by design. Where it does not fit: at low volume with no control requirement, a per-minute provider is simpler and cheaper; and a team with deep WebRTC expertise and its own bare-metal footprint can reasonably build.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Self-hosted video cost is decided by engineering time and hosting venue, not by servers. On published prices, a million participant-minutes a month is cheaper to buy; self-hosting breaks even in the low millions on bundled bandwidth and much later on metered cloud egress.</p><p>Price the people honestly, price the egress at your real venue, and decide separately how much the control is worth to you.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>The technical companion, </em><a href="https://samvyo.com/blog/self-hosted-video-architecture-what-you-actually-run-to-self-host-real-time-video?ref=samvyo.com"><em><u>what you actually run to self-host real-time video</u></em></a><em>, walks the deployment behind these line items. For why the hosting venue swings the egress line by two orders of magnitude, read </em><a href="https://samvyo.com/blog/scaling-video-cost-what-happens-when-one-media-server-isnt-enough?ref=samvyo.com"><em><u>scaling video cost past one media server</u></em></a><em>.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What is the biggest self-hosted video cost?</strong></p><p>Engineering time. On published list prices, the servers for a million participant-minutes a month cost under $300, while a quarter of one loaded US software engineer costs about $4,000 a month. Egress is the second-largest line, and only on metered cloud networks.</p><p><strong>Is self-hosting video cheaper than Twilio or LiveKit?</strong></p><p>At low volume, no. On this model a million participant-minutes a month costs $4,000 on Twilio and about $2,000 on LiveKit Cloud, against about $5,960 self-hosted on public cloud with a quarter-time engineer. Self-hosting breaks even in the low millions of minutes on bundled bandwidth.</p><p><strong>How much of self-hosted video cost is servers?</strong></p><p>Very little. mediasoup documents one worker per core handling over ~500 outbound streams, so a workload peaking at 760 streams fits in two cores — about $294 a month at cloud list prices, even with redundancy. That is a small line compared with people and egress.</p><p><strong>Why does hosting venue matter so much?</strong></p><p>Because video is egress-heavy. Metered cloud egress at around $0.09/GB turns 18 TB a month into $1,620, while hosts with bundled traffic include it. That single difference moves the break-even point by millions of minutes.</p><p><strong>What does self-hosting cost in engineering headcount?</strong></p><p>It depends on how stable the deployment is, but budget at least a fraction of one engineer for patching, upgrades and on-call. Using BLS data, a loaded US software developer costs roughly $16,000 a month, so each quarter of an engineer is about $4,000.</p><p><strong>Can we self-host without building everything ourselves?</strong></p><p>Yes. Some commercial platforms deploy on infrastructure you choose, keeping the media path, TURN and recording under your control while reducing the engineering you own. Samvyo works this way; the hosting venue and retention decisions are still yours.</p>]]></content:encoded></item><item><title><![CDATA[Video Recording Storage Cost: The 24/7 Bill Your Retention Policy Controls]]></title><description><![CDATA[Video recording storage cost for a 24/7 camera starts at 21.6 GB a day at 2 Mbps. Multiply by cameras and retention days and you have a bill that, unlike most cloud costs, stops growing. Why retention is the lever, and why cutting it below 90 days can save nothing.]]></description><link>https://www.samvyo.com/blog/video-recording-storage-cost-the-24-7-bill-your-retention-policy-controls</link><guid isPermaLink="false">6ab296888b45c3f0cd63aa13</guid><category><![CDATA[cost-benefit analysis]]></category><category><![CDATA[video surveillance]]></category><category><![CDATA[storage]]></category><category><![CDATA[recording]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 23 Sep 2026 05:38:43 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-22--2026--08_26_32-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-22--2026--08_26_32-PM.png" alt="Video Recording Storage Cost: The 24/7 Bill Your Retention Policy Controls"/><p>A camera recording around the clock at 2 Mbps writes 21.6 GB a day. A hundred of them write 2.16 TB. Whether it is CCTV storage for a camera estate or a continuously recorded service, nobody argues with those numbers, and almost nobody budgets from them correctly.</p><p>The mistake is treating video recording storage cost as something that grows forever. For continuous recording it does not. Once the oldest footage starts being deleted as new footage arrives, the amount stored stops rising and the bill flattens into a plateau. Where that plateau sits is set by three numbers, and the one you control most directly is not the camera or the provider. It is the retention policy.</p><h2 id="the-formula-behind-video-recording-storage-cost"><strong>The formula behind video recording storage cost</strong></h2><p>For continuous recording, the amount you store at steady state is:</p><p><strong>stored data = cameras × bitrate × seconds per day × retention days</strong></p><p>and the monthly bill is that figure times the price per GB-month. There is no growth term. A 30-day policy stores 30 days of footage on day 31 and on day 900 alike.</p><p>That is the key difference from per-session recording. A service that records verification calls and keeps them for years grows every month — the shape priced in <a href="https://samvyo.com/blog/video-recording-at-scale-architecture-storage-and-the-compliance-trap?ref=samvyo.com"><u>the compliance trap in recording at scale</u></a>. A camera estate with a fixed retention period reaches its ceiling in one retention cycle and stays there.</p><p>So the question is what goes into each of the three terms of video recording storage cost.</p><h2 id="bitrate-the-number-you-cant-look-up"><strong>Bitrate: the number you can't look up</strong></h2><p>Bitrate is the term people most want a standard figure for, and there isn't one. It depends on resolution, codec, frame rate, scene content and encoder settings. How much it varies is visible in <a href="https://whitepapers.axis.com/en-us/axis-zipstream-technology?ref=samvyo.com"><u>Axis's own Zipstream white paper</u></a>: the same storage-reduction technology cuts bitrate by 25% on a well-lit scene with occasional motion, 50% on a daytime overview, and 90% on a dark scene with occasional motion. No single number describes all three.</p><p>This post therefore uses <strong>2 Mbps per camera as a round planning assumption</strong>, with 1 and 4 Mbps either side to show how sensitive the result is. Replace it with the average your own recorders report — the average, not the configured maximum, because the average is what gets written to disk.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="187"><col width="218"><col width="218"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Average bitrate per camera</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Written per day</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Written per 30 days</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1 Mbps</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">10.8 GB</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">324 GB</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2 Mbps</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">21.6 GB</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">648 GB</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">4 Mbps</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">43.2 GB</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1,296 GB</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Codec choice lives in this term too. Storage codecs such as H.265 reduce bitrate for the same picture, with consequences for the live path covered in <a href="https://samvyo.com/blog/h-264-vs-h-265-over-webrtc-why-the-storage-codec-breaks-the-live-path?ref=samvyo.com"><u>why the storage codec breaks the live path</u></a>.</p><p>Bitrate sets how fast footage arrives. Retention sets how long it stays — and that is where video recording storage cost is decided.</p><h2 id="retention-the-lever-on-video-recording-storage-cost"><strong>Retention: the lever on video recording storage cost</strong></h2><p>Holding cameras and bitrate constant, the stored volume is exactly proportional to retention. Double the days, double the bill. Here is one estate — 100 cameras at 2 Mbps — at list prices from <a href="https://aws.amazon.com/s3/pricing/?ref=samvyo.com"><u>Amazon S3</u></a> (Standard, $0.023 per GB-month) and <a href="https://www.backblaze.com/cloud-storage/pricing?ref=samvyo.com"><u>Backblaze B2</u></a> (from $6.95 per TB-month):</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="125"><col width="150"><col width="175"><col width="175"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Retention</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Stored at steady state</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">S3 Standard / month</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Backblaze B2 / month</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">30 days</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">64.8 TB</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$1,490</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$450</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">90 days</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">194.4 TB</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$4,471</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$1,351</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">180 days</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">388.8 TB</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$8,942</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$2,702</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">365 days</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">788.4 TB</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$18,133</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$5,479</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Two things stand out. The spread between providers is a constant factor of about three, while the spread between retention policies is a factor of twelve. And the jump from 90 to 365 days quadruples the bill — worth weighing against how often footage older than 90 days is actually reviewed in your own estate.</p><p>Retention is not only a cost decision. The GDPR's storage-limitation principle in <a href="https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX%3A32016R0679&ref=samvyo.com"><u>Article 5(1)(e)</u></a> says personal data should be kept "for no longer than necessary for the purposes for which the personal data are processed," and footage of identifiable people is personal data. The period that is cheapest and the period that is defensible usually point the same way: as short as the purpose allows.</p><p>Shorter retention does not automatically lower video recording storage cost, though. On some providers it saves nothing at all.</p><h2 id="the-minimum-duration-trap"><strong>The minimum-duration trap</strong></h2><p>Several storage services charge for a minimum period no matter when you delete. Wasabi's <a href="https://docs.wasabi.com/docs/how-does-wasabis-minimum-storage-duration-policy-work?ref=samvyo.com"><u>minimum storage duration policy</u></a> states that if objects are deleted early, "a Timed Deleted Storage charge equal to the storage charge for the remaining days will be applied," and uses 90 days as its worked example. Wasabi's <a href="https://wasabi.com/pricing/faq?ref=samvyo.com"><u>pay-as-you-go price</u></a> is $7.99 per TB-month — but on a 30-day camera retention policy, each byte is billed for 90 days.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="187"><col width="218"><col width="218"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Retention on a 90-day-minimum service</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Effective price per TB-month stored</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">100 cameras at 2 Mbps / month</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">30 days</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$23.97 (3× list)</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$1,553</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">60 days</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$11.99 (1.5× list)</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$1,553</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">90 days</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$7.99 (list)</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$1,553</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Every row costs the same. Below the minimum, shortening retention cuts the data you keep and none of the money you pay — and at 30 days the "cheap" provider costs more than S3 Standard. Amazon's colder tiers have the same property: S3 Glacier Instant Retrieval has a 90-day minimum and Glacier Deep Archive 180 days, per the <a href="https://aws.amazon.com/s3/pricing/?ref=samvyo.com"><u>S3 pricing page</u></a>. Backblaze B2 states it has "no minimum storage duration fees."</p><p>The rule is simple: <strong>compare providers at your retention period, not at their list price.</strong> Effective price = list price × (the greater of your retention or their minimum) ÷ your retention.</p><p>Storage is the cost of keeping footage. Video recording storage cost has a second half: using it.</p><h2 id="retrieval-and-egress-the-other-half-of-the-bill"><strong>Retrieval and egress: the other half of the bill</strong></h2><p>Footage that is written and never read costs only storage. Footage that is reviewed, exported or streamed back to a control room costs egress too, and the providers price that very differently.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="150"><col width="474"/></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Provider</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Outbound data transfer, as published</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Amazon S3</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$0.09 per GB to the internet for the first 10 TB a month — about $90 per TB pulled out</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Backblaze B2</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Free "up to 3x their average monthly storage," then $0.01 per GB</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Wasabi</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Free while monthly egress is "less than or equal to your active storage volume"</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>For a typical camera estate, where a small fraction of footage is ever reviewed, egress is minor. It stops being minor when recordings are routinely streamed back for review, or when an investigation pulls weeks of footage at once. Where footage is watched live, the bottleneck is usually elsewhere — <a href="https://samvyo.com/blog/why-watching-500-cameras-is-a-decode-problem-not-a-bandwidth-problem?ref=samvyo.com"><u>watching 500 cameras is a decode problem</u></a>, not a storage one.</p><p>Which leaves the practical question: how do you set retention so it is both cheap and safe?</p><h2 id="setting-retention-by-class-not-by-estate"><strong>Setting retention by class, not by estate</strong></h2><p>The expensive pattern is one retention period for everything, set to satisfy the most demanding camera. The cheaper and more defensible pattern is retention by class, with incidents lifted out.</p><ul><li><strong>Default class, short period.</strong> This is footage kept in case something happens. Keep it for the shortest period your purpose and your rules allow.</li><li><strong>Sensitive classes, longer period.</strong> Cash desks, entrances or regulated areas may justify more. Give them their own class rather than raising the whole estate.</li><li><strong>Incidents, held indefinitely until released.</strong> When something happens, the relevant footage goes under a legal hold and leaves the retention schedule entirely. That is how <a href="https://samvyo.com/blog/evidentiary-video-recording-timestamps-retention-and-export-that-hold-up-later?ref=samvyo.com"><u>evidentiary video recording</u></a> survives a short default period.</li><li><strong>Tier by age where retrieval allows.</strong> Older footage can move to a colder, cheaper tier — as long as its retention outlasts that tier's minimum and retrieval latency is acceptable. How lifecycle tiering fits the pipeline is in <a href="https://samvyo.com/blog/video-recording-architecture-what-runs-behind-the-pipeline-at-scale?ref=samvyo.com"><u>what runs behind the recording pipeline at scale</u></a>.</li></ul><p>The same arithmetic shows why coverage decisions compound. Every camera you add raises the plateau permanently, which is worth weighing alongside <a href="https://samvyo.com/blog/the-operator-to-camera-ratio-that-decides-whether-proactive-monitoring-pays?ref=samvyo.com"><u>the operator-to-camera ratio</u></a> that decides whether anyone is watching them live.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>For continuous recording, video recording storage cost is cameras × bitrate × retention days × price — and it plateaus once retention is reached. Of those terms, retention is the one a policy decision moves directly, and it moves the bill far more than the choice of provider.</p><p>Price providers at your actual retention period, because a 90-day minimum makes anything shorter cost the same. Then keep the default short and hold incidents separately.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>For how per-session recordings grow instead of plateauing, and why egress often outweighs storage, read </em><a href="https://samvyo.com/blog/video-recording-at-scale-architecture-storage-and-the-compliance-trap?ref=samvyo.com"><em><u>the compliance trap in recording at scale</u></em></a><em>. For keeping specific footage safely beyond a short default, see </em><a href="https://samvyo.com/blog/evidentiary-video-recording-timestamps-retention-and-export-that-hold-up-later?ref=samvyo.com"><em><u>evidentiary video recording</u></em></a><em>.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>How do I calculate video recording storage cost for 24/7 cameras?</strong></p><p>Multiply cameras by average bitrate by seconds per day by retention days to get stored data, then multiply by the price per GB-month. One camera at 2 Mbps writes 21.6 GB a day, so 100 cameras on a 30-day policy store about 64.8 TB — roughly $1,490 a month on S3 Standard list pricing or $450 on Backblaze B2.</p><p><strong>Does video storage cost keep growing every month?</strong></p><p>Not for continuous recording with a fixed retention period. Once the oldest footage is deleted as new footage arrives, stored volume stops growing and the bill flattens. Per-session recordings kept for years are different: they grow until the retention period is reached.</p><p><strong>What bitrate should I assume for a surveillance camera?</strong></p><p>There is no standard figure; it varies with resolution, codec, frame rate and scene. Axis reports bitrate reductions from 25% to 90% or more for the same technology depending on scene. Use the average your recorders actually report, not the configured maximum.</p><p><strong>Why doesn't shortening retention always reduce video recording storage cost?</strong></p><p>Some storage services charge a minimum storage duration. On a 90-day-minimum service, footage deleted after 30 days is still billed for 90, so a 30-day and a 90-day policy cost the same. Compare providers at your actual retention period.</p><p><strong>Is cold storage cheaper for surveillance footage?</strong></p><p>Often, but check the tier's minimum duration and retrieval time. S3 Glacier Deep Archive has a 180-day minimum and is designed for rarely accessed data, so it suits long-held footage that is seldom reviewed, not a 30-day rolling buffer.</p><p><strong>How long should CCTV footage be kept?</strong></p><p>As long as the purpose requires and no longer — the GDPR storage-limitation principle points the same way as the cost. Sector rules can set specific periods. Use short default retention, longer classes where justified, and legal holds for incidents.</p><p><strong>Can recordings be stored on our own infrastructure instead of a cloud bucket?</strong></p><p>Yes, if the platform lets recording storage run on infrastructure you control. Samvyo works this way: it is based on SFU architecture and keeps recording processing and storage on your side, so the storage bill follows your own hardware or cloud contract and retention policy.</p>]]></content:encoded></item><item><title><![CDATA[Evidentiary Video Recording: Timestamps, Retention, and Export That Hold Up Later]]></title><description><![CDATA[Evidentiary video recording rarely fails on the day. It fails a year later, when the clock turns out to be minutes off, the hour before the incident has been auto-deleted, and the only copy is a re-encoded MP4 nobody can vouch for. The procedure that prevents each.]]></description><link>https://www.samvyo.com/blog/evidentiary-video-recording-timestamps-retention-and-export-that-hold-up-later</link><guid isPermaLink="false">6ab295d28b45c3f0cd63a9fd</guid><category><![CDATA[video compliance]]></category><category><![CDATA[Chain of Custody]]></category><category><![CDATA[recording]]></category><category><![CDATA[video surveillance]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 23 Sep 2026 05:38:36 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-22--2026--08_22_28-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-22--2026--08_22_28-PM.png" alt="Evidentiary Video Recording: Timestamps, Retention, and Export That Hold Up Later"/><p>Footage almost never fails as evidence on the day it is recorded. It fails eleven months later, in a meeting nobody planned for.</p><p>The recorder clock turns out to have been seven minutes fast. The hour before the incident was deleted on schedule, three weeks after someone first mentioned a complaint. The only copy anyone can find is an MP4 exported from a phone screen, and the person who set the system up has left. Each of those is an ordinary failure of evidentiary video recording, and none of them is a technology problem. They are procedure problems that the technology either makes easy or makes impossible.</p><p>This post covers the three places footage breaks after the fact — time, retention and export — and the person who has to stand behind all three.</p><h2 id="what-makes-an-evidentiary-video-recording"><strong>What makes an evidentiary video recording</strong></h2><p>An evidentiary video recording — footage meant to serve as video evidence — is one that can be produced later and shown to be what it claims to be: from this source, at this time, complete, unaltered, and handled by identifiable people since. The legal requirements behind that — a description of the process and a hash of the record — are laid out in <a href="https://samvyo.com/blog/video-chain-of-custody-why-a-record-button-isnt-one?ref=samvyo.com"><u>what a video chain of custody actually requires</u></a>. The engineering that produces the proof is in <a href="https://samvyo.com/blog/the-recording-architecture-audit-six-things-your-pipeline-has-to-prove?ref=samvyo.com"><u>the recording architecture audit</u></a>.</p><p>What sits between the two is the practice of evidentiary video recording. The best-designed pipeline still produces weak evidence if nobody checks the clock, the retention job deletes what should have been held, or an export leaves the building as a convenience copy. Time goes first, because every other claim depends on it.</p><h2 id="timestamps-record-the-offset-never-fix-the-clock"><strong>Timestamps: record the offset, never fix the clock</strong></h2><p>Every recorder has a clock, and every clock drifts. On a surveillance estate the drift is different on every device, <a href="https://samvyo.com/blog/multi-camera-synchronization-why-your-four-angles-drift-out-of-alignment?ref=samvyo.com"><u>which is why four camera angles drift out of alignment</u></a>. On a video platform, each server has its own. The question an examiner asks is not whether the clock was right. It is whether you know by how much it was wrong.</p><p>The forensic guidance is specific, and slightly counterintuitive. <a href="https://www.swgde.org/wp-content/uploads/2025/03/2025-02-28-Best-Practices-for-Data-Acquisition-from-Digital-Video-Recorders-17-V-002-1.3.pdf?ref=samvyo.com"><u>SWGDE's best practices for acquiring video from recorders</u></a> tell examiners to "calculate if there is a time offset between real time and the DVR system clock" — and, in a footnote, "do not change the time and date on the DVR system." Correcting the clock at the moment of collection destroys the evidence of how far off it was, and makes every earlier timestamp harder to interpret.</p><p>For an operator, that turns into three habits:</p><ul><li><strong>Discipline the clocks going forward.</strong> Synchronise recorders and media servers to a reliable time source, so drift stays small.</li><li><strong>Log the offset continuously, not only at collection.</strong> A periodic record of "device time vs reference time" lets anyone correct any timestamp later. A single check on the day of export only tells you about that day.</li><li><strong>Never "fix" a clock as part of pulling footage.</strong> Record the offset, export, then correct the clock as a separate, logged change.</li></ul><p>The formal paperwork expects this precision too. The certificate in the Schedule of India's <a href="https://www.mha.gov.in/sites/default/files/2024-04/250882_english_01042024_0.pdf?ref=samvyo.com"><u>Bharatiya Sakshya Adhiniyam, 2023</u></a> asks for the date and the "Time (IST): ___ hours (In 24 hours format)" at which it is signed. If the certificate is exact about its own time, the footage it certifies should be exact about its own.</p><p>For evidentiary video recording, an accurate timestamp only helps if the footage still exists when someone needs it.</p><h2 id="retention-the-schedule-deletes-the-hold-preserves"><strong>Retention: the schedule deletes, the hold preserves</strong></h2><p>Two obligations pull in opposite directions, and both are real.</p><p>Data protection law pushes toward deleting. The GDPR's storage limitation principle, <a href="https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX%3A32016R0679&ref=samvyo.com"><u>Article 5(1)(e)</u></a>, says personal data must be kept "for no longer than necessary for the purposes for which the personal data are processed." Video of identifiable people is personal data, so a retention period is not optional and "keep everything forever" is not a strategy.</p><p>Litigation pushes toward keeping. In US federal courts, <a href="https://www.law.cornell.edu/rules/frcp/rule_37?ref=samvyo.com"><u>Rule 37(e)</u></a> covers electronically stored information "that should have been preserved in the anticipation or conduct of litigation" and is lost because a party "failed to take reasonable steps to preserve it." If the court finds intent to deprive the other side, it may presume the lost information "was unfavorable to the party." Deleting on schedule is defensible. Deleting on schedule after you had reason to expect a dispute is not.</p><p>The two are reconciled by keeping them as separate mechanisms:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="137"><col width="243"><col width="243"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><br/></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Retention schedule</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Legal hold</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Purpose</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Delete when the purpose has been served</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Keep specific footage regardless of the schedule</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Scope</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Every recording in a class</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Named recordings, cameras, sessions or date ranges</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Duration</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Fixed period per class of recording</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Until someone with authority releases it</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Triggered by</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Time</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A complaint, claim, incident report or request</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Owner</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Records / compliance lead</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Legal, on notice from anyone in operations</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The failure that matters is the gap between them: the incident is reported to a store manager on Monday, the footage rolls off on Thursday, and legal hears about it in a month. The fix is procedural — anyone who receives a complaint about something on camera can place a hold, immediately, without waiting for legal to decide whether it matters. A hold that turns out to be unnecessary costs some storage. A hold that was never placed costs the evidence.</p><p>The storage layer has to support this. S3 Object Lock, for example, has a <a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html?ref=samvyo.com"><u>legal hold</u></a> that "doesn't have an associated fixed amount of time and remains in effect until removed," separate from the retention period. Whether a retention period can be cut short by an administrator is a different and more dangerous question — governance and compliance modes are not the same thing. How long each class should be kept depends on the regime; the cost side of long retention is in <a href="https://samvyo.com/blog/video-recording-at-scale-architecture-storage-and-the-compliance-trap?ref=samvyo.com"><u>the compliance trap in recording at scale</u></a>.</p><p>Footage that survives is still only as good as the copy that leaves the system.</p><h2 id="export-two-copies-with-two-jobs"><strong>Export: two copies with two jobs</strong></h2><p>The export is where evidentiary video recording most often breaks, because it is the moment convenience wins. Someone needs to see the clip, so it gets re-encoded to MP4, trimmed, emailed, and the trimmed MP4 becomes "the footage."</p><p>SWGDE's guidance is unambiguous about which copy is evidence: "a native file format or proprietary file format is likely to provide best evidence for legal authenticity purposes as it is closest to the original manner of recording." Its field worksheet instructs examiners to "create a hash value for any video retrieved," and where a system records in a proprietary format, the player goes with the files — "the examiner may have to manually select this option to copy the viewer along with video files."</p><p>In practice, every export produces two things, clearly labelled:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="150"><col width="237"><col width="237"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><br/></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Evidence copy</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Working copy</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Format</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Native, as recorded</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Whatever plays easily (MP4)</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Scope</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The full relevant period, untrimmed</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Trimmed to the moment people need to see</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Integrity</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Hashed at export; hash recorded in the export log</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Not relied on; says so in its name</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Goes with it</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Proprietary player if needed, clock-offset record, manifest</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Nothing</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Who handles it</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Logged at every handover</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Anyone who needs to watch</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The export log matters as much as the file. Who exported it, when, what hash it had, and who it was handed to next is the custody record for the life of that copy. On a surveillance estate this is often the weakest point — the footage behind a <a href="https://samvyo.com/blog/retail-loss-prevention-in-real-time-from-reviewing-theft-to-interrupting-it?ref=samvyo.com"><u>retail loss-prevention</u></a> case or a <a href="https://samvyo.com/blog/perimeter-intrusion-detection-catching-the-loiter-and-probe-before-the-breach?ref=samvyo.com"><u>perimeter intrusion</u></a> tends to be pulled in a hurry by whoever is on shift.</p><p>All of this eventually has to be put into words by a person.</p><h2 id="name-the-person-who-will-sign"><strong>Name the person who will sign</strong></h2><p>Evidence law does not accept a system on its own word. Every evidentiary video recording needs someone to describe it.</p><p>In the US, self-authenticating electronic records under <a href="https://www.law.cornell.edu/rules/fre/rule_902?ref=samvyo.com"><u>Rule 902(13) and (14)</u></a> depend on "a certification of a qualified person," and Rule 902(11) requires the proponent to give the other side "reasonable written notice" and make the record and certification available for inspection. In India, section 63(4) of the BSA requires a certificate "purporting to be signed by a person in charge of the computer or communication device or the management of the relevant activities" and an expert, and the Schedule's Part A asks the signatory to confirm that the device "was working properly" throughout.</p><p>That person needs to exist before the incident, not be found after it. Name the role — usually whoever owns the recording system operationally — and make sure they can explain, in plain language:</p><ul><li>How recordings are captured, stored, and protected from change or deletion.</li><li>How clocks are synchronised and how offsets are logged.</li><li>What the retention schedule is, how holds are placed, and who can release them.</li><li>How exports are made, hashed, logged and handed over.</li><li>Whether the system was working properly during the period in question — and what the logs show if it was not.</li></ul><p>If nobody in the organisation can answer those five without asking a vendor, that is the first gap to close.</p><h2 id="an-evidentiary-video-recording-runbook"><strong>An evidentiary video recording runbook</strong></h2><p>The whole practice fits on a page. Each step names who does it and what it leaves behind.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="187"><col width="156"><col width="281"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Step</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Who</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Evidence it produces</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Clock sync and offset logging</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Platform / IT</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Continuous device-vs-reference time record</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Retention schedule per class</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Records / compliance</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A written schedule and automated deletion logs</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Hold on first notice</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Anyone who receives a complaint</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A dated hold, scoped to specific footage</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Native export with hash</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Designated operator</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Evidence copy, hash, player, offset record</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Export and handover log</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Designated operator</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Who had which copy, when</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Certification</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Named system owner (+ expert where required)</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A certificate they can defend</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Evidentiary video recording fails later, not on the day — through a clock nobody measured, a deletion nobody paused, or an export nobody can vouch for. Record clock offsets instead of fixing clocks, keep retention and legal holds as separate mechanisms with a hold anyone can place, and export a hashed native copy alongside the convenient one.</p><p>Then name the person who will sign, while there is still time for them to learn what they will be asked.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>For what the law actually asks of recorded footage, read </em><a href="https://samvyo.com/blog/video-chain-of-custody-why-a-record-button-isnt-one?ref=samvyo.com"><em><u>what a video chain of custody requires</u></em></a><em>. For the pipeline evidence underneath this procedure — manifests, chained hashes and object-lock modes — see </em><a href="https://samvyo.com/blog/the-recording-architecture-audit-six-things-your-pipeline-has-to-prove?ref=samvyo.com"><em><u>the recording architecture audit</u></em></a><em>.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What makes an evidentiary video recording admissible?</strong></p><p>It has to be shown to be what it claims to be: from a known source, at a known time, complete and unaltered, with a record of who handled it. In practice that means a known clock offset, retention that did not delete it, a hashed native export, and a person who can describe the system. Admissibility itself is decided by a court.</p><p><strong>Should I correct the DVR time before exporting evidentiary video recording footage?</strong></p><p>No. Forensic guidance says to calculate the offset between the recorder clock and real time, and not to change the date and time on the device. Record the offset, export, and only then correct the clock as a separate logged change.</p><p><strong>How long should video recordings be retained for evidence?</strong></p><p>Long enough for the purpose, and no longer — the GDPR's storage-limitation principle makes open-ended retention hard to justify. Set a fixed period per class of recording, and use legal holds to keep specific footage beyond that period when a dispute is expected. The period itself depends on the regime and sector.</p><p><strong>What is a legal hold on video footage?</strong></p><p>An instruction to preserve specific recordings regardless of the normal retention schedule, until someone with authority releases it. In US federal courts, failing to take reasonable steps to preserve information once litigation is anticipated can lead to sanctions under Rule 37(e).</p><p><strong>Is an MP4 export good enough as evidence?</strong></p><p>As a working copy, yes. As the evidence copy, it is weaker: forensic guidance treats the native format as the best evidence because it is closest to how the footage was recorded. Export both, hash the native copy, and label the MP4 as a working copy.</p><p><strong>Who signs the certificate for a video recording in India?</strong></p><p>Under section 63(4) of the Bharatiya Sakshya Adhiniyam, 2023, the certificate is signed by a person in charge of the device or the management of the relevant activities, and an expert. The Schedule sets out the form, including the hash value and algorithm.</p><p><strong>Can our recordings and exports stay on our own infrastructure?</strong></p><p>Yes, if recording processing and storage run on infrastructure you control. Samvyo works this way, so clocks, retention, holds and exports are governed by your own procedures rather than a vendor's. The runbook above still has to be yours.</p>]]></content:encoded></item><item><title><![CDATA[Composite vs Per-Track Recording: The Choice That Decides Whether You Can Redact]]></title><description><![CDATA[Composite vs per-track recording decides whether redaction is a selection or a project. A composite file is easy to play and nearly impossible to take apart; when the law says others must be masked, that matters. Tracks can become a composite — a composite never becomes tracks.]]></description><link>https://www.samvyo.com/blog/composite-vs-per-track-recording-the-choice-that-decides-whether-you-can-redact</link><guid isPermaLink="false">6ab28dd08b45c3f0cd63a9e5</guid><category><![CDATA[video compliance]]></category><category><![CDATA[Redaction]]></category><category><![CDATA[video recording architecture]]></category><category><![CDATA[recording]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 23 Sep 2026 05:38:30 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-22--2026--08_17_35-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-22--2026--08_17_35-PM.png" alt="Composite vs Per-Track Recording: The Choice That Decides Whether You Can Redact"/><p>Someone who was on a recorded call asks for their copy. The law says you have to give it to them — and that you have to protect everyone else who was on it.</p><p>Whether that takes ten minutes or ten days was decided long before the request arrived, on the day someone picked a recording mode. Composite vs per-track recording is usually framed as a question of convenience and cost. It is really a question of reversibility: <strong>you can always mix separate tracks into one file later, and you can never pull a mixed file back apart into tracks.</strong></p><p>This post argues composite vs per-track recording from that one-way door.</p><h2 id="composite-vs-per-track-recording-in-one-paragraph"><strong>Composite vs per-track recording, in one paragraph</strong></h2><p>A composite recording renders the call the way a participant saw it — a layout of tiles, one mixed audio track — and encodes that into a single file. <a href="https://github.com/jitsi/jibri?ref=samvyo.com"><u>Jibri</u></a> is the classic example: it launches "a Chrome instance rendered in a virtual framebuffer" and encodes the output. A per-track recording (Agora calls it individual recording) writes each participant's audio and video as separate streams. <a href="https://janus.conf.meetecho.com/docs/recordings.html?ref=samvyo.com"><u>Janus</u></a> is explicit about how literal that is: "each mjr file contains a single media stream," so an audio/video publisher produces two files.</p><p>The mainstream platforms offer both, which is the first sign that neither is simply better. <a href="https://docs.agora.io/en/help/integration-issues/recording_mode?ref=samvyo.com"><u>Agora</u></a> recommends individual mode "if you want more flexibility in processing the recorded files" and composite mode to store everyone "in one file, with no need to combine them after recording." <a href="https://www.twilio.com/docs/video/tutorials/understanding-video-recordings-and-compositions?ref=samvyo.com"><u>Twilio</u></a> records every track separately — seven participants with camera and microphone produce "a total of 14 media tracks" — and builds playable compositions from them afterwards. How each model behaves at scale is covered in <a href="https://samvyo.com/blog/video-recording-architecture-what-runs-behind-the-pipeline-at-scale?ref=samvyo.com"><u>the recording pipeline at scale</u></a>. What matters here is what each one lets you do on the day someone asks for a copy.</p><h2 id="the-request-that-tests-the-choice"><strong>The request that tests the choice</strong></h2><p>Under the GDPR, a person can ask for a copy of their personal data, and <a href="https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX%3A32016R0679&ref=samvyo.com"><u>Article 15(3)</u></a> says "the controller shall provide a copy." Article 15(4) adds the constraint: that right "shall not adversely affect the rights or freedoms of others."</p><p>For video, the European Data Protection Board has spelled out what that means. Its <a href="https://www.edpb.europa.eu/system/files/documents/files/file1/edpb_guidelines_201903_video_devices_en_0.pdf?ref=samvyo.com"><u>guidelines on video devices</u></a> say the controller "should not in some cases hand out video footage where other data subjects can be identified" — but that protecting third parties "should however not be used as an excuse to prevent legitimate claims of access," so the controller should "implement technical measures to fulfil the access request (for example, image-editing such as masking or scrambling)."</p><p>So the realistic request is this: one participant on a five-person, 45-minute call wants their copy, and the other four have to be masked. Here is what that asks of each recording mode.</p><h2 id="why-a-composite-recording-resists-redaction"><strong>Why a composite recording resists redaction</strong></h2><p>In a composite file, every person on the call has been fused into the same frames and the same waveform. Removing one of them is no longer an edit to a file — it is an edit to every frame of it.</p><ul><li><strong>The video is a moving target.</strong> Four other faces sit in tiles across 81,000 frames (45 minutes at 30 fps). Speaker-focused layouts move and resize those tiles every time someone new talks, so a mask drawn for minute three is in the wrong place by minute four. Automated face-tracking helps, and every miss is a disclosure.</li><li><strong>The audio is already mixed.</strong> Twilio describes its own composition audio as recordings "mixed through a linear adder." Once voices are summed into one signal, there is no clean way to subtract one. The practical options are muting whole stretches — which also silences the person who asked, whenever anyone talks over them — or source-separation tools that approximate the split.</li><li><strong>The screen share came along too.</strong> Whatever was on a shared screen — a customer list, someone else's document — is rendered into the same frames and needs the same treatment.</li></ul><p>None of this is impossible. It is manual, slow, and imperfect in exactly the places where imperfection matters — the first real cost in composite vs per-track recording. Per-track recording turns the same request into a selection.</p><h2 id="why-per-track-recording-makes-it-a-selection"><strong>Why per-track recording makes it a selection</strong></h2><p>With separate tracks, the requester's camera and microphone are already their own files. Answering the request starts by including those and leaving everyone else's out — the decision a composition step makes anyway. Twilio's description of that step is the whole point: developers "can select the specific audio recordings to be included" and the video recordings to be laid out. Exclusion is a parameter, not an edit.</p><p>The same property handles the harder variants. If the requester needs to see the conversation in context, you can compose their tracks with the others masked or replaced by a placeholder, working from clean sources rather than a mixed frame. If one participant has to be removed from an archive entirely, you delete their tracks and keep everyone else's intact.</p><p>It is not a complete answer, and the edges are worth knowing:</p><ul><li><strong>A track is a microphone, not a person.</strong> Two people sharing a meeting-room device share one track, and a microphone picks up whoever is near it. Per-track gets you to the person in most cases, not all.</li><li><strong>The requester's own track can still contain others.</strong> Their screen share, or a colleague speaking audibly behind them, still needs review.</li><li><strong>Tracks have to be re-aligned.</strong> <a href="https://datatracker.ietf.org/doc/html/rfc3550?ref=samvyo.com"><u>RFC 3550</u></a> notes that timestamps "from different media streams may advance at different rates and usually have independent, random offsets," so a recorder that discards the timing data leaves tracks that cannot be put back in sync. Keeping it is part of <a href="https://samvyo.com/blog/the-recording-architecture-audit-six-things-your-pipeline-has-to-prove?ref=samvyo.com"><u>the recording architecture audit</u></a>.</li></ul><p>Those are real limits. They are also the reason per-track is a better starting point, not a reason to prefer composite — which brings us to what composite genuinely does better.</p><h2 id="where-composite-recording-is-the-right-call"><strong>Where composite recording is the right call</strong></h2><p>Composite has honest advantages, and in many composite vs per-track recording decisions they win.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="187"><col width="218"><col width="218"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Consideration</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Composite</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Per-track</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Playable straight away</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes — one standard file</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No — Twilio notes raw track recordings are "incompatible with common media players"; Janus files need its post-processor</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What it shows</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What participants saw, layout included</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What each participant sent</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Storage</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">One encoded stream per session</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Every published stream, kept separately</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Processing</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Encoding happens live, per session</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Composition happens later, only when needed</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Redaction / access requests</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Frame-by-frame masking; mixed audio</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Select or exclude tracks; mask from clean sources</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Reversible</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No — cannot recover tracks</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes — a composite can be built at any time</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The storage row deserves a number, with its assumption stated: if each of five cameras publishes at 1 Mbps and a composite is encoded at 2 Mbps, per-track video costs about 2.5 times as much to keep. Retention multiplies that difference for as long as you hold the footage. And the recorder has to ask for the right quality — an SFU forwards whichever <a href="https://samvyo.com/blog/what-is-simulcast-and-when-does-it-save-or-waste-bandwidth?ref=samvyo.com"><u>simulcast layer</u></a> a subscriber requests, so a track recorder that accepts a thumbnail layer archives a thumbnail.</p><p>The "what it shows" row matters too. A composite is a record of what was on screen; if the question is ever "what did the participants see?", that is precisely the evidence you want. A per-track archive can reconstruct it, but only if the layout logic is reproducible.</p><p>So composite vs per-track recording is less binary than it looks.</p><h2 id="how-to-choose-between-composite-vs-per-track-recording"><strong>How to choose between composite vs per-track recording</strong></h2><p>Ask one question first: <strong>will anyone ever need to separate one person from this recording?</strong> That covers access requests, redaction for disclosure, removing a participant, and reviewing one speaker's contribution. If the honest answer is "never" — an internal all-hands, a published webinar — composite is simpler and cheaper, and the one-way door costs you nothing.</p><p>If the answer is "possibly," capture per-track and compose on demand. This is the pattern the large platforms already use, and it fits the way media servers work: an SFU forwards streams without decoding them, <a href="https://samvyo.com/blog/what-is-an-sfu-and-why-does-every-video-platform-use-one?ref=samvyo.com"><u>the property that makes it scale</u></a>, so capturing tracks is close to free for it, while composing requires decoding and re-encoding, the work <a href="https://samvyo.com/blog/sfu-vs-mcu-vs-mesh-which-topology-your-call-size-actually-needs?ref=samvyo.com"><u>an MCU does live</u></a>. Doing that work later, only for the recordings that need it, is usually cheaper than doing it for every session.</p><p>For regulated recordings — banking verification calls, disputes, anything that may be disclosed — the case for tracks is strongest, and <a href="https://samvyo.com/blog/video-recording-compliance-across-the-eu-us-and-india-what-each-regime-demands?ref=samvyo.com"><u>what each regime demands</u></a> makes it stronger.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Composite vs per-track recording is a choice about reversibility. Tracks can always become a composite; a composite never becomes tracks. When a request for a copy arrives and everyone else on the call has to be masked, that asymmetry is the difference between selecting files and editing every frame.</p><p>In composite vs per-track recording, record per-track wherever someone might one day need to be separated from the recording, and compose only what you need to play.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>For the evidence a recording pipeline has to produce beyond the recording mode — completeness, timing, chained hashes and export — read </em><a href="https://samvyo.com/blog/the-recording-architecture-audit-six-things-your-pipeline-has-to-prove?ref=samvyo.com"><em><u>the recording architecture audit</u></em></a><em>. For how composite and track recorders behave under load, see </em><a href="https://samvyo.com/blog/video-recording-architecture-what-runs-behind-the-pipeline-at-scale?ref=samvyo.com"><em><u>what runs behind the recording pipeline at scale</u></em></a><em>.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>Composite vs per-track recording: what is the difference?</strong></p><p>A composite recording mixes everyone on a call into one file, with a video layout and a single mixed audio track. A per-track recording keeps each participant's audio and video as separate streams. Per-track can be turned into a composite later; a composite cannot be split back into tracks.</p><p><strong>Is individual recording the same as per-track recording?</strong></p><p>Yes. Agora calls it individual recording mode; others call it track recording, track egress or raw capture. In every case each participant's media is written separately rather than mixed into one file.</p><p><strong>Why is it hard to redact one person from a composite recording?</strong></p><p>Because their face and voice are fused into every frame and the mixed audio. Masking means tracking their tile across a layout that changes whenever someone speaks, and mixed audio cannot be cleanly un-mixed. With per-track recording you exclude or mask their tracks instead.</p><p><strong>Does GDPR require redacting other people from a video access request?</strong></p><p>Article 15(4) says the right to a copy must not adversely affect the rights of others, and EDPB guidance on video says controllers should use technical measures such as masking or scrambling rather than refuse the request. This is how the texts read, not legal advice for a specific case.</p><p><strong>Does per-track recording cost more storage?</strong></p><p>Usually yes, because every published stream is kept separately. As an illustration, five cameras at 1 Mbps each against a 2 Mbps composite is about 2.5 times the storage. The trade is that composition work happens only for the recordings that need it.</p><p><strong>Can I record per-track and still get a normal video file?</strong></p><p>Yes. That is the common pattern: capture tracks, then compose a playable file on demand with the layout and participants you choose. Keep the tracks as the source of record and treat each composite as a derived copy.</p><p><strong>Can recordings and redacted copies stay on our own infrastructure?</strong></p><p>Yes, if the platform keeps recording processing and storage on infrastructure you control. Samvyo works this way: it is based on SFU architecture, so recordings and any redacted copies made from them stay inside your own boundary rather than a vendor's. Which recording mode fits each workflow is still a per-use-case decision.</p>]]></content:encoded></item><item><title><![CDATA[Video Chain of Custody: Why a Record Button Isn't One]]></title><description><![CDATA[The footage exists and everyone has watched it. The question is whether anyone can prove it is the same footage the camera recorded. A video chain of custody is that proof — and a record button produces none of it. What the law asks for, and where custody usually breaks.]]></description><link>https://www.samvyo.com/blog/video-chain-of-custody-why-a-record-button-isnt-one</link><guid isPermaLink="false">6ab284968b45c3f0cd63a9b9</guid><category><![CDATA[video compliance]]></category><category><![CDATA[recording]]></category><category><![CDATA[video recording architecture]]></category><category><![CDATA[Chain of Custody]]></category><category><![CDATA[Compliance Rules]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 23 Sep 2026 05:38:24 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-22--2026--07_17_11-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-22--2026--07_17_11-PM.png" alt="Video Chain of Custody: Why a Record Button Isn't One"/><p>The footage exists. Everyone in the room has watched it. The question on the table is not what it shows — it is whether anyone can prove it is the same footage the camera recorded.</p><p>That proof is a video chain of custody: the documented, verifiable history of a recording from the moment it was captured to the moment it is presented. Where it was, who could reach it, and evidence that it did not change at any step. The record button creates the file. It creates none of that history.</p><p>This is the gap most recording systems quietly leave open, and it is the one that decides whether footage settles a dispute or starts a second one.</p><h2 id="what-a-video-chain-of-custody-actually-is"><strong>What a video chain of custody actually is</strong></h2><p>Two words get used interchangeably and should not be. Integrity means the file has not changed. Authenticity is broader: <a href="https://www.swgde.org/documents/published-complete-listing/23-v-001-best-practices-for-digital-video-authentication/?ref=samvyo.com"><u>SWGDE, the standards body for digital evidence examiners</u></a>, defines authentication as "the process of substantiating that the data is an accurate representation of what it purports to be." A perfectly intact file can still be the wrong file, from the wrong camera, at the wrong time.</p><p>A video chain of custody is how you close that gap. It is not a property of the file at all — it is a record kept about the file, and it has to be kept continuously, because any interval nobody can account for is an interval in which anything could have happened.</p><p>That is also why the law treats it the way it does.</p><h2 id="what-the-law-asks-for-in-two-jurisdictions"><strong>What the law asks for, in two jurisdictions</strong></h2><p>The US and India reach the same place by different routes. What follows is how the rules read, not legal advice for a particular case.</p><p>In the US, the starting point is <a href="https://www.law.cornell.edu/rules/fre/rule_901?ref=samvyo.com"><u>Federal Rule of Evidence 901(a)</u></a>: the proponent must produce "evidence sufficient to support a finding that the item is what the proponent claims it is." For machine-made records, <a href="https://www.law.cornell.edu/rules/fre/rule_902?ref=samvyo.com"><u>Rule 902</u></a> lets that happen without a live witness. Rule 902(14) covers "data copied from an electronic device, storage medium, or file, if authenticated by a process of digital identification," certified by a qualified person — and the Committee Notes say such data is "ordinarily authenticated by 'hash value'."</p><p>In India, the <a href="https://www.mha.gov.in/sites/default/files/2024-04/250882_english_01042024_0.pdf?ref=samvyo.com"><u>Bharatiya Sakshya Adhiniyam, 2023</u></a> replaced the Indian Evidence Act, and section 63 now governs electronic records. It makes them admissible "without further proof or production of the original" if conditions are met — including that the output was produced during regular use and the device "was operating properly." The record must come with a certificate in the form set out in the Act's Schedule, and that form asks for "the HASH value/s of the electronic/digital record/s" and the algorithm used, in both the party's part and an expert's part. The same form asks which source the record came from, and lists DVR, Server and Cloud among the options, so footage from CCTV recorders and cloud storage is anticipated on the face of the form.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="162"><col width="231"><col width="231"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What is required</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">United States (FRE)</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">India (BSA 2023)</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The basic test</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">901(a): evidence the item is what it is claimed to be</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">s.63(1): admissible without the original if s.63 conditions are met</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Proof about the system</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">901(b)(9): a process or system "that produces an accurate result"</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">s.63(2): regular use, proper operation, information fed in the ordinary course</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Certification</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">902(13)/(14): certification of a qualified person, with written notice to the other side (902(11))</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">s.63(4): certificate signed by the person in charge, plus an expert's part</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The number that ties it together</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Hash value — "ordinarily," per the 902(14) Committee Notes</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Hash value and algorithm — SHA1, SHA256, MD5 or another acceptable standard — in the Schedule</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Read the two columns together and the requirement is the same in both: <strong>a description of the process that made the recording, and a hash that proves the copy matches.</strong> Neither is something a record button produces.</p><p>So where, exactly, does a video chain of custody break?</p><h2 id="the-four-links-in-a-video-chain-of-custody"><strong>The four links in a video chain of custody</strong></h2><p>Every recording passes through the same four stages, whether it is a banking video-KYC session or <a href="https://samvyo.com/blog/retail-loss-prevention-in-real-time-from-reviewing-theft-to-interrupting-it?ref=samvyo.com"><u>a clip of a theft in progress</u></a>. Each stage asks its own question, and each has a version that looks like custody and is not.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="87"><col width="162"><col width="175"><col width="200"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Link</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The question</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What a record button gives you</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What custody needs</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Capture</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Was all of it recorded, and when?</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A file with a creation date</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Numbered segments, recorded gaps, a synchronised clock</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Storage</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Could it have changed or disappeared?</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A file in a bucket or on a disk</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A hash taken at write time; retention nobody can shorten</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Access</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Who has seen or copied it?</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Perhaps a server log</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A log of every view and export that cannot itself be edited</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Export</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Is this copy the original?</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A download, often re-encoded</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Native format, a hash at export, the proof packaged with it</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Capture is where custody is most often lost for good, because it is the one link that cannot be repaired later. A hash computed the week after the incident proves the file has not changed since that week. It says nothing about the days before. The engineering behind each row — manifests, chained hashes, locked retention — is covered in <a href="https://samvyo.com/blog/the-recording-architecture-audit-six-things-your-pipeline-has-to-prove?ref=samvyo.com"><u>the evidence each pipeline stage has to produce</u></a>.</p><p>Storage is where teams most often believe they are covered when they are not.</p><h2 id="why-its-in-the-cloud-is-not-custody"><strong>Why "it's in the cloud" is not custody</strong></h2><p>A recording in a managed storage bucket feels safe, and it usually is safe from loss. A video chain of custody asks a different question — safe from whom — and three things undermine the answer.</p><ul><li><strong>The file cannot vouch for itself.</strong> SWGDE warns that video metadata "is susceptible to alteration without affecting the playback of the file" and "cannot be relied upon in isolation." Dates and camera names inside the file are claims, not proof.</li><li><strong>Administrators can usually replace it.</strong> Anyone with write access to the bucket can overwrite a file with an edited copy that plays identically. Unless a hash was recorded somewhere they cannot reach, nothing shows it happened.</li><li><strong>"Locked" often isn't.</strong> <a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html?ref=samvyo.com"><u>S3 Object Lock's governance mode</u></a> can be overridden by any user granted the s3:BypassGovernanceRetention permission; only compliance mode stops everyone, "including the root user." It is common for the first to be enabled and described as the second — the governance-mode trap.</li></ul><p>None of this means cloud storage is unsuitable. It means the storage layer is one link, and the proof has to come from outside it. The retention and jurisdiction side of the same problem is laid out in <a href="https://samvyo.com/blog/video-recording-at-scale-architecture-storage-and-the-compliance-trap?ref=samvyo.com"><u>the compliance trap in recording at scale</u></a>.</p><p>The last link is the one people forget is a link at all.</p><h2 id="the-copy-is-the-evidence"><strong>The copy is the evidence</strong></h2><p>Nobody presents the original storage volume. They present an export — and the video chain of custody continues through it, or it ends there.</p><p>The forensic guidance is direct. <a href="https://www.swgde.org/wp-content/uploads/2025/03/2025-02-28-Best-Practices-for-Data-Acquisition-from-Digital-Video-Recorders-17-V-002-1.3.pdf?ref=samvyo.com"><u>SWGDE's best practices for acquiring video from recorders</u></a> say "a native file format or proprietary file format is likely to provide best evidence for legal authenticity purposes as it is closest to the original manner of recording," and instruct examiners to "create a hash value for any video retrieved." Where a proprietary player is needed, it goes with the files.</p><p>In practice that means two copies with two jobs. The native export, hashed at the moment it leaves the system, is the evidence. A convenient MP4 for viewing is a working copy, and should be labelled as one. <a href="https://samvyo.com/blog/evidentiary-video-recording-timestamps-retention-and-export-that-hold-up-later?ref=samvyo.com"><u>How timing, retention and export are handled in practice</u></a> decides whether that native copy holds up months later.</p><p>Which leaves the practical question: how do you tell, before you need it, whether a system keeps custody at all?</p><h2 id="six-questions-to-ask-of-any-recording-system"><strong>Six questions to ask of any recording system</strong></h2><p>Ask them of your own platform, a vendor, or the <a href="https://samvyo.com/blog/perimeter-intrusion-detection-catching-the-loiter-and-probe-before-the-breach?ref=samvyo.com"><u>CCTV estate behind a perimeter</u></a>. The answers are either specific or they are not.</p><ul><li><strong>Is the recording written as numbered segments with a manifest, and are gaps recorded?</strong> If a recorder fails for a minute, you want that minute documented, not missing.</li><li><strong>When is the hash computed — at capture, or at export?</strong> Only the first covers the whole life of the file.</li><li><strong>Who, precisely, can delete or overwrite a recording before its retention ends?</strong> "Nobody" is a checkable answer. "Only admins" is not custody.</li><li><strong>Is every view and download logged — including inside the application — and can anyone edit that log?</strong></li><li><strong>What does an export contain?</strong> Native format, hashes and timing information, or just a re-encoded file.</li><li><strong>Who would sign the certificate, and could they describe the process?</strong> Both 901(b)(9) and section 63(2) turn on someone being able to explain how the system works and that it was working properly.</li></ul><p>A system that answers all six specifically keeps a video chain of custody. One that answers with a feature name — "we have encryption," "it's WORM" — usually does not.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>A video chain of custody is a continuous, provable history of a recording, and both US and Indian evidence law ask for the same two things at the end of it: an account of the process that made the file, and a hash showing the copy matches. A record button gives you the file and nothing else.</p><p>Custody is decided at capture and lost silently in storage and export. Check those three links before the day someone asks.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p><em>For what the EU, US and India each require of a recording beyond custody, read </em><a href="https://samvyo.com/blog/video-recording-compliance-across-the-eu-us-and-india-what-each-regime-demands?ref=samvyo.com"><em><u>video recording compliance across the EU, US and India</u></em></a><em>. For the recorder models and storage tiers underneath it all, see </em><a href="https://samvyo.com/blog/video-recording-architecture-what-runs-behind-the-pipeline-at-scale?ref=samvyo.com"><em><u>what runs behind the recording pipeline at scale</u></em></a><em>.</em></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What is a video chain of custody?</strong></p><p>It is the documented, verifiable history of a recording from capture to presentation: where it was stored, who had access, and proof it did not change at each step. It is a record about the file, not a property of the file, and it has to be kept continuously from the moment of capture.</p><p><strong>Is a hash value enough to prove video evidence is authentic?</strong></p><p>A hash proves a copy matches the file that was hashed, which is why both FRE 902(14) and India's BSA certificate rely on it. It does not prove the hashed file was the original. That needs the rest of the chain — when the hash was taken, how the file was captured and stored, and who could reach it before then.</p><p><strong>What does India's section 63 certificate require for video recordings?</strong></p><p>Under the Bharatiya Sakshya Adhiniyam, 2023, an electronic record must be accompanied by a certificate identifying the record, describing how it was produced and confirming the device was operating properly. The certificate form in the Schedule asks for the hash value and algorithm, in both the party's part and an expert's part.</p><p><strong>Can footage stored in the cloud have a valid chain of custody?</strong></p><p>Yes, but storage alone does not provide it. You still need a hash recorded at capture somewhere administrators cannot edit, retention that cannot be shortened, and a log of every access. Check whether any object lock is in compliance mode rather than governance mode, which can be bypassed with one permission.</p><p><strong>Why export video in its native format rather than MP4?</strong></p><p>Forensic guidance treats the native format as the best evidence because it is closest to how the footage was originally recorded; re-encoding changes the file and can raise questions about what else changed. Keep the hashed native export as evidence and use an MP4 only as a labelled working copy.</p><p><strong>Does the video chain of custody break if someone watches the recording?</strong></p><p>Not if the viewing is logged and the file is not altered. Custody does not require that nobody touches the footage — it requires that every access is recorded in a log that cannot itself be edited. Unlogged access is what creates a gap.</p><p><strong>Can we keep the whole custody chain on our own infrastructure?</strong></p><p>Yes, if recording processing and storage run on infrastructure you control. Samvyo works this way: it is based on SFU architecture and keeps recording processing and storage on your side, so the hashes, logs and exports that form the chain stay inside your own boundary. The retention and certification decisions remain yours.</p>]]></content:encoded></item><item><title><![CDATA[WebRTC SDK vs Build: What You Actually Write Yourself]]></title><description><![CDATA[The browser gives you ICE, encryption, jitter buffering and congestion control for nothing. Then you discover that none of those were the expensive part. Here is the itemised list of what you write yourself with raw WebRTC — and why only one item on it is about video.]]></description><link>https://www.samvyo.com/blog/webrtc-sdk-vs-build-what-you-actually-write-yourself</link><guid isPermaLink="false">6aab75e38b45c3f0cd63a7ca</guid><category><![CDATA[decision guide]]></category><category><![CDATA[build vs buy RTC]]></category><category><![CDATA[Video Architecture]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 17 Sep 2026 10:55:10 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--04_20_55-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--04_20_55-PM.png" alt="WebRTC SDK vs Build: What You Actually Write Yourself"/><p>The browser gives you NAT traversal, mandatory encryption, packet loss recovery, jitter buffering, congestion control and a set of production codecs. For free, standardised, maintained by people who do nothing else.</p><p>That is genuinely the hard computer science, and it is already solved.</p><p>Then you build on it, and discover that the hard computer science was not the expensive part. What follows is the itemised list of what remains — and the observation that only one item on it has anything to do with video.</p><h2 id="webrtc-sdk-vs-build-%E2%80%94-what-the-browser-already-hands-you"><strong>WebRTC SDK vs build — what the browser already hands you</strong></h2><p>Worth being precise about the starting position, because it is substantial. <a href="https://www.w3.org/TR/webrtc/?ref=samvyo.com"><u>The W3C WebRTC specification</u></a> defines an API surface that includes ICE candidate gathering and connectivity checking, the DTLS handshake and SRTP keying, RTP packetisation and RTCP feedback, retransmission and keyframe requests, jitter buffering, bandwidth estimation, and encoder and decoder implementations for several codecs.</p><p>That is most of <a href="https://samvyo.com/blog/webrtc-architecture-everything-that-runs-between-two-video-tabs?ref=samvyo.com"><u>everything the browser already runs between two tabs</u></a>, and reimplementing any of it would be a serious project on its own. Nobody sensible does.</p><p>So the question is never whether to build WebRTC. It is what to build around it, and that turns out to be a much longer list than the first list.</p><h2 id="what-a-video-sdk-is-actually-selling-you"><strong>What a video SDK is actually selling you</strong></h2><p>Here is the reframe that makes the decision tractable: a video SDK is not a video library. The video is in the browser already.</p><p><strong>What an SDK sells is failure handling. Connections that do not establish, connections that break and come back, devices that disappear mid-call, browsers that behave differently from each other, networks that degrade, and a way to find out what went wrong afterwards. Strip those out and the remaining surface — get a camera, send it somewhere, display what arrives — is genuinely an afternoon.</strong></p><p>This is the level of detail that <a href="https://samvyo.com/blog/comprehensive-comparison-webrtc-vs-proprietary-video-sdks-business-decision-guide?ref=samvyo.com"><u>the strategic comparison of WebRTC and proprietary SDKs</u></a> deliberately stays above. That piece frames the decision in terms of cost, timeline, control and compliance, which is the right frame for choosing. This one goes underneath it and names the actual code, because the development effort is systematically underestimated when nobody itemises it.</p><h2 id="the-webrtc-sdk-vs-build-inventory-nine-things-you-own"><strong>The WebRTC SDK vs build inventory: nine things you own</strong></h2><p>Everything below is yours with raw browser APIs. Roughly in the order you encounter it.</p><h3 id="1-signalling-identity-and-rooms"><strong>1. Signalling, identity and rooms</strong></h3><p>The specification defines the session description format and deliberately says nothing about transporting it. So you build the channel — usually WebSocket — plus reconnection for the signalling channel itself, message ordering, authentication, who is allowed into which room, who is allowed to publish, and the state that tells a joining participant what already exists.</p><p>This is typically the largest single piece and it is entirely undifferentiated. Every video product has built the same thing.</p><h3 id="2-the-ice-lifecycle"><strong>2. The ICE lifecycle</strong></h3><p>Establishing a connection is handled for you. Everything around the edges of that is not.</p><p>You watch connection state transitions and decide what each one means for your application. Disconnected is not failed — it often recovers on its own, and treating it as fatal produces calls that drop unnecessarily. Failed usually needs <a href="https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/restartIce?ref=samvyo.com"><u>an ICE restart</u></a>, which means generating a fresh offer with new credentials and getting it to the far end through signalling that may itself be reconnecting.</p><p>You also decide the timeouts, the retry policy, and what the user sees during each of it. And because <a href="https://samvyo.com/blog/why-webrtc-breaks-behind-corporate-firewalls-and-the-turn-tcp-fallback-that-fixes-it?ref=samvyo.com"><u>it fails silently on corporate networks</u></a>, you need a diagnosis path that distinguishes a transient blip from a network that will never allow a connection at all.</p><h3 id="3-renegotiation"><strong>3. Renegotiation</strong></h3><p>A call is not static. Someone starts screen sharing, turns a camera on, switches to a different microphone, or a track ends. Each of these fires <a href="https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/negotiationneeded_event?ref=samvyo.com"><u>a negotiationneeded event</u></a> and requires a fresh offer/answer exchange while media is flowing.</p><p>The hazard is concurrency. Two participants can trigger renegotiation simultaneously, producing a glare condition where both sides are offering at once. Handling that correctly — perfect negotiation, with a designated polite peer that rolls back — is a well-defined pattern and it is not obvious, and getting it wrong produces intermittent failures that only appear when two people act at the same moment.</p><h3 id="4-device-management"><strong>4. Device management</strong></h3><p>Enumerate available cameras and microphones, handle the permission prompt and every way a user can refuse it, cope with device labels being hidden until permission is granted, detect a device being plugged in or removed mid-call, and switch tracks without tearing down the connection.</p><p>None of this is conceptually hard. All of it is a long tail of cases that each need code and a UI state, and it is where a surprising share of real bug reports originate.</p><h3 id="5-browser-and-platform-differences"><strong>5. Browser and platform differences</strong></h3><p>Autoplay policies that block audio until a user gesture. Mobile browsers suspending video tracks when a tab backgrounds. iOS Safari's particular constraints around when and how a stream can be attached to an element. Differences in which constraints are honoured and which are silently ignored.</p><p>This is the least glamorous item on the list and the one that never finishes, because it changes with browser releases rather than with your roadmap.</p><h3 id="6-relay-infrastructure"><strong>6. Relay infrastructure</strong></h3><p>The browser will use a TURN server. It will not provide one. You deploy <a href="https://samvyo.com/blog/the-turn-bill-the-self-hosted-video-cost-nobody-forecasts?ref=samvyo.com"><u>relay infrastructure, placed and credentialled</u></a>, issue short-lived credentials per session rather than embedding static ones in client code, keep certificates current for the TLS fallback, and size capacity for a relay rate that depends on your users' networks rather than your traffic.</p><h3 id="7-the-quality-experience"><strong>7. The quality experience</strong></h3><p>Congestion control is handled. What the user is told about it is not. <a href="https://samvyo.com/blog/webrtc-bandwidth-estimation-why-your-call-downgrades-before-it-drops?ref=samvyo.com"><u>The estimator downgrades and says nothing</u></a>, so you decide what a degraded participant looks like, whether to show a connection indicator, what happens visually when someone's video freezes versus when they turn it off, and how to distinguish those two states — which look identical and mean completely different things.</p><h3 id="8-observability"><strong>8. Observability</strong></h3><p>The statistics API exposes a large volume of per-connection data. Collecting it, shipping it somewhere, correlating both ends of a session, and turning it into an answer to "why was this specific call bad" is entirely your problem.</p><p>Teams routinely defer this and then cannot diagnose anything, because a WebRTC failure that was not instrumented at the time is essentially unrecoverable after the fact.</p><h3 id="9-more-than-two-participants"><strong>9. More than two participants</strong></h3><p>Everything above assumes two peers. Past that, each participant sending to every other participant exceeds what client uplink and CPU can sustain by around the fourth or fifth person, and <a href="https://samvyo.com/blog/what-is-an-sfu-and-why-does-every-video-platform-use-one?ref=samvyo.com"><u>a media server stops being optional</u></a>. That is not an addition to the list — it is a second system, with its own deployment, scaling behaviour, failure modes and bill.</p><p><strong>Count the items. One of them — the ninth, and only partly — is about moving video. The other eight are about the conditions under which moving video stops working.</strong></p><h2 id="the-one-that-is-always-underestimated"><strong>The one that is always underestimated</strong></h2><p>If a team is going to run out of budget on one item, it is reconnection.</p><p>It gets estimated as a retry and it is a state machine. A real call has to survive a laptop sleeping and waking, a phone switching from wifi to cellular mid-sentence, a tunnel, a VPN reconnecting, and a signalling server being redeployed underneath it. Each of those produces a different combination of states across the peer connection, the signalling channel and your application, and they can occur in any order and simultaneously.</p><p>It is also nearly impossible to test properly. Simulating a network transition faithfully requires either real devices moving through real conditions or fairly elaborate network emulation, and the bugs are timing-dependent, which means they are intermittent, which means they are expensive to reproduce.</p><p><strong>The symptom in the field is characteristic: a product that demos flawlessly and accumulates complaints about calls that dropped for no clear reason. Those calls did have a reason. It just was not instrumented, which is item eight failing at the same time.</strong></p><h2 id="which-of-these-should-you-actually-own"><strong>Which of these should you actually own?</strong></h2><p>The useful split is not build versus buy, it is which items differentiate you.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="180"><col width="180"><col width="264"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Item</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Differentiating?</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Verdict</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Signalling, rooms, identity</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No — identical everywhere</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Buy</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">ICE lifecycle and reconnection</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Buy</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Renegotiation and glare handling</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Buy</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Device management</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Partly — the UI is yours</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Buy the plumbing, own the UI</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Browser and platform quirks</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No, and it never ends</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Buy</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Relay infrastructure</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No, but placement may be</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Buy, control placement</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Quality experience</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes — users see this</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Own</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Observability</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes — it is your product's health</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Own the analysis, buy the collection</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Media server</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Buy</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p>Two items are genuinely yours: what users see when conditions degrade, and what you learn from sessions that went badly. Both are product decisions wearing infrastructure clothing, and outsourcing them produces something indistinguishable from every competitor using the same vendor.</p><p>The other seven are identical in every video product ever shipped, appear in no pitch deck, and consume most of the calendar.</p><h2 id="when-building-is-genuinely-right"><strong>When building is genuinely right</strong></h2><p>The honest counterweight, because the list above reads as an argument against building and there are real cases where it is wrong.</p><ul><li>Video is the product, not a feature of it. If real-time media is your core differentiation, owning the stack is the point and the list above is your engineering roadmap rather than your overhead.</li><li>You need behaviour no vendor offers. Custom congestion control, an unusual codec pipeline, deterministic behaviour for a regulated environment, or an architecture no SDK anticipated.</li><li>Deployment constraints rule out the alternatives. An air-gapped network, a jurisdiction no provider operates in, or hardware nobody supports.</li><li>You already have the expertise. A team that has shipped WebRTC before will move through this list several times faster than the estimates suggest, because most of the cost is discovery rather than typing.</li></ul><p>Outside those cases, building the seven undifferentiated items is spending a quarter on work that is identical to what a competitor bought, and that no customer will ever notice you did yourself.</p><h2 id="build-buy-or-deploy"><strong>Build, Buy, or Deploy</strong></h2><p>Three routes, with the honest boundary on each.</p><h3 id="build-on-open-source"><strong>Build on open source</strong></h3><p>mediasoup, Janus, Pion and LiveKit give you the server side; the browser gives you the client primitives. You write all nine items. This is the right call when video is the product or when constraints rule out everything else, and it means the long tail — item five in particular — becomes a permanent line in your maintenance budget rather than a one-off project.</p><h3 id="buy-a-cloud-video-api"><strong>Buy a cloud video API</strong></h3><p>Per-minute providers hand you all nine, which is a genuine acceleration and the fastest path to shipping. The limits are that you inherit their behaviour on the two items that should be yours — the degradation experience and the diagnostics — and you generally cannot see per-session statistics in enough detail to answer why one specific call was bad.</p><h3 id="deploy-a-commercial-platform"><strong>Deploy a commercial platform</strong></h3><p>The middle path runs a commercial platform on infrastructure you choose. Samvyo is one such option: based on SFU architecture, shipping embeddable SDKs, with the media path, TURN and recording kept on infrastructure you control. The relevant part for this decision is that the seven undifferentiated items arrive solved while deployment, relay placement and data path stay yours — and the two items worth owning remain in your application, where they belong. It is resilient by design rather than something you assemble.</p><p>Where it does not fit: if you need to modify behaviour at the protocol level, build. And for a two-party feature that will never need a media server, the browser plus a modest amount of signalling is genuinely sufficient and an SDK is overhead.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>The browser solves the hard computer science — NAT traversal, encryption, loss recovery, congestion control, codecs — and hands it over for nothing. What remains is nine items of application engineering, and eight of them are about failure rather than video.</p><p>A video SDK is a failure-handling library with a camera API attached. Decide accordingly: buy the seven items that are identical in every video product, own the two that users actually experience — what they see when quality drops, and what you learn when a call goes wrong. And whatever you decide, budget reconnection properly, because it is a state machine that every team estimates as a retry.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>For the same decision expressed as a schedule rather than a code inventory, <a href="https://samvyo.com/blog/add-video-to-your-app-why-the-demo-takes-an-afternoon-and-production-takes-months?ref=samvyo.com" rel="noreferrer"><u>what this costs in calendar time</u></a> turns these items into a scope table you can plan against. And for what the browser is actually doing underneath all nine, <a href="https://samvyo.com/blog/webrtc-architecture-everything-that-runs-between-two-video-tabs?ref=samvyo.com"><u>everything the browser already runs between two tabs</u></a> walks the full pipeline.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong><br/></h2><p><strong>What does a video SDK actually do that raw WebRTC doesn't?</strong><br>Failure handling, mostly. The browser already provides NAT traversal, encryption, loss recovery, jitter buffering, congestion control and codecs. An SDK provides signalling, room and identity management, reconnection and ICE restart, renegotiation, device handling, browser quirk compatibility, relay infrastructure, diagnostics, and a media server for group calls. Only the last is really about moving video.</br></p><p><strong>Is it hard to build video calling with raw WebRTC?</strong><br>A two-person call is genuinely straightforward — the browser does the difficult parts. Production is hard for different reasons: nine categories of application code around the media, of which reconnection, renegotiation and browser-specific behaviour are the ones that consume the most time and are hardest to test.</br></p><p><strong>What is the most underestimated part of building on WebRTC?</strong><br>Reconnection. Teams estimate it as a retry and it is a state machine spanning the peer connection, the signalling channel and application state, which must survive sleep, network switches, tunnels and server redeploys in any order. It is also very hard to test faithfully, so the bugs are intermittent and expensive to reproduce.</br></p><p><strong>Do I need a TURN server if I use raw WebRTC?</strong><br>Yes. The browser will use a TURN server when a direct path is unavailable, but it does not provide one. You deploy relays, place them near users, issue short-lived credentials per session rather than embedding static ones in client code, and maintain certificates for the TLS fallback.</br></p><p><strong>What parts of a video feature should I build myself?</strong><br>The two that users experience: what happens visually when quality degrades or a call interrupts, and the diagnostics that tell you why a session went badly. Those are product decisions. Signalling, reconnection, renegotiation, browser quirks, relay infrastructure and the media server are identical in every video product and appear in no pitch deck.</br></p><p><strong>When is building on raw WebRTC the right choice?</strong><br>When real-time video is your product rather than a feature of it, when you need behaviour no vendor offers, when deployment constraints rule out the alternatives, or when you already have a team that has shipped WebRTC before. Outside those cases you are spending a quarter on work a competitor bought.</br></p><p><strong>Can I keep control of the infrastructure without writing all of this?</strong><br>Yes — that is the middle option. A platform deployed on infrastructure you choose, such as Samvyo, hands you the undifferentiated engineering while the media path, TURN placement and recording stay under your control. The parts worth owning remain in your application.</br></p>]]></content:encoded></item><item><title><![CDATA[WebRTC Bandwidth Estimation: Why Your Call Downgrades Before It Drops]]></title><description><![CDATA[Users report that the video got worse and the network graphs look fine. Both are true. WebRTC watches queues filling rather than packets dying, so it reduces quality before anything is actually lost — and that pre-emptive downgrade is the mechanism that stops the call from failing.]]></description><link>https://www.samvyo.com/blog/webrtc-bandwidth-estimation-why-your-call-downgrades-before-it-drops</link><guid isPermaLink="false">6aab75618b45c3f0cd63a7b9</guid><category><![CDATA[Bandwidth Cost]]></category><category><![CDATA[Bandwidth Estimation]]></category><category><![CDATA[Congestion Control]]></category><category><![CDATA[Simulcast]]></category><category><![CDATA[Video Infrastructure]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 17 Sep 2026 10:55:04 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--04_16_01-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--04_16_01-PM.png" alt="WebRTC Bandwidth Estimation: Why Your Call Downgrades Before It Drops"/><p>A user reports that the video went blurry for thirty seconds. You check the monitoring: no packet loss, no errors, connection healthy throughout.</p><p>Both observations are correct. The picture did degrade, and nothing was lost — because the degradation is what prevented the loss.</p><p>WebRTC does not wait for packets to die before reacting. It watches for the queue that is about to kill them, and gives up quality pre-emptively to avoid it. Understanding that inverts how you read every quality complaint you will ever receive.</p><h2 id="the-downgrade-is-the-mechanism-not-the-failure"><strong>The downgrade is the mechanism, not the failure</strong></h2><p>The instinct when quality drops is that something broke. In a real-time system the opposite is closer to true: the alternative to a downgrade is not better video, it is a call that stalls, stutters and eventually fails.</p><p>Video is elastic in a way that most network traffic is not. A file transfer has a fixed size and can only go faster or slower. A video stream can be made smaller — fewer pixels, fewer frames, coarser quantisation — and still be a video. That elasticity is what a congestion controller spends, and spending it is the correct behaviour.</p><p>This is <a href="https://samvyo.com/blog/webrtc-architecture-everything-that-runs-between-two-video-tabs?ref=samvyo.com"><u>one stage in a longer chain</u></a>, and it is the stage users actually perceive. Everything else in the pipeline either works or does not; this one degrades visibly, on purpose, and gets reported as a bug for exactly that reason.</p><h2 id="how-webrtc-bandwidth-estimation-actually-works"><strong>How WebRTC bandwidth estimation actually works</strong></h2><p>The algorithm in browsers is Google Congestion Control, specified in <a href="https://datatracker.ietf.org/doc/html/draft-ietf-rmcat-gcc-02?ref=samvyo.com"><u>IETF draft-ietf-rmcat-gcc</u></a>. It runs two controllers in parallel and takes the lower of their two estimates as the sending rate.</p><h3 id="the-delay-based-controller"><strong>The delay-based controller</strong></h3><p>This is the interesting one, and the reason the system reacts early.</p><p>Packets are sent in groups. For each group, the controller compares how far apart packets were sent with how far apart they arrived. If a group arrives more spread out than it was sent, something in the path is holding them — a queue is filling.</p><p>The specification models this as d(i) = m(i) + v(i), where m(i) is the underlying delay trend and v(i) is ordinary jitter. A Kalman filter separates the two, because the whole difficulty is distinguishing a genuine trend from noise. When the filtered estimate exceeds an adaptive threshold, the detector signals over-use and the rate comes down.</p><p>That threshold starts at 12.5 ms and adapts within a range of 6 to 600 ms. The draft is explicit that too small a threshold makes the detector "overly sensitive" — so the algorithm deliberately tolerates some delay growth before acting, to avoid reacting to noise.</p><h3 id="the-loss-based-controller"><strong>The loss-based controller</strong></h3><p>Simpler, and it operates on three bands:</p><p/>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="140"><col width="127"><col width="357"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Packet loss</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Action</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Effect on the rate estimate</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Under 2%</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Increase</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Multiply by 1.05 — probe upward for more capacity</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2% to 10%</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Hold</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Leave the estimate unchanged</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Over 10%</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Decrease</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Multiply by (1 − 0.5p), where p is the loss ratio</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The hold band explains something engineers notice and find counterintuitive: a call can sit at 8% packet loss and the sending rate will not move. That is deliberate. Some loss is normal on real networks and reacting to it would make the system jittery, so GCC treats the 2–10% range as noise and only retreats above it.</p><p><strong>The final sending rate is the minimum of the two controllers. In practice the delay-based one usually wins, because queues fill before they overflow — which is the entire point.</strong></p><h2 id="why-reacting-to-delay-beats-reacting-to-loss"><strong>Why reacting to delay beats reacting to loss</strong></h2><p>A network under pressure does not go straight from fine to dropping packets. It queues them first. Buffers in routers, switches and access equipment fill up, packets take longer to traverse, and only when those buffers are full does anything actually get discarded.</p><p>Loss-based congestion control waits for that final stage. Delay-based control watches the buffers filling and reacts while there is still time to do something about it gracefully.</p><p>The difference is the whole user experience. Reacting at loss means the user sees frozen frames, artefacts and stutter, because the damage has already happened. Reacting at delay means the user sees a resolution drop, which is mild and recoverable.</p><p>This is also why bandwidth estimation is mandatory rather than optional on real-time media. TCP's approach — push until something breaks, then halve — is fine for a download where a retransmission fixes everything. For live video a retransmitted frame from 300 ms ago has no value, so the only workable strategy is to never get into the situation in the first place.</p><h2 id="where-the-estimate-is-calculated-remb-and-transport-cc"><strong>Where the estimate is calculated: REMB and transport-cc</strong></h2><p>Two generations of mechanism, and you will encounter both.</p><p>The older approach, REMB, had the receiver calculate an estimate from what it observed and send that figure back to the sender as a maximum bitrate. It worked, but it put the logic on the receiving end, where different implementations reached different conclusions and where the sender could not see the raw data.</p><p>The current approach, <a href="https://datatracker.ietf.org/doc/html/draft-holmer-rmcat-transport-wide-cc-extensions-01?ref=samvyo.com"><u>transport-wide congestion control</u></a>, inverts this. The receiver simply reports arrival times for every packet, and the sender does the estimation. That is strictly better: the sender has the departure timestamps already, so pairing them with the arrival feedback gives a complete picture, and improvements to the algorithm ship with the sending implementation rather than depending on what the far end is running.</p><p>Practically, this means bandwidth estimation is a sender-side concern in modern deployments. For a media server that is significant, because the server is a sender to every subscriber — it runs an independent estimate per subscriber, and decides per subscriber what to forward.</p><h2 id="what-a-downgrade-actually-looks-like"><strong>What a downgrade actually looks like</strong></h2><p>The estimate falls. Something has to give, and there are three levers, usually applied in this order.</p><p>Resolution drops first in most configurations, because pixel count is where bitrate lives. With simulcast the server does not even ask the publisher to change anything — it can simply <a href="https://samvyo.com/blog/what-is-simulcast-and-when-does-it-save-or-waste-bandwidth?ref=samvyo.com" rel="noreferrer"><u>drop a simulcast layer instead of the resolution</u></a>, forwarding 360p where it was forwarding 720p, per subscriber and without affecting anyone else in the room.</p><p>Frame rate drops second, or first for screen content where sharpness matters more than motion. Temporal layers make this cheap, since dropping alternate frames needs no re-encode.</p><p>Quantisation coarsens last — the same resolution and frame rate with more compression artefacts. This is the least pleasant of the three and usually a sign the other two have been exhausted.</p><p>Worth knowing that latency moves at the same time. When a network becomes variable enough to trigger a downgrade, <a href="https://samvyo.com/blog/what-sub-80ms-video-latency-actually-means-and-why-most-real-time-isnt?ref=samvyo.com"><u>the jitter buffer deepens at the same time</u></a> to absorb the variance — so the user is getting a smaller picture and a slightly later one, from the same underlying cause.</p><p><strong>None of this is explained to the user by default, which is the actual product problem. The infrastructure behaves correctly and the interface says nothing, so the user concludes the application is broken. A single line of UI — "reduced quality, weak connection" — converts a support ticket into an understood event, and almost nobody ships it.</strong></p><h2 id="where-webrtc-bandwidth-estimation-gets-it-wrong"><strong>Where WebRTC bandwidth estimation gets it wrong</strong></h2><p>The algorithm is good and it is not infallible. Three situations where it misjudges, all of which produce real complaints.</p><h3 id="it-loses-to-tcp-on-a-shared-link"><strong>It loses to TCP on a shared link</strong></h3><p>This is the big one and it is structural. A delay-based controller backs off at the first sign of queuing. TCP does not — it keeps increasing until packets actually drop, which is precisely the point a delay-based algorithm was designed to avoid reaching.</p><p>So when someone starts a large download on the same connection as their video call, the download keeps pushing while the call politely retreats. The video degrades, the download proceeds at full speed, and the user reasonably concludes the video application is the weak one. It is the opposite: the video is the only participant behaving well.</p><p>There is no clean fix inside WebRTC for this. It is a consequence of being a good citizen on a network where the other traffic is not.</p><h3 id="it-under-estimates-on-high-jitter-networks"><strong>It under-estimates on high-jitter networks</strong></h3><p>The delay-based controller has to separate a genuine trend from noise, and on <a href="https://samvyo.com/blog/nat-traversal-in-webrtc-why-the-call-connects-on-wi-fi-but-not-on-4g?ref=samvyo.com" rel="noreferrer"><u>mobile networks, where jitter is structural</u></a>, there is a great deal of noise. Radio scheduling, handovers and carrier queuing produce delay variation that is not congestion, and a controller tuned to be responsive will read some of it as congestion and back off unnecessarily.</p><p>The adaptive threshold exists precisely to manage this tension, which is why it is permitted to grow as far as 600 ms. But the tradeoff is real: a controller tolerant enough for a mobile network is slower to react on a fixed one.</p><h3 id="a-relayed-path-changes-the-picture"><strong>A relayed path changes the picture</strong></h3><p>When <a href="https://samvyo.com/blog/the-turn-bill-the-self-hosted-video-cost-nobody-forecasts?ref=samvyo.com"><u>a relayed path adds a hop and changes the timing</u></a>, the estimator is measuring a route it was not measuring before — different queuing behaviour, an extra buffer, often a longer path. The estimate has to reconverge, and during that period the rate is wrong in one direction or the other.</p><p>This is worth knowing because it partially explains why relayed sessions feel worse beyond the pure latency cost. Some of it is the extra hop; some of it is a control loop working with less reliable signal.</p><h2 id="what-to-measure"><strong>What to measure</strong></h2><p>Most teams monitor bitrate and packet loss, and both are poor early-warning signals — bitrate falling is the system working, and loss appears only after the delay-based controller has already failed to prevent it.</p><p>The metric with actual predictive value is the rate at which the server is issuing quality reductions. <a href="https://samvyo.com/blog/sfu-scaling-clustering-cascading-and-where-the-bottleneck-moves?ref=samvyo.com"><u>Layer-downgrade rate is the alert worth having</u></a>, because it rises before users complain and falls when conditions improve, which is exactly the shape an early-warning metric should have.</p><p>Two more worth collecting: the distribution of estimated bandwidth across your user base, which tells you whether your default ladder matches reality, and the proportion of sessions that spend significant time below your lowest layer, which tells you whether your floor is set too high for the networks your users are actually on.</p><h2 id="build-buy-or-deploy"><strong>Build, Buy, or Deploy</strong></h2><p>Three routes, with the honest boundary on each.</p><h3 id="build-on-open-source"><strong>Build on open source</strong></h3><p>mediasoup, Janus, Pion and LiveKit all implement transport-cc and expose per-consumer estimates, which is what makes any of this observable. Building means you can tune layer-switching policy — how eagerly to drop, how cautiously to recover, whether to prefer resolution or frame rate for your content type. Those defaults are generic and your content probably is not, so the tuning is real value. The cost is that congestion control is subtle and a well-intentioned change can make things worse in ways that only appear under load.</p><h3 id="buy-a-cloud-video-api"><strong>Buy a cloud video API</strong></h3><p>Per-minute providers handle estimation and layer selection entirely, and their defaults are usually well tuned because they see an enormous range of networks. The limits are that you generally cannot adjust the policy for unusual content, and you often cannot see per-subscriber estimates — which is the one number that would tell you why a specific user had a bad call.</p><h3 id="deploy-a-commercial-platform"><strong>Deploy a commercial platform</strong></h3><p>The middle path runs a commercial platform on infrastructure you choose. Samvyo is one such option: based on SFU architecture, shipping embeddable SDKs, with the media path, TURN and recording kept on infrastructure you control. Path length is the relevant lever here — a shorter, more predictable route between your users and the media server gives the estimator a cleaner signal to work with, and choosing where that server sits is choosing how well the control loop performs. It is resilient by design rather than something you assemble.</p><p>Where it does not fit: for two-party calls the browser handles all of this end to end and there is nothing for a platform to improve. And if you need to modify the congestion control algorithm itself — unusual, but it happens in specialised low-latency work — that requires building against the libraries directly.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>WebRTC reduces quality before anything is lost because it watches queues filling rather than packets dying. A Kalman-filtered delay estimate crossing a 12.5 ms threshold is enough to trigger a downgrade, long before the loss-based controller's 10% threshold would. The blurry thirty seconds your user reported is the system succeeding.</p><p>Two things follow. Alert on quality-reduction rate rather than on bitrate or loss, because the first is predictive and the other two are lagging. And tell the user what is happening — the infrastructure is already doing the right thing, and a single line of interface is the difference between a support ticket and an understood event.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>Bandwidth estimation decides which layer gets forwarded; <a href="https://samvyo.com/blog/what-is-simulcast-and-when-it-saves-or-wastes-bandwidth?ref=samvyo.com"><u>drop a simulcast layer instead of the resolution</u></a> covers how those layers are produced and what they cost the publisher. For where this sits among the other seven stages, <a href="https://samvyo.com/blog/webrtc-architecture-everything-that-runs-between-two-video-tabs?ref=samvyo.com"><u>one stage in a longer chain</u></a> walks the whole pipeline and what fails at each link.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong><br/></h2><p><strong>What is bandwidth estimation in WebRTC?</strong><br>A continuous measurement of how much capacity is available on the path, used to set the sending rate. Browsers use Google Congestion Control, which runs two controllers in parallel — one watching delay trends, one watching packet loss — and takes the lower of their estimates. When capacity looks constrained it reduces quality rather than risking packet loss.</br></p><p><strong>Why does my video call get blurry when the network looks fine?</strong><br>Because the system is reacting to queuing delay, not packet loss. When packets start arriving more spread out than they were sent, a queue is filling somewhere in the path, and WebRTC reduces quality before anything is actually dropped. Monitoring that only tracks loss and errors will show nothing while this happens.</br></p><p><strong>At what packet loss does WebRTC reduce quality?</strong><br>Above 10%, per the loss-based controller, which then multiplies the estimate by (1 − 0.5p). Below 2% it probes upward by 5%, and between 2% and 10% it holds steady — so a call can sit at 8% loss with no rate change. In practice the delay-based controller usually acts well before any of this, since its threshold starts at 12.5 ms of excess delay.</br></p><p><strong>Why does a file download ruin my video call?</strong><br>Because they use opposite strategies. WebRTC backs off at the first sign of queuing; TCP keeps increasing until packets actually drop. On a shared link the download therefore wins, the video retreats, and the user blames the video application — which is the only one behaving correctly.</br></p><p><strong>What is the difference between REMB and transport-cc?</strong><br>Where the estimate is calculated. With REMB the receiver computed a maximum bitrate and reported it back. With transport-wide congestion control the receiver just reports per-packet arrival times and the sender does the estimation, which gives a complete picture since the sender already holds the departure timestamps. Transport-cc is the modern default.</br></p><p><strong>Should I alert on bitrate drops?</strong><br>No — a falling bitrate is the system working as designed, so alerting on it produces noise. Alert instead on the rate at which quality reductions are being issued, which rises before users complain and falls when conditions recover. Packet loss is also a lagging signal, since it only appears after the delay-based controller has failed to prevent it.</br></p><p><strong>Can I stop WebRTC from reducing quality?</strong><br>You can set a minimum bitrate, and you generally should not. Forcing a rate above what the path supports does not produce better video — it produces packet loss, frozen frames and eventually a failed connection. The better response is to make degradation visible in the interface so users understand what they are seeing.</br></p>]]></content:encoded></item><item><title><![CDATA[H.264 vs H.265 Over WebRTC: Why the Storage Codec Breaks the Live Path]]></title><description><![CDATA[Your cameras record H.265 because it halves the storage. Most browsers still cannot play it, and the ones that can need the right hardware. That gap is not an engineering problem — it is a patent-licensing outcome — and it is what puts a transcoder on your live path.]]></description><link>https://www.samvyo.com/blog/h-264-vs-h-265-over-webrtc-why-the-storage-codec-breaks-the-live-path</link><guid isPermaLink="false">6aab71078b45c3f0cd63a7b0</guid><category><![CDATA[Codecs]]></category><category><![CDATA[H.265]]></category><category><![CDATA[Transcoding]]></category><category><![CDATA[video surveillance]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 17 Sep 2026 10:54:54 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--04_09_55-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--04_09_55-PM.png" alt="H.264 vs H.265 Over WebRTC: Why the Storage Codec Breaks the Live Path"/><p>Your cameras record in H.265 because it delivers similar quality at roughly half the bitrate, which halves what you pay to keep thirty days of footage.</p><p>Most browsers cannot play it. The two that can need the right hardware underneath, and they negotiate it per call.</p><p>Everything expensive about putting existing video into a browser follows from that gap — and the gap exists for reasons that have nothing to do with engineering.</p><h2 id="webrtc-h265-support-browser-by-browser"><strong>WebRTC H265 support, browser by browser</strong></h2><p>The current state, which is narrower than the marketing around H.265 suggests:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="100"><col width="140"><col width="384"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Browser</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">H.265 over WebRTC</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Detail</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Chrome</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes — since 136</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Shipped stable April 2025. Included in SDP offer/answer only where hardware encode and decode are available.</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Safari</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes — since 18.0</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Enabled by default, same hardware dependency.</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Firefox</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Not supported, and no stated plan to implement.</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Edge</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Listed in the 136 release notes, then removed. Never enabled in the shipped product.</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p>Sources for each: <a href="https://chromestatus.com/feature/5153479456456704?ref=samvyo.com"><u>Chrome Platform Status</u></a> for the Chrome shipping record, <a href="https://learn.microsoft.com/en-us/answers/questions/5875799/edge-webrtc-h265-support?ref=samvyo.com"><u>Microsoft's own response</u></a> on Edge, and <a href="https://chris.hiszpanski.name/posts/is-webrtc-hevc-supported/?ref=samvyo.com"><u>this survey of WebRTC HEVC support</u></a> for the Safari and Firefox positions.</p><p><em>This moves. Check it the week you ship anything that depends on it rather than trusting a table in a blog post, including this one.</em></p><h2 id="why-webrtc-h265-support-stalled-%E2%80%94-and-it-was-not-engineering"><strong>Why WebRTC H265 support stalled — and it was not engineering</strong></h2><p>H.265 is a good codec. The compression gain over H.264 is real and the encoders are mature. None of that is why browsers held back.</p><p>H.264 was licensed through essentially one pool, which meant an implementer could look up the cost of shipping it and decide. H.265 fragmented: <a href="https://lumenci.com/blogs/video-codec-ip-patent-pools-licensing/?ref=samvyo.com"><u>four separate licensing entities</u></a> — MPEG LA, <a href="https://accessadvance.com/licensing-programs/hevc-advance/?ref=samvyo.com"><u>HEVC Advance</u></a>, Velos Media and independent licensors — each with their own terms.</p><p><strong>The consequence was not that H.265 was expensive. It was that nobody could work out in advance what it would cost. Implementers could not calculate total royalty exposure, so many avoided the codec entirely rather than sign up for an unbounded liability.</strong></p><p>Browser vendors were in exactly that position, at the worst possible scale — a royalty per installed browser, across billions of installations, with no ceiling anyone could quote. Google and Mozilla declined on those grounds, and YouTube moved to VP9 and later AV1 specifically to route around HEVC royalties.</p><p>So the support matrix above is a map of licensing decisions. Which explains the one row that otherwise makes no sense.</p><h2 id="the-edge-anomaly-and-what-it-proves"><strong>The Edge anomaly, and what it proves</strong></h2><p>Edge is built on Chromium. It ships the same engine as Chrome, which means the H.265 code is present in the codebase it compiles.</p><p>Edge 136 even listed WebRTC H.265 support in its release notes in May 2025. Seven months later Microsoft removed the reference and confirmed the capability had never been enabled in the shipped product — the documentation had simply been corrected to match reality. MediaRecorder HEVC works in Edge for recording; WebRTC H.265 transmission does not, even on hardware with HEVC encode. There is no published roadmap.</p><p><strong>Same engine, same hardware, opposite answer. That is not a technical constraint — it is two companies reaching different conclusions about the same licensing question, and it is the clearest evidence you will find that codec availability is a business decision wearing technical clothing.</strong></p><h2 id="what-supported-actually-means-here"><strong>What "supported" actually means here</strong></h2><p>Two qualifications turn the green cells in that table into something much less reliable.</p><p>First, hardware. Both Chrome and Safari include H.265 in their session description only when the device has hardware encode and decode available. A user on older hardware, a virtual machine, or a device whose drivers do not expose HEVC will silently not offer it. "Chrome supports H.265" and "your users can use H.265" are different statements, and only the second one matters.</p><p>Second, negotiation. <a href="https://samvyo.com/blog/webrtc-architecture-everything-that-runs-between-two-video-tabs?ref=samvyo.com"><u>Codecs are negotiated per call, as an intersection</u></a> of what both sides offer. Two Chrome users on capable hardware get H.265. One of them on a Firefox laptop, and the call falls back to H.264 for everyone. You cannot rely on a codec you do not control on both ends.</p><p>The practical read: H.265 over WebRTC is an optimisation that sometimes applies, never a foundation you can build on. Any design that requires it will fail for a predictable share of users, on their hardware, which you cannot fix.</p><h2 id="where-this-actually-bites-the-archive-disagrees-with-the-browser"><strong>Where this actually bites: the archive disagrees with the browser</strong></h2><p>For a greenfield conferencing product this is a minor annoyance — use H.264 and move on.</p><p>It becomes expensive when you already have H.265 video. Modern IP cameras ship H.265 by default precisely because storage is the dominant cost in surveillance, and halving the bitrate halves the retention bill. So the recorded archive is H.265, the cameras are H.265, and the browser the operator wants to watch from mostly is not.</p><p>That gap has to close somewhere, and the options are all worse than they look. <a href="https://samvyo.com/blog/live-video-in-surveillance-why-rtsp-cameras-still-cant-talk-to-web-browsers-in-2026?ref=samvyo.com"><u>RTSP cameras still cannot talk to browsers directly</u></a>, so something already sits in the path; the codec mismatch decides how expensive that something is. <a href="https://samvyo.com/blog/where-to-tap-the-stream-adding-live-browser-video-without-fighting-the-nvr?ref=samvyo.com"><u>Where you tap the stream</u></a> — camera, NVR, or a parallel path — determines whether you are transcoding one feed or all of them.</p><h2 id="the-transcode-bill"><strong>The transcode bill</strong></h2><p>Converting H.265 to H.264 on the live path means a full decode and a full re-encode, per stream, in real time.</p><p>Compare that to the alternative. <a href="https://samvyo.com/blog/what-is-an-sfu-and-why-does-every-video-platform-use-one?ref=samvyo.com"><u>An SFU forwards without decoding</u></a> — it rewrites packet headers and sends the bytes on, which is why forwarding capacity is measured in hundreds of streams per CPU core. Transcoding is measured in streams per core. The gap between those two units is the whole cost of the mismatch.</p><p>Three things follow, in increasing order of how much they hurt:</p><ul><li>Compute. A transcoding tier is an order of magnitude more hardware than a forwarding tier for the same stream count, and it scales with publishers rather than viewers — so a camera estate pays for every camera, whether anyone is watching or not.</li><li>Latency. Decode and re-encode add milliseconds to a path where the whole argument for WebRTC was that it was fast. A transcoder is a permanent tax on the number you were selling.</li><li>Quality. Re-encoding lossy video is generationally lossy. You are decoding an approximation and approximating it again, and no setting makes that free.</li></ul><p>And it stacks with the constraint that is already there: <a href="https://samvyo.com/blog/why-watching-500-cameras-is-a-decode-problem-not-a-bandwidth-problem?ref=samvyo.com"><u>forwarding is cheap and decoding is not</u></a> applies on the client too, which is why an operator's workstation caps out long before the network does. Transcoding on the server does not remove that ceiling — it just adds a second one upstream.</p><h2 id="so-what-should-you-actually-pick"><strong>So what should you actually pick?</strong></h2><p>Split the decision by leg, because the right answer genuinely differs.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="173"><col width="140"><col width="311"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Leg</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Codec</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Why</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Camera to recorder, and storage</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">H.265</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Halves the bitrate for similar quality. Storage is the dominant cost and both ends are hardware you control.</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Live path to a browser</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">H.264</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Universal. No negotiation risk, no hardware dependency, no transcoder.</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Live path, both ends known capable</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">H.265 opportunistically</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Fine as an upgrade that degrades to H.264. Never as a requirement.</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Forward-looking web delivery</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Watch AV1</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Designed to avoid the licensing problem, though not provably free of it.</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p><strong>The honest position is that H.265 is not the villain here. For storage and for the camera leg it is straightforwardly the right choice, and picking it there was correct. The mistake is assuming a codec that won the camera market also won the browser — those markets made their decisions on completely different criteria, and only one of them was compression.</strong></p><p>On AV1: it was designed specifically to deliver the compression gains without the licensing uncertainty, and it is where royalty-free web video is heading. It is worth noting honestly that even that is not settled — <a href="https://lumenci.com/blogs/video-codec-ip-patent-pools-licensing/?ref=samvyo.com"><u>Sisvel has launched an AV1 patent pool</u></a> asserting essential patents, which AOMedia disputes. "Royalty-free" is a design intent rather than a proven legal fact, for any modern codec.</p><h2 id="build-buy-or-deploy"><strong>Build, Buy, or Deploy</strong></h2><p>Three routes, with the honest boundary on each.</p><h3 id="build-on-open-source"><strong>Build on open source</strong></h3><p>mediasoup, Janus, Pion and LiveKit all forward H.264 without decoding it, which is the cheap path. If you need H.265 in and H.264 out you are adding a transcoding tier yourself — typically FFmpeg or GStreamer with hardware acceleration — and that is a real component with its own scaling behaviour, failure modes and licensing questions of its own. Budget it as infrastructure, not as a configuration flag.</p><h3 id="buy-a-cloud-video-api"><strong>Buy a cloud video API</strong></h3><p>Per-minute providers standardise on H.264 and handle negotiation for you, which removes this problem for conferencing use cases entirely. The limit shows up when you have existing H.265 sources: most will not ingest them, so the transcode still has to happen somewhere on your side before their pipeline begins.</p><h3 id="deploy-a-commercial-platform"><strong>Deploy a commercial platform</strong></h3><p>The middle path runs a commercial platform on infrastructure you choose. Samvyo is one such option: based on SFU architecture, shipping embeddable SDKs, with the media path, TURN and recording kept on infrastructure you control. Controlling the media path matters specifically here, because where the codec conversion happens — and whether it happens once at the edge or repeatedly per viewer — is the difference between a manageable cost and a runaway one. It is resilient by design rather than something you assemble.</p><p>Where it does not fit: for pure conferencing with no legacy sources, H.264 end to end needs none of this. And if your entire estate is H.265 and every viewer is on managed hardware you control, you may be able to run H.265 straight through and skip the conversion entirely.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>H.265 halves your storage and cannot be relied on in a browser. Chrome 136 and Safari 18 support it with hardware encode and decode present; Firefox does not, and Edge ships the same Chromium engine as Chrome and still has not enabled it — which tells you this is a licensing outcome, not a technical one. Four patent pools against H.264's one made the cost unknowable, and unknowable is worse than expensive.</p><p>Keep H.265 where it earns its place: the camera leg and the archive. Keep H.264 as the floor on anything that reaches a browser. Treat H.265 over WebRTC as an opportunistic upgrade that must degrade cleanly — and if an architecture requires a transcode on the live path, price that transcoder honestly, because it costs compute, latency and quality all at once.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>Codec negotiation is one stage of a longer chain — <a href="https://samvyo.com/blog/webrtc-architecture-everything-that-runs-between-two-video-tabs?ref=samvyo.com"><u>the full chain between two video tabs</u></a> walks all eight and what fails at each. If the mismatch you are facing is a camera estate rather than a conferencing product, <a href="https://samvyo.com/blog/live-video-in-surveillance-why-rtsp-cameras-still-cant-talk-to-web-browsers-in-2026?ref=samvyo.com"><u>RTSP cameras still cannot talk to browsers directly</u></a> covers the transport half of the same problem.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>Does WebRTC support H.265?</strong></p><p>Partially. Chrome has supported it since version 136 and Safari since 18.0, both only when the device has hardware encode and decode available. Firefox does not support it and has no stated plan to. Edge does not support it either, despite running the same Chromium engine as Chrome. Because codecs are negotiated as an intersection, a single participant without H.265 drops the whole call back to H.264.</p><p><strong>Why don't all browsers support H.265?</strong></p><p>Patent licensing, not engineering. H.264 was licensed through essentially one pool, so implementers could calculate the cost of shipping it. H.265 fragmented across four separate licensing entities, which made total royalty exposure impossible to determine in advance. At browser scale that is an unbounded liability, so several vendors declined and YouTube moved to VP9 and AV1 to avoid it.</p><p><strong>Should I use H.264 or H.265 for WebRTC?</strong></p><p>H.264 for anything reaching a browser. It is universal, needs no hardware check and no negotiation risk. Use H.265 opportunistically only where both ends are known to support it, and design so the call degrades cleanly to H.264 when they do not. Never make H.265 a requirement on the live path.</p><p><strong>Why does Edge not support H.265 in WebRTC if it uses Chromium?</strong></p><p>Because the capability was never enabled, regardless of the engine. Edge 136 listed it in its release notes in May 2025; Microsoft removed the reference seven months later and confirmed it had not shipped. MediaRecorder HEVC works for recording, but WebRTC transmission does not, even on hardware with HEVC encode, and there is no published roadmap.</p><p><strong>What does it cost to transcode H.265 to H.264 for live streaming?</strong></p><p>Substantially more than forwarding. An SFU forwards without decoding, so its capacity is measured in hundreds of streams per CPU core; transcoding requires a full decode and re-encode per stream and is measured in streams per core. It also adds latency to the live path and loses quality, since re-encoding already-lossy video is generationally lossy.</p><p><strong>My cameras record in H.265 — can operators watch them in a browser?</strong></p><p>Only via conversion, unless every operator is on Chrome or Safari with capable hardware, which is not a safe assumption. Something already sits between an IP camera and a browser because RTSP cannot reach one directly; the codec mismatch determines how expensive that component is. Tapping the stream in the right place decides whether you transcode one feed or all of them.</p><p><strong>Is AV1 the answer to the H.265 licensing problem?</strong></p><p>It is the direction, with a caveat. AV1 was designed to deliver the compression gains without the licensing uncertainty, and it is where royalty-free web video is heading. But Sisvel has launched an AV1 patent pool asserting essential patents, which AOMedia disputes — so treat royalty-free as a design intent rather than a settled legal fact for any modern codec.</p>]]></content:encoded></item><item><title><![CDATA[NAT Traversal in WebRTC: Why the Call Connects on Wi-Fi but Not on 4G]]></title><description><![CDATA[Same two people, same app. On Wi-Fi it connects instantly; on 4G it does not connect at all. Nothing changed but the network, and that is the entire explanation. Here is what NAT is actually doing, why one specific pairing can never work, and why mobile is where you meet it.]]></description><link>https://www.samvyo.com/blog/nat-traversal-in-webrtc-why-the-call-connects-on-wi-fi-but-not-on-4g</link><guid isPermaLink="false">6aaa82cb8b45c3f0cd63a7a9</guid><category><![CDATA[NAT traversal]]></category><category><![CDATA[STUN/TURN]]></category><category><![CDATA[Mobile Networks]]></category><category><![CDATA[Video Infrastructure]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 17 Sep 2026 10:54:49 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--04_07_05-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--04_07_05-PM.png" alt="NAT Traversal in WebRTC: Why the Call Connects on Wi-Fi but Not on 4G"/><p>On office Wi-Fi the call connects in under a second. On 4G it never connects at all. Move back to Wi-Fi and it works again. Nothing in your code changed, and the behaviour is completely reproducible once you know what to look for.</p><p>This is NAT traversal, and the reason it feels random is that the failure is not a property of either endpoint. It is a property of the pair.</p><h2 id="what-nat-is-actually-doing"><strong>What NAT is actually doing</strong></h2><p>Your device has a private address that means nothing on the public internet. A router sits between you and the world, rewriting the source address of outbound packets to its own public address and recording the substitution in a mapping table so that replies can be sent back to you.</p><p>For anything you initiate this is invisible and works perfectly. You send a request, the mapping exists, the response comes back through it.</p><p><strong>The problem is anything you do not initiate. An inbound packet arriving at the router with no matching table entry has nowhere to go and gets dropped. A peer-to-peer video call is precisely that case — two devices, both behind their own routers, each needing to send to the other without either having asked first.</strong></p><p>The workaround is to make both sides initiate at the same moment, so that each one's outbound packet creates the mapping the other's inbound packet needs. That is hole punching, and whether it works depends entirely on how predictable those mappings are.</p><h2 id="mapping-behaviour-is-the-variable-that-matters"><strong>Mapping behaviour is the variable that matters</strong></h2><p>You will see NAT described as full cone, restricted cone, port-restricted cone and symmetric. That taxonomy comes from an early STUN specification and is worth knowing because people still use it, but it is not how the standards describe NAT any more.</p><p><a href="https://www.rfc-editor.org/rfc/rfc4787.html?ref=samvyo.com"><u>RFC 4787</u></a> abandoned it explicitly, on the grounds that it "has been the source of much confusion, as it has proven inadequate at describing real-life NAT behavior." It separates two things the cone names conflated: how the external port is assigned, and who is permitted to send back through it.</p><p>For hole punching, the first is what decides everything. Three behaviours:</p><ul><li>Endpoint-independent mapping — one external port per internal socket, regardless of where you are sending. The mapping you discover talking to one server is the mapping everyone else sees.</li><li>Address-dependent mapping — a new mapping per destination address.</li><li>Address-and-port-dependent mapping — a new mapping for every destination address and port combination. This is what people mean by symmetric NAT.</li></ul><p><strong>Here is the part worth remembering. RFC 4787's first requirement is unambiguous: "A NAT MUST have an 'Endpoint-Independent Mapping' behavior." Address-and-port-dependent mapping violates a MUST in the standard — and it is deployed at enormous scale anyway.</strong></p><h2 id="why-hole-punching-works-and-exactly-when-it-cannot"><strong>Why hole punching works, and exactly when it cannot</strong></h2><p>The mechanism is simple once the mapping question is clear. Each device contacts a STUN server, which replies with the public address and port it observed. That is the device's mapping as seen from outside. The two peers exchange these discovered addresses through your signalling channel, then both send packets to the other's address simultaneously. Each outbound packet opens the mapping that the incoming one needs. The call connects.</p><p>This requires the discovered mapping to be the same mapping used towards the peer. With endpoint-independent mapping it is, and hole punching works.</p><p>With address-and-port-dependent mapping it is not. The mapping discovered while talking to the STUN server applies only to the STUN server. Sending to the peer creates a different mapping on a different port, which the peer does not know and cannot guess. The address exchanged through signalling is already obsolete by the time it is used.</p><p>One side behaving this way is usually survivable. The well-behaved side has a stable, predictable address, so the difficult side can reach it — and once that packet arrives, the well-behaved side simply replies to whatever source address it actually came from, learning the real mapping by observation.</p><p>Both sides behaving this way is a deadlock. Neither can learn the other's mapping without receiving a packet, and neither can send a packet to a correct destination. No amount of retrying fixes it.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="200"><col width="200"><col width="224"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">One side</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Other side</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Direct connection?</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Endpoint-independent</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Endpoint-independent</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes — straightforward hole punch</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Endpoint-independent</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Address-dependent</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Endpoint-independent</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Address-and-port-dependent</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Usually — the predictable side rescues it</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Address-and-port-dependent</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Address-and-port-dependent</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No — relay required, always</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p>That last row is the whole article. It is not probabilistic and it is not a tuning problem: that combination cannot establish a direct path, and the only fix is to stop trying and use a relay.</p><h2 id="why-mobile-networks-are-where-you-meet-it"><strong>Why mobile networks are where you meet it</strong></h2><p>There are not enough IPv4 addresses for the number of connected devices, and mobile carriers ran out first. Their solution is carrier-grade NAT — a second layer of translation, above the one in your router, sharing a small pool of public addresses across a very large number of subscribers.</p><p>At that scale, address-and-port-dependent mapping is the operationally sensible choice. It maximises how many subscribers fit behind each public address and it avoids mapping collisions. The standard says MUST; the address arithmetic says otherwise, and the address arithmetic wins.</p><p>Which produces exactly the symptom this post opened with. Home and office routers usually implement endpoint-independent mapping, so Wi-Fi to Wi-Fi hole punches cleanly. A mobile device behind CGNAT calling a Wi-Fi peer usually still works, because the Wi-Fi side is predictable enough to rescue it. Two mobile devices, both behind carrier-grade NAT, is the bottom row of the table — and it fails every time.</p><p>It is also why connectivity planning matters more for anything mobile-first. When <a href="https://samvyo.com/blog/how-fleet-video-streaming-actually-works-the-architecture-between-vehicle-and-command-centre?ref=samvyo.com"><u>vehicles stream over exactly these networks</u></a>, relay is not an edge case to handle — it is the normal path, and the architecture should assume it rather than hope.</p><h2 id="how-ice-handles-all-of-this-and-what-it-costs"><strong>How ICE handles all of this, and what it costs</strong></h2><p>You do not implement any of this yourself. <a href="https://samvyo.com/blog/webrtc-architecture-everything-that-runs-between-two-video-tabs?ref=samvyo.com"><u>ICE gathers candidates and probes the pairings</u></a> — local addresses, STUN-discovered public addresses, and relayed addresses on a TURN server — then tests every plausible combination and selects the best one that works. Hole punching is attempted automatically, and relay is used only when nothing else succeeds.</p><p>So the framework handles the logic. What it cannot do is invent a path that does not exist, which is why TURN is not optional infrastructure for any application with mobile users.</p><p>And a relay is a real cost, not a fallback that is free because it is rare. Media passes through your infrastructure and leaves it again, so <a href="https://samvyo.com/blog/the-turn-bill-the-self-hosted-video-cost-nobody-forecasts?ref=samvyo.com"><u>what running that relay costs</u></a> should <a href="https://samvyo.com/blog/add-video-to-your-app-why-the-demo-takes-an-afternoon-and-production-takes-months?ref=samvyo.com" rel="noreferrer"><u>budget it as a line item</u></a> rather than appear as a surprise on the first mobile-heavy month.</p><p>One thing this post is deliberately not about: corporate firewalls. Those fail for different reasons — blocked UDP, closed ports, proxies, egress allowlists — and <a href="https://samvyo.com/blog/why-webrtc-breaks-behind-corporate-firewalls-and-the-turn-tcp-fallback-that-fixes-it?ref=samvyo.com"><u>corporate networks break it a different way</u></a>. NAT behaviour and network policy are separate problems that happen to share a fix.</p><h2 id="does-ipv6-solve-this"><strong>Does IPv6 solve this?</strong></h2><p>Partly, and less than people hope.</p><p>IPv6 removes the reason NAT exists. There are enough addresses for every device to have its own, so no translation layer is required and the mapping problem disappears entirely. Where both endpoints have working IPv6, connectivity is genuinely simpler.</p><p>Three things stop this from being the answer. Firewalls remain — a globally routable address is not a reachable one, and stateful filtering still blocks unsolicited inbound traffic, so you still need the same connectivity checks. Coverage is uneven, so any real deployment is dual-stack and has to work when one side has no usable IPv6 at all. And ICE handles both address families simultaneously, which means IPv6 becomes another set of candidates to try rather than a replacement for the process.</p><p><strong>The practical read: IPv6 improves your odds of a direct path and removes none of the machinery. Plan for TURN regardless.</strong></p><h2 id="build-buy-or-deploy"><strong>Build, Buy, or Deploy</strong></h2><h3 id="build-on-open-source"><strong>Build on open source</strong></h3><p>The browser implements ICE, STUN and TURN client behaviour for you — none of that is yours to write. What is yours is the relay: deploying coturn, placing it near users, issuing credentials, and sizing for a relay rate that depends on your users' networks rather than your traffic. For a mobile-first product that rate is substantially higher than the general figures suggest.</p><h3 id="buy-a-cloud-video-api"><strong>Buy a cloud video API</strong></h3><p>Per-minute providers include relay infrastructure, and for connectivity specifically this is one of their strongest arguments — a large distributed relay footprint is genuinely hard to replicate. The limit is visibility: you generally cannot see what share of your sessions are relayed, which is the number that tells you whether your users are where you think they are.</p><h3 id="deploy-a-commercial-platform"><strong>Deploy a commercial platform</strong></h3><p>The middle path runs a commercial platform on infrastructure you choose. Samvyo is one such option: based on SFU architecture, shipping embeddable SDKs, with the media path, TURN and recording kept on infrastructure you control. Relay placement is the relevant part — for mobile users the physical distance to the relay is a direct latency cost, and choosing where it sits is choosing how the fallback path performs. It is resilient by design rather than something you assemble.</p><p>Where it does not fit: if every user is on a managed network you administer, you can often arrange direct connectivity and skip the relay question. And for a low-volume consumer product, a per-minute API bundles relay and costs less.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>NAT traversal fails on a pairing, not on an endpoint, which is why it looks random until you know what to measure. When both sides assign a new mapping per destination — the behaviour RFC 4787 forbids and carrier-grade NAT uses anyway — no direct path exists and a relay is mandatory.</p><p>Wi-Fi to Wi-Fi usually hole punches. Mobile to Wi-Fi usually survives, because the predictable side rescues the unpredictable one. Mobile to mobile across carrier NAT is the combination that always relays. Budget TURN accordingly, and expect a higher relay rate than the averages if your users are mobile.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>For where NAT traversal sits in the wider pipeline, <a href="https://samvyo.com/blog/webrtc-architecture-everything-that-runs-between-two-video-tabs?ref=samvyo.com"><u>the full chain between two video tabs</u></a> walks all eight stages. For the other half of the connectivity problem — corporate policy rather than NAT behaviour — <a href="https://samvyo.com/blog/why-webrtc-breaks-behind-corporate-firewalls-and-the-turn-tcp-fallback-that-fixes-it?ref=samvyo.com"><u>corporate networks break it a different way</u></a> covers blocked UDP, proxies and the fallback ladder.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>Why does my WebRTC call work on Wi-Fi but fail on 4G?</strong></p><p>Because mobile carriers use carrier-grade NAT, which typically assigns a different external port for every destination. That makes the address discovered via STUN useless for reaching your peer, so hole punching cannot work. Home and office routers usually keep one stable mapping per socket, which is why Wi-Fi connects cleanly.</p><p><strong>What is NAT traversal in WebRTC?</strong></p><p>The process of establishing a media path between two devices that both sit behind address translation. ICE gathers candidate addresses — local, STUN-discovered public, and TURN-relayed — then tests every plausible pairing and uses the best one that works. Hole punching is attempted first; a relay is used only when nothing else connects.</p><p><strong>What is symmetric NAT and why does it break WebRTC?</strong></p><p>It is the informal name for address-and-port-dependent mapping: the router creates a new external port for each destination. The mapping discovered while contacting a STUN server therefore does not apply to your peer, so the address you exchange is already wrong. RFC 4787 actually requires endpoint-independent mapping, but carrier-grade NAT does not comply.</p><p><strong>Can two devices both behind symmetric NAT ever connect directly?</strong></p><p>No. Neither side can learn the other's mapping without first receiving a packet, and neither can send a packet to a correct destination. That combination always requires a relay, and it is not a tuning problem — it is structural.</p><p><strong>Does IPv6 fix NAT traversal?</strong></p><p>It helps and does not eliminate the work. IPv6 removes the need for address translation, so the mapping problem disappears where both sides have working IPv6. Firewalls still block unsolicited inbound traffic, coverage is uneven so deployments stay dual-stack, and ICE treats IPv6 as additional candidates rather than a replacement. Plan for TURN regardless.</p><p><strong>Do I need a TURN server if I only support mobile users?</strong></p><p>Especially then. Mobile-to-mobile calls across carrier-grade NAT are the pairing that always requires a relay, so for a mobile-first product relay is the normal path rather than an exception. Expect a materially higher relay rate — and relay bill — than general figures suggest.</p><p><strong>Is NAT traversal the same problem as corporate firewalls blocking WebRTC?</strong></p><p>Related but distinct. NAT traversal is about address mapping and whether a direct path can be discovered. Corporate firewall failures are about policy — blocked UDP, closed ports, forced proxies, egress allowlists. They share a fix in TURN, but they fail for different reasons and need different diagnosis.</p>]]></content:encoded></item><item><title><![CDATA[Why WebRTC Breaks Behind Corporate Firewalls — And the TURN/TCP Fallback That Fixes It]]></title><description><![CDATA[The call works on your laptop, at home, on your phone, and in every test you ran. Then you demo to the customer whose deal you need and nothing connects. Here is what corporate networks actually do to WebRTC, the fallback ladder that gets through, and what that fallback costs you.]]></description><link>https://www.samvyo.com/blog/why-webrtc-breaks-behind-corporate-firewalls-and-the-turn-tcp-fallback-that-fixes-it</link><guid isPermaLink="false">6aaa80e38b45c3f0cd63a7a2</guid><category><![CDATA[Firewall System]]></category><category><![CDATA[TURN Cost]]></category><category><![CDATA[Breaks and Fixes]]></category><category><![CDATA[Video Infrastructure]]></category><category><![CDATA[NAT traversal]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 17 Sep 2026 10:54:43 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--03_57_33-PM.png" medium="image"/><content:encoded><![CDATA[<blockquote>It works on your laptop. It works at home, on your phone, on the office guest wifi, and in every test you ran.</blockquote><img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--03_57_33-PM.png" alt="Why WebRTC Breaks Behind Corporate Firewalls — And the TURN/TCP Fallback That Fixes It"/><p>Then you demo to the enterprise customer whose deal you actually need, and nothing connects. No error worth reading, no obvious cause, just two participants staring at a spinner while someone on the call says "it usually works."</p><p>This is the WebRTC firewall problem, and it is not a bug in your code. It is a network doing exactly what it was configured to do.</p><h2 id="what-a-corporate-network-actually-does-to-webrtc"><strong>What a corporate network actually does to WebRTC</strong></h2><p>Consumer networks are permissive. Enterprise networks are not, and they have several independent ways to break a call — each of which breaks a different part of the chain.</p><ul><li>UDP blocked outbound. WebRTC media prefers UDP, and plenty of corporate egress policies permit only TCP. This alone kills the default path.</li><li>Only ports 80 and 443 allowed. Even where UDP is permitted, the port range WebRTC wants — high ephemeral ports, plus 3478 for STUN and TURN — is frequently closed.</li><li>Forced HTTP proxy. All outbound traffic goes through a proxy that understands HTTP and CONNECT, and nothing else. Media that is not wrapped in something the proxy recognises does not leave the building.</li><li>TLS inspection. A middlebox terminates TLS, inspects the contents, and re-encrypts. Fine for web browsing, and it interferes with protocols that expect an end-to-end path.</li><li>Allowlist-only egress. The strictest posture: outbound connections are permitted only to explicitly approved hostnames. Anything else is dropped whether or not the port is open.</li></ul><p>Each of these is a reasonable security decision made by someone whose job is not enabling your product. They are not going to be turned off because a vendor asked nicely — which means the fix has to be on your side.</p><h2 id="why-the-webrtc-firewall-failure-is-silent-and-looks-like-your-bug"><strong>Why the WebRTC firewall failure is silent and looks like your bug</strong></h2><p>The failure mode is what makes this expensive. <a href="https://samvyo.com/blog/webrtc-architecture-everything-that-runs-between-two-video-tabs?ref=samvyo.com"><u>ICE gathers candidates and probes every pairing</u></a> to find a working path. When none of them work, there is no message that says "a firewall blocked this." There is a connection state that goes to failed, after a timeout, with nothing identifying which of the five causes above was responsible.</p><p>So the user experiences a product that does not work, the salesperson experiences a dead demo, and the engineer experiences a bug report that says "video doesn't connect" with no reproduction outside that building.</p><p>The scale is worth knowing, with its caveat attached. The only substantial public measurement — <a href="https://webrtchacks.com/usage-stats/?ref=samvyo.com"><u>callstats.io, across billions of minutes between January 2015 and February 2016</u></a> — found 12% of sessions failing to establish, with 85% of those failures attributable to NAT or firewall traversal. That data is a decade old and no comparable dataset has been published since, so treat it as an order of magnitude rather than a current rate. Even discounted heavily, it is the single largest cause of WebRTC not working.</p><p>The fix is a fallback ladder, and most of it is configuration rather than code.</p><h2 id="the-fallback-ladder"><strong>The fallback ladder</strong></h2><p>ICE will try these in order and use the first that works. Each rung defeats more restrictive conditions and costs more to run.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="113"><col width="100"><col width="87"><col width="177"><col width="147"/></col></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Rung</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Transport</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Typical port</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What it defeats</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cost</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1. Direct / STUN</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">UDP</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Ephemeral</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Ordinary home NAT</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">None — no relay involved</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2. TURN over UDP</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">UDP</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3478</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Symmetric NAT, restrictive NAT</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Relay bandwidth</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3. TURN over TCP</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">TCP</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3478</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">UDP blocked outbound</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Relay bandwidth + TCP penalty</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">4. TURN over TLS</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">TCP + TLS</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">443</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Port restrictions, most proxies, DPI</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Relay bandwidth + TCP + TLS overhead</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p>Rung four is the one that gets through almost everything, because traffic to port 443 wrapped in TLS is indistinguishable from ordinary HTTPS to most middleboxes. The RFC-assigned port for TURN over TLS is 5349, but in practice 5349 is blocked about as often as 3478 is — so production deployments run it on 443, which is the port nobody can close.</p><p>Configuring all four rungs is straightforward. Running them is not free: every relayed session is media passing through your infrastructure twice, and <a href="https://samvyo.com/blog/the-turn-bill-the-self-hosted-video-cost-nobody-forecasts?ref=samvyo.com"><u>what running that relay actually costs</u></a> is a real line item rather than a rounding error.</p><h2 id="what-turn-over-tcp-costs-you-honestly"><strong>What TURN over TCP costs you, honestly</strong></h2><p>The ladder gets described as a pure win often enough that the tradeoff deserves stating plainly. TCP is a poor transport for real-time media, and rungs three and four are genuinely worse than rungs one and two.</p><p>TCP guarantees delivery and ordering. For a file that is exactly right. For live video it is the wrong guarantee, because a packet carrying a frame from 300 milliseconds ago has no value — the moment has passed, and the correct behaviour is to skip it and move on. TCP will not do that. It stalls everything behind the missing packet until the retransmission arrives, which is head-of-line blocking, and on a lossy connection it produces exactly the stuttering and growing delay that real-time protocols are designed to avoid.</p><p><strong>So rung four is a connectivity mechanism, not a quality mechanism. It converts a call that would not have happened into a call that happens and is worse. That is a good trade — and it is a trade, not a free upgrade.</strong></p><p>Two practical consequences. Keep rungs one and two available so the ladder only descends when it has to; a common misconfiguration forces relay for everyone and degrades sessions that had a perfectly good direct path. And when a user reports poor quality specifically at the office, check whether they are on the TCP rung before looking anywhere else.</p><h2 id="what-to-ask-the-customers-it-team"><strong>What to ask the customer's IT team</strong></h2><p>At some point this becomes a conversation with a network administrator, and the quality of the ask determines whether you get a change or a ticket that quietly dies.</p><p>Vague requests fail. "Please allow WebRTC" is not actionable and sounds like asking for a hole in the firewall. A precise request, scoped to named hosts and specific ports, is something a network team can evaluate and approve.</p><ul><li>Best case — allow outbound UDP to your TURN hostname on 3478, plus the relay port range. This keeps sessions on rung two, where media quality is good.</li><li>Acceptable — allow outbound TCP 443 to your TURN hostname. Almost always already open, so this is often just an allowlist entry rather than a policy change.</li><li>For allowlist-only networks — give them the exact hostnames, not IP ranges. Relay addresses change; hostnames do not.</li><li>Bring the data residency answer with you. Network teams asking about firewall ports are usually about to ask where the media goes, and "through a relay in a region you specify" lands better than "our provider's cloud."</li></ul><p>That last point is worth preparing properly, because it is rarely only a firewall question. <a href="https://samvyo.com/blog/enterprise-video-conferencing-architecture-what-actually-runs-behind-the-six-enterprise-checks?ref=samvyo.com"><u>What actually runs behind the enterprise checks</u></a> covers the wider set, and <a href="https://samvyo.com/blog/communication-sovereignty-building-own-video-conferencing-infrastructure?ref=samvyo.com"><u>keeping the media path on infrastructure you control</u></a> is often the answer that unblocks the conversation.</p><h2 id="testing-before-you-are-in-the-room"><strong>Testing before you are in the room</strong></h2><p><em>All of this is discoverable in advance, and almost nobody does it.</em></p><p>Force relay-only mode in your client — setting the ICE transport policy to relay makes every session use TURN, which verifies your relay configuration actually works rather than hoping it does. Direct paths mask a broken TURN setup completely, and you will not find out until the one call that needs it.</p><p>Test from a genuinely restricted network rather than a simulated one. A corporate guest network, a hotel, or a locked-down VPN profile will each expose different rungs. If you can get a customer's IT team to run a connectivity test from inside their network before the demo, that is worth more than any amount of local testing.</p><p>And check the ICE candidate types your sessions are actually using in production. If a meaningful share are relay candidates, that is your firewall exposure measured rather than assumed — and it belongs in <a href="https://samvyo.com/blog/add-video-to-your-app-why-the-demo-takes-an-afternoon-and-production-takes-months?ref=samvyo.com" rel="noreferrer"><u>the scope this belongs to</u></a> as a line item rather than a surprise.</p><h2 id="build-buy-or-deploy"><strong>Build, Buy, or Deploy</strong></h2><h3 id="build-on-open-source"><strong>Build on open source</strong></h3><p>coturn handles all four rungs and is free, mature and well documented. Running it yourself means placing relays near users, managing certificates for the TLS rung, issuing short-lived credentials, and sizing for demand you do not control. It also means you can allowlist your own hostname for a customer, which is occasionally the difference between a deal and no deal.</p><h3 id="buy-a-cloud-video-api"><strong>Buy a cloud video API</strong></h3><p>Per-minute providers include TURN with all rungs configured, which removes this problem entirely and is one of the better arguments for them. The limits appear with strict customers: you cannot always give an allowlist-only network a stable hostname you control, and you generally cannot place a relay inside a specific jurisdiction on request.</p><h3 id="deploy-a-commercial-platform"><strong>Deploy a commercial platform</strong></h3><p>The middle path runs a commercial platform on infrastructure you choose. Samvyo is one such option: based on SFU architecture, shipping embeddable SDKs, with the media path, TURN and recording kept on infrastructure you control. TURN being yours is the relevant part for enterprise networks — the hostname a customer allowlists is one you own, and the region the relay sits in is one you chose. It is resilient by design rather than something you assemble.</p><p>Where it does not fit: if your users are all consumers on home networks, relay rates are low and a per-minute API is simpler. And if your users sit entirely inside networks you administer, you can open the right ports directly and skip most of this.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>WebRTC failing behind a corporate firewall is not a bug in your application — it is blocked UDP, closed ports, a forced proxy, TLS inspection, or an egress allowlist, failing silently with no error that identifies the cause.</p><p>The fix is the fallback ladder, ending at TURN over TLS on 443, which gets through nearly everything because it is indistinguishable from HTTPS. Configure all four rungs, keep the upper ones available so you only descend when you must, and remember that the bottom rung buys connectivity by giving up quality. Then test with relay forced on, before the demo rather than during it.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>For where this sits in the wider pipeline, <a href="https://samvyo.com/blog/webrtc-architecture-everything-that-runs-between-two-video-tabs?ref=samvyo.com"><u>the full chain between two video tabs</u></a> walks all eight stages and what fails at each. For what the relay layer costs once it is carrying real traffic, <a href="https://samvyo.com/blog/the-turn-bill-the-self-hosted-video-cost-nobody-forecasts?ref=samvyo.com"><u>what running that relay actually costs</u></a> has the arithmetic.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>Why does WebRTC fail behind a corporate firewall?</strong></p><p>Usually because UDP is blocked outbound, or because only ports 80 and 443 are permitted, or because a proxy or TLS-inspecting middlebox sits in the path. WebRTC prefers UDP on high ephemeral ports, which is exactly what enterprise egress policies restrict. The failure is silent — ICE simply finds no working path and the connection times out.</p><p><strong>What ports does WebRTC need open?</strong></p><p>Ideally outbound UDP to your TURN server on 3478 plus its relay port range, which keeps media on a good-quality path. The reliable fallback is outbound TCP on 443 to your TURN hostname, which is almost always already permitted. The RFC port for TURN over TLS is 5349, but it is blocked often enough that production deployments use 443 instead.</p><p><strong>Does TURN over TCP affect video quality?</strong></p><p>Yes, and meaningfully. TCP guarantees delivery and ordering, which is the wrong guarantee for live media — a retransmitted packet carrying a frame from 300 ms ago is useless, but TCP stalls everything behind it until it arrives. That head-of-line blocking causes stuttering and growing delay. It is a connectivity mechanism, not a quality one.</p><p><strong>How do I test whether my TURN configuration works?</strong></p><p>Force relay-only mode by setting the ICE transport policy to relay, which makes every session use TURN instead of a direct path. A working direct connection completely masks a broken relay setup, so without forcing it you will not discover the problem until a customer on a restricted network does.</p><p><strong>What should I ask a customer's IT team to allow?</strong></p><p>Be specific or it will not happen. Best case: outbound UDP to your TURN hostname on 3478 plus the relay port range. Acceptable: outbound TCP 443 to that hostname, which is usually already open and may only need an allowlist entry. Always give hostnames rather than IP ranges, since relay addresses change.</p><p><strong>What percentage of WebRTC calls fail because of firewalls?</strong></p><p>The only substantial public measurement, from callstats.io between January 2015 and February 2016, found 12% of sessions failing to establish with 85% of those caused by NAT or firewall traversal. No comparable dataset has been published since, so treat it as an order of magnitude rather than a current figure — but it remains the largest single cause of WebRTC not working.</p><p><strong>Can I avoid TURN entirely?</strong></p><p>Only if every user is on a permissive network, which in practice means consumer connections. Any enterprise deployment will encounter networks where no direct path exists, and for those users a relay is the only option. Skipping TURN does not remove the cost — it converts it into calls that never connect.</p>]]></content:encoded></item><item><title><![CDATA[What Sub-80ms Video Latency Actually Means — And Why Most "Real-Time" Isn't]]></title><description><![CDATA[A commodity webcam and a 60Hz screen consume about 110 milliseconds before a single byte is encoded. So sub-80ms glass-to-glass is not fast — it is arithmetically unavailable. Here is what the number actually measures, why that is still legitimate, and the one question worth asking.]]></description><link>https://www.samvyo.com/blog/what-sub-80ms-video-latency-actually-means-and-why-most-real-time-isnt</link><guid isPermaLink="false">6aaa80988b45c3f0cd63a79c</guid><category><![CDATA[Video Latency]]></category><category><![CDATA[Video Infrastructure]]></category><category><![CDATA[WebRTC]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 17 Sep 2026 10:54:38 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--03_43_23-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--03_43_23-PM.png" alt="What Sub-80ms Video Latency Actually Means — And Why Most &quot;Real-Time&quot; Isn't"/><p>Point a camera at a screen showing its own feed. Measure how long a frame takes to come back around.</p><p>On commodity hardware, doing nothing else at all — no encoding, no network, no decoding — that loop takes about 110 milliseconds.</p><p>Which means sub-80ms glass-to-glass is not a difficult target. It is an unavailable one. The camera and the screen have already spent the budget before anything you build gets involved.</p><p>That is not an accusation against anyone's marketing, including ours. It is an argument that the number is meaningless without a measurement point — and that once you state the measurement point, sub-80ms becomes both true and useful.</p><h2 id="two-numbers-that-get-treated-as-one"><strong>Two numbers that get treated as one</strong></h2><p>Network round-trip time is what WebRTC's own statistics report: the time for a packet to reach the far endpoint and an acknowledgement to return. It measures the network. It excludes capture, encode, decode and display entirely.</p><p>Glass-to-glass is the time from a photon striking the camera sensor to the corresponding photon leaving the far display. It measures everything.</p><p><strong>These are not variations on a theme. They measure different spans of the same pipeline, and on real hardware they differ by more than an order of magnitude. When a vendor says "sub-80ms" without qualification, the reader hears glass-to-glass and the vendor almost always means something closer to the first.</strong></p><h2 id="the-measurement-that-settles-it"><strong>The measurement that settles it</strong></h2><p>Transitive Robotics <a href="https://transitiverobotics.com/blog/webrtc-latency-breakdown/?ref=samvyo.com"><u>ran the infinite-mirror test properly</u></a>: a camera pointed at a screen displaying its own feed, high-precision timestamps overlaid on the image, measured across many cycles. Three USB3 cameras — a RealSense D435, a Logitech C925e and a 2MP wide-angle — on an Ubuntu desktop at 30 fps capture with a 60 Hz display. Remote testing routed through a cloud relay from California to Oregon.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="413"><col width="211"/></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Stage</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Measured latency</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Capture, USB transfer and display rendering</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">~100 ms</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">H.264 encode</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">~10 ms</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">WebRTC transport, local network</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">~0 ms</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">H.264 decode</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">~10 ms</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Network, remote via cloud relay</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">~30 ms</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p>Totals: about 110 ms with no codec involved at all, 130 ms encoded over a local network, 170 ms remote through a relay.</p><p><strong>The two ends nobody thinks about — the camera and the screen — cost more than the encoder, the network and the decoder combined.</strong></p><p>A 30 fps camera cannot produce a frame more often than every 33 ms, and a 60 Hz display cannot show one more often than every 17 ms, before either has done any processing. Add USB transfer, sensor readout and compositing, and 100 ms is not a bad result. It is roughly what that hardware costs.</p><h2 id="so-what-is-sub-80ms-video-latency-actually-measuring"><strong>So what is sub-80ms video latency actually measuring?</strong></h2><p>Network transport plus codec. Which is to say: the part of the chain a video platform actually controls.</p><p>Read the table again with that in mind. Encode at 10 ms, decode at 10 ms, network at 30 ms — that is 50 ms for everything between the camera's output and the display's input. Sub-80ms for that span is entirely achievable and genuinely hard to hit, requiring efficient routing, short geographic paths and disciplined buffering.</p><p>So the claim is not false. It is incomplete. It describes a real engineering achievement over the span a vendor is responsible for, and then gets read as a claim about a span that includes hardware the vendor has never touched.</p><p><strong>The honest formulation is a span, not a number: sub-80ms from ingest to egress, or from encoder input to decoder output. Say which, and the claim becomes checkable. Leave it off, and it is unfalsifiable — which is the real problem, not the figure.</strong></p><h2 id="where-the-rest-of-the-time-goes"><strong>Where the rest of the time goes</strong></h2><p><em>Three places, in descending order of size.</em></p><p>Capture and display dominate, as measured. This is a hardware property: sensor readout, USB or MIPI transfer, driver buffering, compositor, panel refresh and pixel response. A 30 fps webcam and a 60 Hz monitor are not built for minimum latency and were never intended to be.</p><p>Buffering is the invisible middle. <a href="https://samvyo.com/blog/webrtc-architecture-everything-that-runs-between-two-video-tabs?ref=samvyo.com"><u>The jitter buffer holds frames on purpose</u></a>, reordering packets and releasing frames at a steady cadence so playback is smooth rather than stuttering. It is adaptive: a more variable network gets a deeper buffer and therefore more delay. Nobody sets this per call, and almost nobody counts it when quoting a number.</p><p>Format conversion, where it exists, is pure addition. Anything that transcodes or repackages between protocols pays for it in milliseconds — which is exactly why <a href="https://samvyo.com/blog/live-video-in-surveillance-why-rtsp-cameras-still-cant-talk-to-web-browsers-in-2026?ref=samvyo.com"><u>RTSP cameras and the browser gap</u></a> is a latency question as much as a compatibility one.</p><h2 id="how-the-floor-actually-gets-lowered"><strong>How the floor actually gets lowered</strong></h2><p>The 100 ms is a property of commodity hardware, not a law. Purpose-built capture equipment, global-shutter sensors, direct capture paths that bypass the usual driver stack, and low-persistence displays at 120 Hz or higher all cut it substantially — which is why professional broadcast and competitive-gaming figures look different from webcam figures.</p><p>That is worth stating plainly because it explains an apparent contradiction. When someone reports genuinely low glass-to-glass latency, they are usually not using a Logitech webcam and an office monitor. The pipeline in the middle may be identical; the ends are not.</p><p>For anything running in a browser on equipment your users already own, the commodity floor is the one that applies. Which raises the more useful question: how low does it actually need to be?</p><h2 id="what-latency-actually-buys-you-by-application"><strong>What latency actually buys you, by application</strong></h2><p>Different jobs have genuinely different thresholds, and most of them are nowhere near 80 ms.</p><p>For conversation, <a href="https://www.itu.int/rec/T-REC-G.114?ref=samvyo.com"><u>ITU-T Recommendation G.114</u></a> puts one-way transmission time up to 150 ms as acceptable for most applications, with 150–400 ms usable if the effect is understood, and beyond 400 ms unacceptable for general planning. That recommendation addresses mouth-to-ear voice delay rather than video, so treat it as the well-established anchor for conversational tolerance rather than a video specification — but it makes the point that human conversation does not need 80 ms, and never did.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="167"><col width="247"><col width="211"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Application</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What latency governs</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Practical threshold</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Two-way conversation</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Turn-taking without talking over each other</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Under ~150 ms one-way (ITU-T G.114, voice)</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Live monitoring on a video wall</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">How stale the operator's picture is</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Seconds matter; sub-second is comfortable</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Talk-down intervention</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Whether a warning lands while it still changes behaviour</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Governed by the whole response chain, not the stream</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Remote camera control (PTZ)</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Whether steering feels connected to the input</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Tightest of these — the control loop is the constraint</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">One-way broadcast</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Almost nothing, unless there is a back channel</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Seconds are fine</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p>The pattern is that latency matters most where a human is closing a control loop. <a href="https://samvyo.com/blog/ptz-over-the-web-why-steering-a-camera-is-harder-than-streaming-it?ref=samvyo.com"><u>Steering a camera is harder than streaming it</u></a> for exactly this reason, while a one-way broadcast tolerates seconds without anyone noticing.</p><p>And for the operational cases, the stream latency is usually the smallest term. <a href="https://samvyo.com/blog/talk-down-at-ten-seconds-is-theater-the-surveillance-intervention-latency-budget?ref=samvyo.com"><u>The intervention latency budget</u></a> and <a href="https://samvyo.com/blog/the-blind-five-seconds-what-live-view-latency-costs-you-on-a-video-wall?ref=samvyo.com"><u>what live-view latency costs on a video wall</u></a> both show the same thing: detection, decision and human reaction dominate, and shaving 20 ms off transport changes an outcome far less than the marketing implies.</p><h2 id="the-question-worth-asking"><strong>The question worth asking</strong></h2><p><em>One sentence, for any latency claim including ours:</em></p><p><strong><em>Measured from where to where?</em></strong></p><p>A good answer names a span — ingest to egress, encoder input to decoder output, glass to glass — and says what hardware it assumes. A vague answer is not necessarily dishonest; it usually means network RTT, quoted by someone who has not thought about where the reader will assume the measurement starts.</p><p>A second question is worth asking too: measured under what conditions? A figure from an unloaded server on a short path is a different figure from one under production load across regions. Both are real; only one describes your deployment.</p><h2 id="build-buy-or-deploy"><strong>Build, Buy, or Deploy</strong></h2><p><em>Three routes, with the honest boundary on each.</em></p><h3 id="build-on-open-source"><strong>Build on open source</strong></h3><p>Building against mediasoup, Janus, Pion or LiveKit gives you direct access to the parts of the budget you can actually influence: routing path, buffer configuration, codec choice. It also gives you the measurement instrumentation, which matters more than it sounds — most teams cannot say what their real latency is because nothing is measuring it end to end.</p><h3 id="buy-a-cloud-video-api"><strong>Buy a cloud video API</strong></h3><p>Per-minute providers typically deliver good transport latency through large distributed footprints, which is genuinely valuable and hard to replicate. The limits are that you cannot choose the routing path, you usually cannot see the jitter buffer behaviour, and the published figure is theirs rather than yours.</p><h3 id="deploy-a-commercial-platform"><strong>Deploy a commercial platform</strong></h3><p>The middle path runs a commercial platform on infrastructure you choose. Samvyo is one such option: based on SFU architecture, shipping embeddable SDKs, with the media path, TURN and recording kept on infrastructure you control. Path length is the relevant part here, since where the media path sits relative to your users is one of the few levers that genuinely moves transport latency. It is resilient by design rather than something you assemble.</p><p>Where it does not fit: if your application tolerates seconds — one-way broadcast, most monitoring — latency is not your selection criterion and you should choose on cost or operational fit instead. And if you need latency below the commodity floor, the answer is capture and display hardware, not a different platform.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>A commodity camera and screen consume roughly 110 ms before any encoding, so sub-80ms glass-to-glass is not slow or fast — it is arithmetically unavailable on that hardware. Every sub-80ms claim in this category, ours included, describes network transport plus codec: the span a platform actually controls.</p><p>That span is a legitimate and hard-won number. State it as a span rather than a bare figure, ask any vendor to do the same, and then check whether your application needs it at all — because most of them need far less than 80 ms, and the ones that need more than the stream can give are limited by the human in the loop, not the pipeline.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>For where each millisecond sits in the pipeline, <a href="https://samvyo.com/blog/webrtc-architecture-everything-that-runs-between-two-video-tabs?ref=samvyo.com"><u>the full chain between two video tabs</u></a> walks all eight stages and what fails at each. For the operational side — what live-view delay actually costs someone watching a wall — <a href="https://samvyo.com/blog/the-blind-five-seconds-what-live-view-latency-costs-you-on-a-video-wall?ref=samvyo.com"><u>what live-view latency costs on a video wall</u></a> covers the same arithmetic from the operator's seat.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What does sub-80ms video latency actually mean?</strong></p><p>In practice it means network transport plus codec — the span between an encoder's input and a decoder's output, which is the part a video platform controls. It does not mean glass-to-glass, because a commodity camera and display consume roughly 110 ms on their own before any encoding happens.</p><p><strong>What is the difference between glass-to-glass latency and network RTT?</strong></p><p>Network RTT measures a packet's round trip between endpoints and is what WebRTC's own statistics report; it excludes capture, encode, decode and display. Glass-to-glass measures from photon at the sensor to photon at the far display, including all of that. On real hardware they differ by more than an order of magnitude.</p><p><strong>Is sub-80ms latency possible in a browser?</strong></p><p>For network transport plus codec, yes, and it takes real engineering — efficient routing, short geographic paths, disciplined buffering. For glass-to-glass on a standard webcam and monitor, no. Measured figures put capture, USB transfer and display rendering alone at around 100 ms.</p><p><strong>Why is my video latency higher than the number my vendor published?</strong></p><p>Most likely three reasons. Your camera and display are included in what you are experiencing and were excluded from theirs. Your jitter buffer is deeper because your network is more variable. And their figure was probably measured on a short path under light load rather than across regions in production.</p><p><strong>How much latency does a video call actually need?</strong></p><p>Less than the marketing suggests. ITU-T Recommendation G.114 puts one-way delay up to 150 ms as acceptable for most applications — that is a voice recommendation rather than a video one, but it establishes that conversation does not require 80 ms. Latency matters most where a human closes a control loop, such as steering a remote camera.</p><p><strong>Does a jitter buffer add latency?</strong></p><p>Yes, deliberately. It holds arriving packets briefly to reorder them and release frames at a steady cadence, trading delay for smooth playback. It is adaptive, so a more variable network produces a deeper buffer and more delay, and it is routinely left out of quoted latency figures.</p><p><strong>How do I measure my own video latency?</strong></p><p>The infinite-mirror method is the honest one: point the camera at a screen showing its own feed with a high-precision timestamp overlaid, and measure the difference between the live timestamp and the one visible in the loop. It captures the whole chain including capture and display, which per-component measurements and getStats figures do not.</p>]]></content:encoded></item><item><title><![CDATA[WebRTC Architecture: Everything That Runs Between Two Video Tabs]]></title><description><![CDATA[A video call is a chain of eight stages, and only two of them are video. The other six are negotiation and transport — which is why almost nothing that breaks in browser video is actually the video. Here is the whole chain, in order, with what fails at each link and who owns it.]]></description><link>https://www.samvyo.com/blog/webrtc-architecture-everything-that-runs-between-two-video-tabs</link><guid isPermaLink="false">6aaa7fc68b45c3f0cd63a796</guid><category><![CDATA[Video Architecture]]></category><category><![CDATA[WebRTC]]></category><category><![CDATA[real-time communication SDKs]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 17 Sep 2026 10:54:32 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--03_27_08-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--03_27_08-PM.png" alt="WebRTC Architecture: Everything That Runs Between Two Video Tabs"/><p><em>If you arrived here from the </em><a href="https://samvyo.com/blog/add-video-to-your-app-why-the-demo-takes-an-afternoon-and-production-takes-months?ref=samvyo.com" rel="noreferrer"><em>business version</em></a><em>, you're in the right place. </em>That piece covered why the demo takes an afternoon and production takes months<em>. This is the companion "what" — the actual chain between two tabs, stage by stage, and what fails at each link.</em></p><p>Two browser tabs, one video call. Between them sit eight distinct stages, and exactly two of them handle video.</p><p>The other six are negotiation and transport: agreeing how to talk, finding a path, securing it, and compensating for a network that will not behave. That ratio explains the single most useful fact about WebRTC architecture — almost nothing that breaks in browser video is the video. It is the route to it, and the handshake around it.</p><p>Walk the chain once in order and both the failure modes and the latency budget fall out of the same walk.</p><h2 id="the-webrtc-architecture-in-eight-stages"><strong>The WebRTC architecture in eight stages</strong></h2><h3 id="1-signalling-%E2%80%94-and-it-is-not-part-of-webrtc"><strong>1. Signalling — and it is not part of WebRTC</strong></h3><p>Before any media moves, the two peers must exchange session descriptions: what codecs they support, what media they intend to send, and how to reach them. This exchange is SDP offer/answer, and the specification deliberately does not say how to transport it.</p><p>That is not an oversight. It means you build signalling yourself, usually over WebSocket, along with the identity, room membership and permission model around it. Most SDK integrations are mostly this — <a href="https://samvyo.com/blog/how-to-integrate-a-video-sdk-rooms-tokens-tracks-and-the-parts-the-quickstart-skips?ref=samvyo.com"><u>rooms, tokens and tracks</u></a> is the shape it takes in practice.</p><p>The consequence for debugging: signalling bugs are always yours. There is no standard implementation to blame, no reference behaviour to compare against, and no browser doing it for you. It is also where a surprising share of "WebRTC problems" actually live.</p><h3 id="2-ice-%E2%80%94-finding-a-path-that-works"><strong>2. ICE — finding a path that works</strong></h3><p>With descriptions exchanged, each side gathers candidate addresses: its local host address, its public address as seen from outside (discovered via STUN), and a relayed address on a TURN server if one is configured. The two sides then probe every plausible pairing until something connects, and pick the best one.</p><p>Most of the time a direct path works and costs you nothing. When it does not — symmetric NAT, corporate firewalls, restrictive carriers — the only option is a relay, and <a href="https://samvyo.com/blog/the-turn-bill-the-self-hosted-video-cost-nobody-forecasts?ref=samvyo.com"><u>roughly one session in five ends up relayed</u></a> on the best public measurement available.</p><p>This is the stage that produces "works on my machine" in its purest form. Your office network and your customer's office network are not the same problem, and only one of them was tested.</p><h3 id="3-dtls-handshake-%E2%80%94-encryption-is-mandatory"><strong>3. DTLS handshake — encryption is mandatory</strong></h3><p>Once a path exists, the peers run a DTLS handshake over it and derive the keys used to encrypt media as SRTP. This is not optional and cannot be turned off; unencrypted WebRTC media does not exist.</p><p>For security reviews that is a straightforward answer. For latency it is a cost: the handshake is a round trip before the first frame, which is part of why connection setup is measured in hundreds of milliseconds rather than tens. It also introduces a failure mode that reads as mysterious when you meet it — a certificate fingerprint mismatch between what was advertised in SDP and what the handshake presents fails the connection after ICE has already succeeded, which looks like the network breaking for no reason.</p><h3 id="4-codec-negotiation-%E2%80%94-the-intersection-not-the-preference"><strong>4. Codec negotiation — the intersection, not the preference</strong></h3><p>Both sides listed supported codecs in their session descriptions. What gets used is the intersection, ordered by preference, and the intersection is frequently smaller than either side expects.</p><p>H.264 and VP8 are effectively universal. VP9 and AV1 are widely but not uniformly supported. H.265 over WebRTC <a href="https://chromestatus.com/feature/5153479456456704?ref=samvyo.com"><u>ships in Chrome 136</u></a> and Safari 18, both requiring hardware encode and decode, and is absent from Firefox and <a href="https://learn.microsoft.com/en-us/answers/questions/5875799/edge-webrtc-h265-support?ref=samvyo.com"><u>from Edge</u></a> — which is notable precisely because Edge runs the same Chromium engine as Chrome and still has not enabled it.</p><p><strong>So codec support is not a property of the standard or even of the engine. It is a shipping decision per browser, dependent on the user's hardware, and negotiated per call. The practical consequence is that H.264 stays the floor and anything better is an opportunistic upgrade you cannot rely on.</strong></p><h3 id="5-rtp-and-rtcp-%E2%80%94-the-media-and-the-conversation-about-the-media"><strong>5. RTP and RTCP — the media, and the conversation about the media</strong></h3><p>Media flows as RTP packets. Alongside them runs RTCP, a feedback channel carrying reception statistics, retransmission requests for lost packets, and keyframe requests.</p><p>RTCP is where the system's self-correction lives, and it has a cost worth knowing. When a receiver misses something it cannot reconstruct, it asks for a fresh keyframe. Keyframes are large — often an order of magnitude bigger than the frames between them — so a burst of keyframe requests from multiple receivers can push a publisher's outbound bitrate up substantially at exactly the moment the network is already struggling. <a href="https://mediasoup.org/documentation/v3/scalability/?ref=samvyo.com"><u>mediasoup's documentation</u></a> notes broadcaster bitrate rising two to three times under repeated keyframe requests.</p><p>This is also why a newly joined viewer sees black for a moment: they cannot decode anything until the next keyframe arrives, and asking for one early costs the publisher bandwidth.</p><h3 id="6-the-jitter-buffer-%E2%80%94-where-real-time-quietly-goes"><strong>6. The jitter buffer — where real-time quietly goes</strong></h3><p>Packets arrive out of order and unevenly spaced. The jitter buffer holds them briefly, reorders them, and releases frames at a steady cadence so playback is smooth rather than stuttering.</p><p>It is doing exactly what it should, and it is deliberately trading latency for smoothness. The buffer is adaptive: a network with more variance gets a deeper buffer and therefore more delay. Nobody chooses this per call, and almost nobody counts it when quoting a latency number.</p><p>Which matters, because this is a real part of the delay a user experiences rather than an implementation detail. On a video wall, <a href="https://samvyo.com/blog/the-blind-five-seconds-what-live-view-latency-costs-you-on-a-video-wall?ref=samvyo.com"><u>what that delay costs an operator watching a wall</u></a> is the operational version of the same arithmetic.</p><h3 id="7-bandwidth-estimation-%E2%80%94-reacting-before-it-breaks"><strong>7. Bandwidth estimation — reacting before it breaks</strong></h3><p><a href="https://samvyo.com/blog/webrtc-bandwidth-estimation-why-your-call-downgrades-before-it-drops?ref=samvyo.com" rel="noreferrer"><u>Bandwidth estimation</u></a> runs continuously, inferring available capacity from the timing of arriving packets. Modern implementations watch the delay gradient — whether packets are arriving progressively later than they were sent — which signals a filling queue before any packet is actually lost.</p><p>When it detects congestion it reduces the sending rate, which means dropping resolution, frame rate, or a simulcast layer. Users read this as the call getting worse. It is the safety mechanism working: the alternative to a downgrade is not better quality, it is a stalled call.</p><h3 id="8-decode-and-render"><strong>8. Decode and render</strong></h3><p>Frames leave the jitter buffer, get decoded, and are painted to the screen. Straightforward, and the reason it belongs in the list is that it is not free — and it is where the honest latency accounting gets uncomfortable.</p><h2 id="the-chain-and-who-owns-each-link"><strong>The chain, and who owns each link</strong></h2><p>The same eight stages, with ownership and failure mode side by side. The pattern in the middle column is the point.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="160"><col width="171"><col width="293"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Stage</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Who owns it</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What fails here</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1. Signalling</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">You</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Everything — no standard, no reference implementation</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2. ICE / NAT traversal</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Browser + your TURN</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Connection never establishes, silently, on corporate networks</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3. DTLS handshake</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Browser</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Fingerprint mismatch; a round trip of setup latency</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">4. Codec negotiation</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Browser + hardware</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Smaller intersection than expected; H.265 asymmetry</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">5. RTP / RTCP</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Browser + media server</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Keyframe storms raising publisher bitrate under stress</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">6. Jitter buffer</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Browser</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Invisible latency nobody counts</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">7. Bandwidth estimation</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Browser + media server</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Quality drops that users report as bugs</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">8. Decode and render</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Browser + device</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Client-side limits, especially with many streams</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p><strong>Two stages touch video. Six are negotiation, transport and compensation — and every one of the six has a failure mode that presents to a user as "the video is broken."</strong></p><h2 id="where-the-milliseconds-actually-go"><strong>Where the milliseconds actually go</strong></h2><p>Worth putting numbers on the chain, because the intuition is usually wrong about which links are expensive.</p><p>Transitive Robotics <a href="https://transitiverobotics.com/blog/webrtc-latency-breakdown/?ref=samvyo.com"><u>measured a WebRTC pipeline end to end</u></a> using an infinite-mirror setup — a camera pointed at a screen showing its own feed, with high-precision timestamps overlaid. On commodity USB3 cameras at 30 fps with a 60 Hz display, capture, USB transfer and display rendering together accounted for roughly 100 ms. H.264 encode added about 10 ms, decode about 10 ms, and a remote hop through a cloud relay about 30 ms. Total: around 110 ms with no encoding at all, 130 ms locally, 170 ms remote.</p><p><strong>Read that again in the context of the chain. The camera and the screen — the two ends nobody thinks about — cost more than the encoder, the network and the decoder combined.</strong></p><p>This is the honest counterweight to every latency claim in this category, ours included. Sub-100ms glass-to-glass is not available on a commodity webcam, not because the protocol is slow but because the hardware at each end is. Any number below that is measuring network transport plus codec, which is a legitimate and useful figure — as long as the measurement point is stated.</p><h2 id="what-webrtc-architecture-hands-you-and-what-it-doesnt"><strong>What WebRTC architecture hands you, and what it doesn't</strong></h2><p>The browser gives you ICE, DTLS-SRTP, RTP handling, jitter buffering, bandwidth estimation and codec implementations. That is a substantial amount of hard engineering, standardised and free.</p><p>It does not give you signalling, identity, room membership, permissions, reconnection logic, TURN infrastructure, or any behaviour beyond two peers. Each of those is yours, and together they are most of what a video integration actually consists of.</p><p>Two peers is also the architectural limit of what the browser alone will do. A third participant means every peer sends to every other peer, which client uplink and CPU cannot sustain past four or five — at which point <a href="https://samvyo.com/blog/what-is-an-sfu-and-why-does-every-video-platform-use-one?ref=samvyo.com"><u>what an SFU is and why every platform uses one</u></a> stops being background reading and becomes a component you have to run.</p><h2 id="build-buy-or-deploy"><strong>Build, Buy, or Deploy</strong></h2><p><em>Three routes, with the honest boundary on each.</em></p><h3 id="build-on-open-source"><strong>Build on open source</strong></h3><p>Working directly against the browser APIs with mediasoup, Janus, Pion or LiveKit on the server gives you every stage of this chain to inspect and tune. That is genuinely valuable when you have unusual requirements, and it means owning signalling, TURN, reconnection and the browser-quirk long tail — the six stages that are not video.</p><h3 id="buy-a-cloud-video-api"><strong>Buy a cloud video API</strong></h3><p>Per-minute providers wrap the whole chain, which is the fastest route to a working feature and removes stages 1 through 7 from your problem list. The limits are visibility and control: when something fails at stage 2 or stage 7, you generally cannot see which stage it was, and you inherit the provider's policy where you might have wanted your own.</p><h3 id="deploy-a-commercial-platform"><strong>Deploy a commercial platform</strong></h3><p>The middle path runs a commercial platform on infrastructure you choose. Samvyo is one such option: based on SFU architecture, shipping embeddable SDKs, with the media path, TURN and recording kept on infrastructure you control. Stage 2 is the relevant one — TURN placement is yours, which is both the most common failure point in the chain and the one most affected by where the relay physically sits. It is resilient by design rather than something you assemble.</p><p>Where it does not fit: if you need to modify behaviour at the protocol level — custom congestion control, an unusual codec pipeline — building against the libraries directly is the honest answer. And for a two-party feature that will never need a media server, the browser alone plus a little signalling is genuinely sufficient.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Eight stages sit between two video tabs and only two of them are video. Signalling, ICE, DTLS, codec negotiation, RTCP feedback, jitter buffering and bandwidth estimation are the rest — and they are where the failures, and most of the engineering, actually live.</p><p>When browser video breaks, the odds strongly favour the route or the handshake over the media. Debug the chain in order rather than starting at the picture, and measure latency with the measurement point stated — because the camera and the screen cost more than the network does.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>The business companion, <a href="https://samvyo.com/blog/add-video-to-app-why-the-demo-takes-an-afternoon-and-production-takes-months?ref=samvyo.com"><u>why the demo takes an afternoon and production takes months</u></a>, turns this chain into a scope table you can plan against. For the stage most likely to bite first, <a href="https://samvyo.com/blog/the-turn-bill-the-self-hosted-video-cost-nobody-forecasts?ref=samvyo.com"><u>roughly one session in five ends up relayed</u></a> covers the relay layer and what it costs.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What is WebRTC architecture, in simple terms?</strong></p><p>A chain of eight stages between two endpoints: signalling to exchange session descriptions, ICE to find a network path, a DTLS handshake to derive encryption keys, codec negotiation, RTP and RTCP to carry media and feedback, a jitter buffer to smooth arrival, bandwidth estimation to adapt to congestion, and decode and render. Only the last two and the codec stage touch video.</p><p><strong>Is signalling part of WebRTC?</strong></p><p>No, and this surprises most people. The specification defines the session description format but deliberately not how to transport it. You build signalling yourself, typically over WebSocket, along with identity, room membership and permissions. It is one of the largest pieces of work in any integration and every bug in it is yours.</p><p><strong>Why do WebRTC calls fail on corporate networks?</strong></p><p>Stage two. ICE tries to find a direct path between peers, and corporate networks often prevent one — symmetric NAT, blocked UDP, firewalls allowing only outbound TCP on 443. Without a TURN relay configured for those conditions the connection simply never establishes, and it fails silently on exactly the networks enterprise customers use.</p><p><strong>Is WebRTC media encrypted?</strong></p><p>Always, and it cannot be disabled. After ICE finds a path, the peers run a DTLS handshake and use the derived keys for SRTP. There is no unencrypted mode. The cost is a round trip during setup, and one unusual failure mode: a certificate fingerprint mismatch fails the connection after ICE has already succeeded.</p><p><strong>What is a jitter buffer and does it add latency?</strong></p><p>It holds arriving packets briefly to reorder them and release frames at a steady cadence, so playback is smooth instead of stuttering. Yes, it adds latency by design, and it is adaptive — a more variable network gets a deeper buffer and more delay. It is a real component of what a user experiences, and it is routinely excluded from quoted latency figures.</p><p><strong>Which codec should I use for WebRTC?</strong></p><p>H.264 as the floor, since it is effectively universal. Treat anything better as an opportunistic upgrade: VP9 and AV1 are widely but unevenly supported, and H.265 ships in Chrome 136 and Safari 18 with hardware encode and decode required, while Firefox and Edge do not support it at all. Codec availability is a per-browser shipping decision, not a property of the standard.</p><p><strong>At what point do I need a media server instead of peer-to-peer?</strong></p><p>At the third participant. Two peers connect directly with no server in the media path. From three onward each participant must send to every other participant, which client uplink and CPU cannot sustain past four or five. A media server such as an SFU then becomes a requirement, and it is a step change in architecture rather than an incremental addition.</p><p>\</p>]]></content:encoded></item><item><title><![CDATA[Add Video to Your App: Why the Demo Takes an Afternoon and Production Takes Months]]></title><description><![CDATA[The prototype works on the first try, and that is the problem — it teaches you the wrong estimate. Two laptops on the same office wifi exercise almost none of what production video has to survive. Here is what actually consumes the schedule, and a scope table you can plan against.]]></description><link>https://www.samvyo.com/blog/add-video-to-your-app-why-the-demo-takes-an-afternoon-and-production-takes-months</link><guid isPermaLink="false">6aaa7f0b8b45c3f0cd63a790</guid><category><![CDATA[Video Conferencing Infrastructure]]></category><category><![CDATA[decision guide]]></category><category><![CDATA[video SDK architecture]]></category><category><![CDATA[Time Effort]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 17 Sep 2026 10:54:26 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--03_14_28-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--03_14_28-PM.png" alt="Add Video to Your App: Why the Demo Takes an Afternoon and Production Takes Months"/><p>The prototype worked on the first try. Two laptops, a sample app, faces on screen inside an afternoon.</p><p>That is the problem. It worked because almost nothing was being tested. <br>Both machines were on the same office network, behind the same router, with no firewall between them, on a connection that never degraded, in browsers that were already open and focused. Production video has to survive the exact opposite of all of that, and the gap between the two is where the schedule goes.</br></p><h2 id="what-the-afternoon-demo-actually-proved"><strong>What the afternoon demo actually proved</strong></h2><p>It proved the API works. That is worth knowing and it is roughly all it establishes.</p><p>Here is what a same-network demo does not exercise: NAT traversal of any difficulty, corporate firewalls, mobile carrier networks, connections that change mid-call, bandwidth that fluctuates, devices that get unplugged, browsers that background the tab, permissions that get denied, more than two participants, and anything at all about what users see when something goes wrong.</p><p>The engineering work is almost entirely in that list. This post is about the schedule that list represents. There is a separate and equally real set of questions about <a href="https://samvyo.com/blog/adding-video-to-your-product-what-integrate-a-video-sdk-actually-costs-and-commits-you-to?ref=samvyo.com"><u>the commitments that come with the integration</u></a> — pricing model, data residency, lock-in — which are commercial rather than technical, and which deserve their own analysis.</p><p>Four categories consume the calendar. They are the same four on every project.</p><h2 id="the-four-things-that-eat-the-schedule-when-you-add-video-to-an-app"><strong>The four things that eat the schedule when you add video to an app</strong></h2><h3 id="1-getting-connected-at-all"><strong>1. Getting connected at all</strong></h3><p>WebRTC attempts a direct connection between endpoints. On a home network that usually works. On a corporate network it frequently does not — symmetric NAT, blocked UDP, firewalls that permit nothing but outbound TCP on 443.</p><p>The fix is a relay, and <a href="https://samvyo.com/blog/the-turn-bill-the-self-hosted-video-cost-nobody-forecasts?ref=samvyo.com"><u>roughly one session in five needs a relay</u></a> based on <a href="https://webrtchacks.com/usage-stats/?ref=samvyo.com"><u>the only substantial public measurement available</u></a>, which is itself a decade old. Standing that up means deploying TURN servers, placing them near users, issuing short-lived credentials per session, and configuring TLS on 443 for the strictest networks. None of it is in the quickstart — it sits alongside <a href="https://samvyo.com/blog/how-to-integrate-a-video-sdk-rooms-tokens-tracks-and-the-parts-the-quickstart-skips?ref=samvyo.com"><u>the parts the quickstart skips</u></a> generally.</p><p>This is also the category with the worst failure mode, because it fails silently on exactly the networks your enterprise customers use. The demo that worked in your office is the demo that fails in theirs.</p><h3 id="2-surviving-a-network-that-changes"><strong>2. Surviving a network that changes</strong></h3><p>A real call lasts longer than a network stays still. Users move from wifi to cellular, walk out of range and back, resume from a laptop that slept, sit on a train through a tunnel.</p><p>Each of those requires the connection to renegotiate rather than die — ICE restarts, re-offer and re-answer, and application state that survives a media path that briefly does not exist. Getting this right is unglamorous, hard to test, and impossible to skip, because from the user's perspective a call that does not recover is a product that does not work.</p><h3 id="3-devices-permissions-and-the-browser-itself"><strong>3. Devices, permissions and the browser itself</strong></h3><p>Camera and microphone access is a permission prompt that users deny, dismiss, or granted once to a different device that is no longer plugged in. Headsets get connected mid-call. Laptop lids close. Mobile browsers background the tab and suspend the video track. Autoplay policies block audio until the user interacts.</p><p>Every one of these is a state your application has to handle explicitly and a UI state someone has to design. There is no clever architecture that removes this work; it is a long tail of small cases, and long tails take time.</p><h3 id="4-degrading-gracefully-instead-of-failing"><strong>4. Degrading gracefully instead of failing</strong></h3><p>Networks get worse during calls, routinely. The infrastructure handles this by reducing quality — dropping resolution or frame rate — which is the correct behaviour and looks like a bug to users if nothing explains it.</p><p>The engineering is partly in configuration and partly in interface: what does a degraded participant look like, what does the user get told, and what can they do about it. Teams consistently discover this last, after shipping, from support tickets.</p><p>There is a fifth item that is not engineering work at all but changes the estimate more than any of them.</p><h2 id="the-third-participant-changes-the-architecture"><strong>The third participant changes the architecture</strong></h2><p>Two-party video can go peer to peer with no server in the media path. Add a third person and every participant must send their stream to every other participant, which the client cannot sustain past four or five people. At that point you need a media server, and <a href="https://samvyo.com/blog/what-is-an-sfu-and-why-does-every-video-platform-use-one?ref=samvyo.com"><u>what an SFU is and why you need one</u></a> becomes a prerequisite rather than an optimisation.</p><p>This matters for planning because it is a step change, not a gradient. "Two-person calls" and "small group calls" sound adjacent on a roadmap and are separated by an entire infrastructure component, with its own deployment, scaling behaviour and bill.</p><p><strong>If group calling is anywhere in your first year, scope it now rather than discovering it at the third participant.</strong></p><h2 id="a-scope-table-you-can-plan-against"><strong>A scope table you can plan against</strong></h2><p><em>The ranges below are planning estimates, not measurements — no public dataset on WebRTC integration timelines exists, and anyone quoting one precisely is guessing with more confidence than the evidence supports. They assume one competent engineer who has not built video before. Treat them as relative weights rather than absolute truth.</em></p><p/>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="227"><col width="160"><col width="237"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Capability</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Exercised by the demo?</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Planning range</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Two people see and hear each other</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Half a day</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Three or more participants (media server)</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3–6 weeks</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Works on corporate and mobile networks (TURN)</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2–4 weeks</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Survives network change and reconnection</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2–3 weeks</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Device permissions, hot-swap, edge cases</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1–2 weeks</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Graceful quality degradation and its UI</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2–3 weeks</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Mobile browser behaviour</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3–4 weeks</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Observability — knowing why a call failed</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2+ weeks, ongoing</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>The shape is the point, not the arithmetic. The capability that took an afternoon is one row. Everything else is the project, and every other row is invisible in a demo — which is precisely why estimates built from demos come in low, consistently, in the same direction.</p><h2 id="what-this-changes-about-the-build-or-buy-decision"><strong>What this changes about the build-or-buy decision</strong></h2><p>Most build-versus-buy analyses compare licence cost against engineering cost, and get the engineering side wrong because they estimate it from the part that is easy to see.</p><p>The more useful question is which of those rows you actually want to own. Some are genuinely yours: how quality degradation appears to users, how your application handles an interrupted call, what the experience is on the devices your customers use. Those are product decisions and outsourcing them produces a generic product.</p><p>The rest — TURN deployment, ICE restart handling, browser quirk accumulation, media server scaling — is undifferentiated. It is identical in every video product ever built, it never appears in a pitch, and it is where most of the calendar goes.</p><p><strong>A sound decision buys the undifferentiated rows and builds the ones your users would notice. Buying everything produces something indistinguishable from a competitor using the same vendor; building everything spends a quarter on NAT traversal that no customer will ever thank you for.</strong></p><h2 id="build-buy-or-deploy"><strong>Build, Buy, or Deploy</strong></h2><p>Three routes, with the honest boundary on each.</p><h3 id="build-on-open-source"><strong>Build on open source</strong></h3><p>mediasoup, Janus, Pion and LiveKit are free, production-grade and well documented. Building on them is the right call when video is your product rather than a feature of it, or when you have constraints — regulatory, network, deployment — that no vendor satisfies. It means owning every row of that table, including the ones nobody will notice until they break.</p><h3 id="buy-a-cloud-video-api"><strong>Buy a cloud video API</strong></h3><p>Per-minute providers hand you most of the table on day one, which is a genuine acceleration and usually the fastest path to a shipped feature. The limits are that you inherit their behaviour where you might have wanted your own, and that the pricing model is linear in usage while your costs may not be.</p><h3 id="deploy-a-commercial-platform"><strong>Deploy a commercial platform</strong></h3><p>The middle path runs a commercial platform on infrastructure you choose. Samvyo is one such option: based on SFU architecture, shipping embeddable SDKs, with the media path, TURN and recording kept on infrastructure you control. The relevant part for this decision is that the undifferentiated rows — relay, scaling, reconnection — come solved, while deployment and data path stay yours. It is resilient by design rather than something you assemble.</p><p>Where it does not fit: for a two-person calling feature that will never need a media server, a per-minute API is simpler and cheaper. And if you have in-house WebRTC expertise already, building gives you control a platform cannot.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>The afternoon demo proves the API works and almost nothing else. It runs on one network, with two participants, on devices that behave, over a connection that never changes — which is the opposite of production on every axis.</p><p>Scope the work from the failure cases rather than the happy path: connectivity on hostile networks, reconnection, device churn, graceful degradation, and the media server that a third participant makes mandatory. Then decide which of those you actually want to own, because owning the undifferentiated ones is where the quarter goes.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>The companion technical piece, <a href="https://samvyo.com/blog/the-real-time-browser-stack-everything-that-runs-between-two-video-tabs?ref=samvyo.com"><u>everything that runs between two video tabs</u></a>, walks the components behind each row of that table. For the commercial side of the same decision — pricing model, data residency, lock-in — <a href="https://samvyo.com/blog/adding-video-to-your-product-what-integrate-a-video-sdk-actually-costs-and-commits-you-to?ref=samvyo.com"><u>what integrating a video SDK commits you to</u></a> covers ground this post deliberately leaves alone.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>How long does it take to add video to an app?</strong></p><p>A working two-person prototype takes an afternoon. A production feature that handles corporate networks, reconnection, device edge cases and group calls is a multi-month project for an engineer who has not built video before. The prototype exercises roughly one row of the work; the remaining rows are the schedule.</p><p><strong>Why does the WebRTC demo work but production video fail?</strong></p><p>Because a demo on one network skips the hard parts. Both machines sit behind the same router with no firewall between them, on a stable connection, in focused browser tabs. Production has to survive symmetric NAT, corporate firewalls, mobile carriers, connections that change mid-call, and devices that get unplugged — none of which the demo touches.</p><p><strong>Do I need a media server for video calls?</strong></p><p>Not for two participants — those can connect peer to peer with no server in the media path. From three upward, each participant would have to send their stream to every other participant, which client uplink and CPU cannot sustain past four or five. At that point a media server becomes a requirement, and it is a step change in architecture rather than an incremental addition.</p><p><strong>What is the most underestimated part of a video integration?</strong></p><p>Connectivity on networks you do not control. It needs TURN relay infrastructure, it affects roughly one session in five, and it fails silently on exactly the corporate networks where enterprise customers sit. Reconnection after a network change is a close second, because it is hard to test and invisible until a real user walks out of wifi range.</p><p><strong>Should we build video ourselves or use an SDK?</strong></p><p>Split the work rather than the decision. Build the parts users would notice — how degradation appears, how an interrupted call behaves, what the experience is on your customers' devices. Buy the undifferentiated parts: relay infrastructure, media server scaling, ICE restart handling, browser quirk accumulation. Those are identical in every video product and consume most of the calendar.</p><p><strong>How much does it cost to add video to an app?</strong></p><p>Two separate bills. The engineering cost is the scope described above, dominated by the failure cases rather than the feature. The running cost depends on your pricing model and workload shape, and on whether you pay per participant-minute or for the infrastructure directly — a different analysis with different variables.</p><p><strong>Can a commercial platform remove all of this work?</strong></p><p>Most of it, not all. Relay, scaling, reconnection and browser handling come solved with a platform such as Samvyo, which also keeps the media path, TURN and recording on infrastructure you control. What stays yours is the product layer — what users see when quality drops or a call interrupts — and that is the part worth keeping.</p>]]></content:encoded></item><item><title><![CDATA[The TURN Bill: The Self-Hosted Video Cost Nobody Forecasts]]></title><description><![CDATA[Everyone budgets for the media server. Almost nobody budgets for the relay that sits in front of it — even though roughly one session in five goes through it, and a relayed stream is paid for twice. Here is what TURN actually adds to a self-hosting bill, and what skipping it costs instead.]]></description><link>https://www.samvyo.com/blog/the-turn-bill-the-self-hosted-video-cost-nobody-forecasts</link><guid isPermaLink="false">6aaa6fe28b45c3f0cd63a78c</guid><category><![CDATA[TURN Cost]]></category><category><![CDATA[Self-hosted Video]]></category><category><![CDATA[Video Conferencing Infrastructure]]></category><category><![CDATA[cost-benefit analysis]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 17 Sep 2026 10:54:21 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--02_25_48-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--02_25_48-PM.png" alt="The TURN Bill: The Self-Hosted Video Cost Nobody Forecasts"/><p>Self-hosting a media server is genuinely free to license. mediasoup, Janus, Pion and LiveKit cost nothing, run in production at serious scale, and are maintained by people who know what they are doing.</p><p>Then you deploy one, and discover it does not work for about one user in five.</p><p>Those users are behind symmetric NATs or corporate firewalls that will not allow a direct media path. Reaching them requires a relay — a TURN server — which is a second fleet of machines nobody put in the spreadsheet, carrying traffic that gets paid for twice. It is the clearest example of why free software is not a free system, and it is almost always missing from the model.</p><h2 id="what-turn-is-and-why-you-cannot-skip-it"><strong>What TURN is, and why you cannot skip it</strong></h2><p>WebRTC tries to connect two endpoints directly. When both sides are behind ordinary home routers, a technique called STUN lets each discover its public address and punch a hole through. This works most of the time and costs almost nothing, because no media flows through your infrastructure at all.</p><p>It fails when a network refuses to cooperate — symmetric NAT that assigns a different port per destination, corporate firewalls that block UDP outright, restrictive mobile carrier networks. For those users the only option is to give up on a direct path and relay the media through a server that both sides can reach. That server is TURN, and unlike STUN it carries every byte.</p><p>You cannot treat this as an edge case to skip, because the users it affects are disproportionately the ones you care about. Corporate networks are exactly where enterprise buyers sit. "Works on my laptop, fails in the customer's office" is the single most common WebRTC deployment story, and TURN is the fix.</p><h2 id="how-often-does-it-actually-happen"><strong>How often does it actually happen?</strong></h2><p>This is where the honest answer matters more than a confident one.</p><p>The only substantial public measurement comes from <a href="https://webrtchacks.com/usage-stats/?ref=samvyo.com"><u>callstats.io, reported on webrtcHacks</u></a>, which observed billions of minutes across more than a hundred WebRTC services and found that 22% of conferences required some kind of TURN relay, with 9% needing TCP transport specifically. The same dataset found 12% of sessions failed to establish at all, and that 85% of those failures were NAT or firewall traversal.</p><p><strong>That data is from January 2015 to February 2016. No comparable public dataset has been published since, which means every current-sounding percentage in circulation — the commonly quoted 8–20% range included — traces back to a decade-old measurement. Ten years of IPv6 rollout, carrier-grade NAT expansion and enterprise firewall change sit in between, pushing in different directions.</strong></p><p>So treat it as an order of magnitude rather than a figure: roughly one session in five, possibly fewer, possibly more on an enterprise-heavy user base. Plan capacity for it, measure your own rate once you are live, and do not put someone else's 2016 percentage in a business case without saying where it came from.</p><p>Even at the low end of that range, the arithmetic is not what most models assume.</p><h2 id="why-a-relayed-session-doubles-your-self-hosted-video-cost"><strong>Why a relayed session doubles your self-hosted video cost</strong></h2><p>A TURN server is a pure relay. Media arrives, and the identical media leaves. Every byte it handles is a byte of outbound traffic on your bill — and that traffic is a second copy of something your media server already sent.</p><p>Trace one relayed viewer. The media server forwards their streams out to TURN. TURN forwards those same streams out to the viewer. Two outbound hops, same content, both metered. The viewer's traffic now costs twice what <a href="https://samvyo.com/blog/scaling-video-cost-what-happens-when-one-media-server-isnt-enough?ref=samvyo.com" rel="noreferrer"><u>the media server's own egress bill</u></a> predicted.</p><p>Applied to a concrete room, using 600 kbps as the average forwarded stream and standard cloud egress at $0.09/GB:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="193"><col width="147"><col width="140"><col width="144"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">40-person room, one hour</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Outbound streams</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Egress</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cost</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Media server only</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1,560</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">421 GB</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$37.91</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Relayed portion at 20%</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">312 (second copy)</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">84 GB</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$7.58</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Actual total</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">—</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">505 GB</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$45.49</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p><strong>A useful rule of thumb: add about 20% to whatever your media server egress model says, and you will be roughly right. Add nothing, and you will be roughly 20% wrong in the direction that matters.</strong></p><p>And the relay load does not fall evenly across your users.</p><h2 id="who-actually-generates-relay-traffic"><strong>Who actually generates relay traffic</strong></h2><p>TURN traffic follows the same asymmetry as everything else on a media server: it <a href="https://samvyo.com/blog/why-your-sfu-bandwidth-cost-scales-with-viewers-not-publishers?ref=samvyo.com" rel="noreferrer"><u>scales with viewers rather than publishers</u></a>. A relayed participant publishing one stream costs you one stream of relay. The same participant receiving thirty-nine streams costs you thirty-nine.</p><p>Two consequences follow. A single relayed viewer in a large room is far more expensive than a relayed publisher, so the cost concentrates in exactly the sessions you would least like to degrade. And a broadcast or webinar workload — one publisher, many viewers — has its entire relay exposure on the audience side, which is the side that grows.</p><p>This is also why TURN capacity planning cannot be done in sessions. It has to be done in relayed streams, the same unit as everything else.</p><h2 id="the-self-hosted-video-cost-model-line-by-line"><strong>The self-hosted video cost model, line by line</strong></h2><p><a href="https://samvyo.com/blog/open-source-video-infrastructure-for-enterprise-why-companies-outgrow-jitsi-livekit-and-self-hosted-webrtc?ref=samvyo.com"><u>Cost models for outgrowing self-hosted WebRTC</u></a> are usually careful about compute, storage, recording capacity and engineering time, and those models are right as far as they go. The gap is consistent, and it is everything that is usage-based rather than provisioned:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="180"><col width="120"><col width="324"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Line item</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Usually modelled?</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Why it gets missed</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Media server compute</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Provisioned upfront, visible as instances.</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Recording and storage</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Obvious and easy to size.</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Engineering time</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Yes</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The headline argument in most comparisons.</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Media server egress</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Rarely</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Usage-based, arrives after the fact, and video is unusually egress-heavy.</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">TURN server fleet</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Almost never</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A second set of machines, geographically distributed, separate from the SFU.</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">TURN egress</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Almost never</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A second copy of traffic already counted once.</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Peak headroom</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Relay demand is bursty and follows your users' networks, not your usage curve.</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Credential and certificate rotation</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">No</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">TURN needs short-lived credentials issued per session, plus TLS on 443 for strict firewalls.</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p>None of these are large individually. Together they are the difference between a self-hosting business case that holds and one that quietly does not, and they share a property: they are all consequences of running the system rather than licensing the software. That is the honest version of "open source is not free" — not that the licence has a catch, but that the licence was never the expensive part.</p><h2 id="what-skipping-turn-costs-instead"><strong>What skipping TURN costs instead</strong></h2><p>The tempting response is to run STUN only, or to lean on a free public STUN server, and accept that some calls fail.</p><p>That has a price too, and the same dataset puts a number on it: 12% of sessions failing to establish, with 85% of those attributable to NAT and firewall traversal. Those are not degraded calls. They are calls that never start, on the networks where your enterprise users sit, presenting to the user as a product that does not work.</p><p><strong>Weighed against roughly a 20% bandwidth increase, a materially lower connection-failure rate is almost always the better trade. The point is not that TURN is expensive — it is that it is a real line item, and pretending otherwise means discovering it in production rather than in the spreadsheet.</strong></p><p>Which leaves the question of who should be running it at all.</p><h2 id="build-buy-or-deploy"><strong>Build, Buy, or Deploy</strong></h2><p><em>Three routes, with the honest boundary on each.</em></p><h3 id="build-on-open-source"><strong>Build on open source</strong></h3><p>coturn is the standard open-source TURN server and it is solid, well understood and free. Running it yourself is entirely reasonable — and it means operating a geographically distributed fleet, issuing short-lived credentials, keeping TLS on 443 for the strictest firewalls, and sizing for bursty relay demand you do not control. That is a separate operational surface from <a href="https://samvyo.com/blog/webrtc-media-servers-why-when-and-how-to-choose-one-for-your-next-app?ref=samvyo.com"><u>choosing a media server</u></a>, and it is the part most teams have not costed when they decide to self-host.</p><h3 id="buy-a-cloud-video-api"><strong>Buy a cloud video API</strong></h3><p>Per-minute providers include TURN in the price, which is genuinely one of the better arguments for them — the relay problem disappears entirely and you never think about it again. The limits are the usual ones: you cannot place relays where your users actually are if the provider has not, and you generally cannot see what share of your sessions are relaying, which is the number you would want in order to reason about any of this.</p><h3 id="deploy-a-commercial-platform"><strong>Deploy a commercial platform</strong></h3><p>The middle path runs a commercial platform on infrastructure you choose. Samvyo is one such option: based on SFU architecture, shipping embeddable SDKs, with the media path, TURN and recording kept on infrastructure you control. TURN sitting in that list is the relevant part here — the relay is yours to place and yours to meter, rather than an invisible line inside someone else's per-minute rate. It is resilient by design rather than something you assemble.</p><p>Where it does not fit: if your volume is low or irregular, a per-minute API bundles TURN and costs less overall. And if your users are entirely on networks you control — a closed corporate deployment, or a surveillance estate on your own VLANs — your relay rate may be near zero and none of this arithmetic applies to you.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>The licence is free. The relay is not. Roughly one session in five cannot take a direct path and has to go through TURN, and because TURN is a pure relay, that traffic is paid for twice — once leaving the media server, once leaving the relay.</p><p>Budget about 20% on top of your media server egress model, size TURN in relayed streams rather than sessions, and measure your own relay rate once you are live rather than inheriting a percentage from 2016. Open source is not free; it is unpriced, which is a different thing and a more expensive one to discover late.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>The media server side of the same bill is in <a href="https://samvyo.com/blog/scaling-video-cost-what-happens-when-one-media-server-isnt-enough?ref=samvyo.com" rel="noreferrer"><u>what scaling past a single media server costs</u></a>, which prices egress against different hosting venues. And <a href="https://samvyo.com/blog/why-your-sfu-bandwidth-cost-scales-with-viewers-not-publishers?ref=samvyo.com" rel="noreferrer"><u>why the bill follows viewers, not publishers</u></a> explains the asymmetry that governs relay load as much as it governs forwarding.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What is a TURN server and why does WebRTC need one?</strong></p><p>A TURN server relays media between two endpoints that cannot establish a direct connection. WebRTC tries a direct path first, assisted by STUN. When a symmetric NAT, a corporate firewall or a restrictive mobile network blocks that, TURN carries the media instead. Unlike STUN, every byte passes through it, which is why it costs real money.</p><p><strong>What percentage of WebRTC calls use TURN?</strong></p><p>The only substantial public measurement — callstats.io, across billions of minutes between January 2015 and February 2016 — found 22% of conferences required a relay. No comparable dataset has been published since, so treat roughly one in five as an order of magnitude rather than a current figure, and measure your own rate once you are live.</p><p><strong>Does TURN double bandwidth costs?</strong></p><p>For relayed sessions, effectively yes. TURN is a pure relay, so media arrives and the same media leaves, and that outbound traffic is a second copy of what the media server already sent. At a 20% relay rate, total egress runs about 20% above what a media-server-only model predicts.</p><p><strong>How much does self-hosted video actually cost beyond the servers?</strong></p><p>The consistently missing items are usage-based rather than provisioned: media server egress, a separate TURN fleet, TURN egress, capacity headroom for bursty relay demand, and credential and certificate rotation. Compute, storage and engineering time are usually modelled correctly; these are not.</p><p><strong>Can I use a free public STUN server instead of running TURN?</strong></p><p>For the users who can connect directly, yes — public STUN is fine and costs nothing. It does nothing for the users who cannot, which is the whole problem. Running STUN only means accepting a connection-failure rate; the same dataset above found 12% of sessions failed to establish, with 85% of those caused by NAT or firewall traversal.</p><p><strong>Is TURN included with commercial video platforms?</strong></p><p>Usually, though how much control you get varies. Per-minute cloud APIs bundle it and hide it entirely. Platforms deployed on your own infrastructure, including Samvyo, keep TURN under your control alongside the media path and recording — so you choose where relays sit and can see what they cost.</p><p><strong>How do I size a TURN deployment?</strong></p><p>In relayed streams, not sessions. A relayed viewer in a large room consumes one relayed stream for every publisher they are subscribed to, so a single relayed participant in a 40-person call is dramatically more expensive than one in a two-person call. Size on peak concurrent relayed streams and place relays near your users, since the relay adds a network hop to the latency budget.</p>]]></content:encoded></item><item><title><![CDATA[Why Your SFU Bandwidth Cost Scales With Viewers, Not Publishers]]></title><description><![CDATA[Five hundred cameras cost less to run than one fifty-person meeting. Publishers are close to free on a media server; viewers are the entire bill. Here is the arithmetic behind that asymmetry, four workload shapes priced side by side, and the two levers that actually change the number.]]></description><link>https://www.samvyo.com/blog/why-your-sfu-bandwidth-cost-scales-with-viewers-not-publishers</link><guid isPermaLink="false">6aaa51cf8b45c3f0cd63a77f</guid><category><![CDATA[Bandwidth Cost]]></category><category><![CDATA[Video Conferencing Infrastructure]]></category><category><![CDATA[Capacity planning]]></category><category><![CDATA[WebRTC]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 17 Sep 2026 10:54:15 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--02_10_43-PM.png" medium="image"/><content:encoded><![CDATA[<blockquote>500 surveillance cameras streaming continuously cost less to run than a single fifty-person video meeting.</blockquote><img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--02_10_43-PM.png" alt="Why Your SFU Bandwidth Cost Scales With Viewers, Not Publishers"/><p>That is not a trick of the numbers. It is the central fact about SFU bandwidth cost, and it is invisible to any capacity model that counts users. Five hundred cameras are five hundred publishers and almost no viewers. Fifty people in a meeting are fifty publishers and fifty viewers each. The headcount says one is ten times bigger. The bill says the opposite.</p><h2 id="the-asymmetry-ingress-is-free-egress-is-the-bill"><strong>The asymmetry: ingress is free, egress is the bill</strong></h2><p>A media server does two things with video. It receives streams from publishers, and it sends streams to viewers. These are not priced alike, and on most infrastructure they are not priced at all alike.</p><p>Every major cloud provider charges nothing for inbound data transfer. <a href="https://aws.amazon.com/ec2/pricing/on-demand/?ref=samvyo.com"><u>Outbound runs around $0.09 per GB</u></a>. So on the server's side of the ledger, a publisher is free and a viewer costs real money — before you have written a line of application code, your cost model already has a zero on one side of it.</p><p>The stream counting works the same way. One publisher produces exactly one inbound stream no matter how popular they are. One viewer consumes one outbound stream per person they are watching. Publishers add linearly to a number that costs nothing; viewers multiply a number that costs everything.</p><p>This is why <a href="https://samvyo.com/blog/what-is-an-sfu-and-why-does-every-video-platform-use-one?ref=samvyo.com"><u>a media server's capacity is measured in consumers</u></a><strong> — one outbound stream to one receiver — rather than in participants. The unit exists because it is the unit that costs money.</strong></p><p>Which makes the usual planning unit actively misleading.</p><h2 id="why-users-is-the-wrong-unit-for-sfu-bandwidth-cost"><strong>Why "users" is the wrong unit for SFU bandwidth cost</strong></h2><p>Capacity plans get built from the numbers a business already has: seats sold, concurrent users, peak sessions. None of those distinguish between someone who is publishing and someone who is watching, and the difference between the two is the entire forecast.</p><p>Two deployments with identical user counts can differ by a factor of fifty in bandwidth. The variable is not scale. It is shape — specifically the ratio of publishers to viewers, and how many of those viewers each publisher reaches.</p><p>The general form: outbound streams equals the number of viewers multiplied by the number of publishers each viewer is subscribed to. In an all-see-all meeting, every participant is both, so it collapses to N x (N-1) and grows with the square of the room. In a webinar, one publisher reaches everyone, so it is simply the viewer count and grows linearly.</p><p>Put four real workload shapes side by side and the difference stops being abstract.</p><h2 id="four-workload-shapes-priced-side-by-side"><strong>Four workload shapes, priced side by side</strong></h2><p>All four assume an average forwarded stream of 600 kbps, which is realistic with simulcast enabled and most viewers receiving a lower spatial layer. Egress priced at $0.09/GB, <a href="https://aws.amazon.com/ec2/pricing/on-demand/?ref=samvyo.com"><u>the standard major-cloud rate</u></a>.</p><p/>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="180"><col width="73"><col width="73"><col width="87"><col width="105"><col width="105"/></col></col></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Workload</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Publishers</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Viewers</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Streams out</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Egress / hour</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cost / hour</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">50-person meeting, all-see-all</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">50</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">50</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2,450</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">662 GB</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$59.53</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">50-person webinar, one speaker</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">49</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">49</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">13.2 GB</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$1.19</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">500 cameras, 3 operators watching 25 tiles each</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">500</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">75</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">20.2 GB</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$1.82</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Live broadcast to 10,000</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">10,000</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">10,000</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2,700 GB</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$243.00</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Read the first two rows together. Same fifty people, same hour, same software. A meeting costs fifty times a webinar, because in a meeting every person is a publisher reaching forty-nine viewers, and in a webinar one person is.</p><p>Then read the third. Five hundred cameras — ten times the endpoints of the meeting — cost about three percent of it. Publishing is nearly free; the three operators are the only thing generating a bill, and they are watching seventy-five tiles between them. That ceiling is <a href="https://samvyo.com/blog/why-watching-500-cameras-is-a-decode-problem-not-a-bandwidth-problem?ref=samvyo.com"><u>a decode problem on the operator's workstation, not a bandwidth problem</u></a>.</p><p>And the fourth shows the ceiling has nothing to do with user count either. One publisher, one stream in, and a quarter of a thousand dollars an hour going out.</p><h2 id="what-this-changes-about-capacity-planning"><strong>What this changes about capacity planning</strong></h2><p>Three practical consequences, in the order they usually bite.</p><ul><li>Forecast from streams, not seats. Ask how many people will be watching how many other people simultaneously. A sales forecast of "1,000 concurrent users" is unpriceable until someone says whether that is 500 two-person calls or twenty fifty-person meetings — the second costs roughly sixty times the first.</li><li>The expensive product is rarely the one that looks expensive. Broadcast and webinar features feel like heavy infrastructure and are cheap per head. Small interactive rooms feel lightweight and are the most costly thing per participant you can build, because everyone is a publisher.</li><li>Growth in room size is not growth in users. Going from 10-person to 25-person rooms is a 2.5x increase in headcount and a 6.7x increase in bandwidth. Budgets that track headcount growth will be wrong by a widening margin, and the error compounds exactly when a product is succeeding.</li></ul><p>The good news is that two levers move this number substantially, and neither requires more hardware.</p><h2 id="the-two-levers-that-move-your-sfu-bandwidth-cost"><strong>The two levers that move your SFU bandwidth cost</strong></h2><p>Both operate on the same equation: streams out multiplied by average bitrate.</p><h3 id="1-cap-the-number-of-streams-each-viewer-receives"><strong>1. Cap the number of streams each viewer receives</strong></h3><p>This is the larger of the two by a wide margin. If a client renders nine tiles rather than all fifty, the server forwards nine streams to it instead of forty-nine. The 50-person meeting above drops from 2,450 outbound streams to 450 — an 82% reduction — and the growth curve flattens from quadratic to linear.</p><p>Speaker-based forwarding is how essentially every large video product does this, and it is usually the difference between a room size that is viable and one that is not. It is a product decision as much as an infrastructure one, since it changes what users see — and it is one of the two levers in <a href="https://samvyo.com/blog/sfu-scaling-clustering-cascading-and-where-the-bottleneck-moves?ref=samvyo.com"><u>where the bottleneck moves as you scale an SFU</u></a>.</p><h3 id="2-lower-the-average-forwarded-bitrate"><strong>2. Lower the average forwarded bitrate</strong></h3><p>Because average bitrate multiplies every outbound stream, a small reduction compounds. <a href="https://samvyo.com/blog/what-is-simulcast-and-when-does-it-save-or-waste-bandwidth?ref=samvyo.com" rel="noreferrer"><u>Simulcast</u></a> is the mechanism: the server forwards a 180p layer to a thumbnail rather than 720p to everyone. Moving the average from 2.5 Mbps to 600 kbps cuts the bill by roughly three-quarters across the entire deployment.</p><p>Worth measuring rather than assuming. The average matters far more than the peak, because it is what gets multiplied — and most teams have never looked at which layer their subscribers are actually receiving.</p><p>There are limits to how far the publisher-is-free framing holds, and they are worth stating plainly.</p><h2 id="where-the-asymmetry-breaks-down"><strong>Where the asymmetry breaks down</strong></h2><p>The bandwidth story is clean. The complete picture is not, and a capacity model built only on egress will miss three things.</p><ul><li>Publishers do cost server CPU. Each inbound stream needs decryption, per-producer state, and RTCP handling, and a publisher with simulcast delivers three streams to track rather than one. This is a small cost per publisher, but a 500-publisher deployment feels it even while its bandwidth bill stays trivial.</li><li>Publishers cost the client heavily. Encoding is expensive, and with simulcast it is three parallel encoders. The cost did not vanish — it moved onto the publishing device, where it shows up as battery drain and thermal throttling rather than as an invoice.</li><li>Recording inverts the whole model. Recording is driven by publishers, not viewers, so a 500-camera deployment with continuous recording has a large storage and processing bill attached to the side of the ledger that was free. If you record, the asymmetry described here applies to your bandwidth and not to your total cost.</li></ul><p>One more, worth naming because it catches people out: per-minute video APIs generally bill participant-minutes regardless of whether someone is publishing or watching. That inverts these economics entirely — the webinar shape that is cheapest to self-host is the one where per-minute billing costs most. That comparison deserves its own treatment and gets one separately; the point here is only that the arithmetic above describes infrastructure you run, not every pricing model you might buy.</p><h2 id="build-buy-or-deploy"><strong>Build, Buy, or Deploy</strong></h2><p>Three routes, with the honest boundary on each.</p><h3 id="build-on-open-source"><strong>Build on open source</strong></h3><p>mediasoup, Janus, Pion and LiveKit all expose per-consumer metrics, which is what makes this measurable rather than theoretical — you can see exactly how many streams each subscriber is receiving and at what layer. Building also means you control tile caps and forwarding policy, which is the larger of the two levers above. The cost is that egress lands on your infrastructure contract, so where you host becomes the dominant variable.</p><h3 id="buy-a-cloud-video-api"><strong>Buy a cloud video API</strong></h3><p>Per-minute providers absorb the bandwidth question, which is genuinely valuable when your workload shape is unpredictable or your volume is low. The limits are that you generally cannot see per-consumer metrics, cannot tune the forwarding policy, and are billed on a model whose shape may not match your workload's shape.</p><h3 id="deploy-a-commercial-platform"><strong>Deploy a commercial platform</strong></h3><p>The middle path runs a commercial platform on infrastructure you choose. Samvyo is one such option: based on SFU architecture, shipping embeddable SDKs, with the media path, TURN and recording kept on infrastructure you control — which matters directly here, because it is what puts the egress on your own contract and makes the levers above yours to pull. It is resilient by design rather than something you assemble.</p><p>Where it does not fit: at genuinely small or highly irregular volume, a per-minute API costs less and involves fewer decisions. And if your workload is overwhelmingly publish-heavy with almost no viewers — a pure recording or archival pipeline — none of the bandwidth arithmetic in this post is your constraint, and you should be optimising storage instead.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Publishers are close to free on a media server and viewers are the entire bandwidth bill, because inbound transfer costs nothing and outbound costs around nine cents a gigabyte. Any forecast built on user counts is blind to the one ratio that decides the number.</p><p>Forecast in outbound streams instead: viewers multiplied by how many publishers each of them is subscribed to. Then attack that product directly — cap the tiles each client renders, and lower the average forwarded bitrate. Those two do more than any amount of additional hardware.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>Once you know your stream count, <a href="https://samvyo.com/blog/scaling-video-cost-what-happens-when-one-media-server-isnt-enough?ref=samvyo.com" rel="noreferrer"><u>what scaling past a single media server costs</u></a> prices it against different hosting venues — a difference of roughly 90x. For the surveillance shape specifically, <a href="https://samvyo.com/blog/why-watching-500-cameras-is-a-decode-problem-not-a-bandwidth-problem?ref=samvyo.com"><u>why watching 500 cameras is a decode problem</u></a> goes deeper.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>Why does SFU bandwidth cost depend on viewers rather than publishers?</strong></p><p>Because media servers pay for outbound traffic, not inbound. Every major cloud charges nothing for data transfer in and around $0.09 per GB for data transfer out. A publisher sends one stream in; each viewer pulls one stream out for every person they are watching. Publishers add to a free number, viewers multiply a costly one.</p><p><strong>How do I estimate my video bandwidth bill?</strong></p><p>Multiply outbound streams by average forwarded bitrate by hours. Outbound streams equals viewers times the number of publishers each viewer subscribes to. At 600 kbps, one viewer-stream is about 0.27 GB per hour, or roughly 2.4 cents at standard cloud egress rates. At full 2.5 Mbps HD it is about 1.13 GB and 10 cents.</p><p><strong>Why do 500 cameras cost less than a 50-person meeting?</strong></p><p>Because almost nobody is watching the cameras. Five hundred publishers with three operators viewing 25 tiles each generates 75 outbound streams. A 50-person all-see-all meeting generates 2,450, because every participant is watching all 49 others. Endpoints are not the unit; outbound streams are.</p><p><strong>Is a webinar cheaper to run than a meeting with the same number of people?</strong></p><p>Dramatically — roughly 50x cheaper at 50 people. In a webinar one person publishes and everyone receives one stream, so outbound scales linearly with the audience. In an all-see-all meeting everyone publishes to everyone, so it scales with the square of the room.</p><p><strong>What is the single biggest way to reduce SFU bandwidth cost?</strong></p><p>Cap how many streams each client receives. If a viewer renders nine tiles instead of forty-nine, the server forwards nine streams to them. In a 50-person room that is an 82% reduction, and it changes growth from quadratic to linear. Lowering average forwarded bitrate through simulcast is the second lever and typically cuts the remainder by around three-quarters.</p><p><strong>Does this mean publishers are free?</strong></p><p>Free in bandwidth, not in total. Each inbound stream still costs server CPU for decryption and state tracking, and encoding is expensive on the publishing device — especially with simulcast, which means three parallel encoders. Recording also scales with publishers rather than viewers, so a publish-heavy deployment that records has a substantial bill on the side of the ledger that looked free.</p><p><strong>Can I keep the egress on my own infrastructure contract?</strong></p><p>Yes, if the platform is deployed on infrastructure you choose rather than consumed as a metered service. Samvyo works this way, keeping the media path, TURN and recording under your control. That matters here because where the traffic leaves from, and at what rate, is the largest single variable in the total.</p>]]></content:encoded></item><item><title><![CDATA[What Is Simulcast — And When Does It Save or Waste Bandwidth?]]></title><description><![CDATA[Publishing three resolutions does not cost three times the bandwidth — it costs about twenty percent more, because bitrate scales with pixel count. But the bandwidth was never the real cost. Here is what simulcast actually charges you, and the ladder mistake that makes it expensive.]]></description><link>https://www.samvyo.com/blog/what-is-simulcast-and-when-does-it-save-or-waste-bandwidth</link><guid isPermaLink="false">6aaa52028b45c3f0cd63a787</guid><category><![CDATA[Simulcast]]></category><category><![CDATA[Bandwidth]]></category><category><![CDATA[Encoding]]></category><category><![CDATA[Video Conferencing Infrastructure]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 17 Sep 2026 10:54:09 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--01_55_09-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--01_55_09-PM.png" alt="What Is Simulcast — And When Does It Save or Waste Bandwidth?"/><p>Simulcast means your camera is encoded three times and all three versions are sent. The intuition that follows is that it costs three times the uplink. It doesn't — it costs about twenty percent more.</p><p>The intuition is wrong for a reason worth understanding, because the same reasoning explains when simulcast genuinely does become expensive, and why the real cost is not bandwidth at all.</p><h2 id="what-is-simulcast-precisely"><strong>What is simulcast, precisely</strong></h2><p>The publisher encodes the same camera feed at several resolutions simultaneously — typically three — and sends all of them to the media server. The server then chooses which one to forward to each subscriber, independently, and can switch between them mid-call.</p><p>This matters because subscribers are not alike. Someone viewing you as a thumbnail in a grid of twenty does not need 720p. Someone on a congested mobile connection cannot receive it. Someone who has pinned you full-screen on a desktop does. Without simulcast the server has exactly one version of your stream and must send it to all three, which means either wasting bandwidth on the thumbnail or degrading quality for the person watching you full-screen.</p><p>Only an SFU can do this, because it forwards streams rather than mixing them. An MCU produces a single composited picture, so there is nothing to select — <a href="https://samvyo.com/blog/sfu-vs-mcu-vs-mesh-which-topology-your-call-size-actually-needs?ref=samvyo.com"><u>the topology comparison</u></a> covers why that difference matters. It is part of why the industry converged on SFUs.</p><p>So the server gets per-subscriber choice. The question is what the publisher pays for it.</p><h2 id="what-is-simulcast-actually-costing-you"><strong>What is simulcast actually costing you?</strong></h2><p>Video bitrate scales roughly with pixel count, and the lower layers have very few pixels. <a href="https://livekit.com/blog/an-introduction-to-webrtc-simulcast?ref=samvyo.com"><u>A typical published ladder</u></a>:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="127"><col width="167"><col width="160"><col width="171"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Layer</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Resolution</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Pixels</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Bitrate</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">High</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1280 x 720</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">921,600</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2.5 Mbps</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Medium</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">640 x 360</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">230,400</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">400 kbps</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Low</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">320 x 180</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">57,600</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">125 kbps</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Total</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">—</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">—</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3.025 Mbps</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p>The two extra layers cost 525 kbps on top of 2.5 Mbps. That is a multiplier of about 1.2x — roughly a fifth more uplink, not three times.</p><p>Note that the medium layer has a quarter of the pixels of the high layer but uses a sixth of the bitrate. That is deliberate: a stream destined for a small tile can be encoded more aggressively than one destined for full-screen, because the viewer will never see the difference at that size. Well-built ladders exploit this, which is part of why the overhead is as low as it is.</p><h3 id="a-note-on-the-17-figure"><strong>A note on the 17% figure</strong></h3><p>You will see this overhead <a href="https://livekit.com/blog/an-introduction-to-webrtc-simulcast?ref=samvyo.com"><u>quoted as 17%</u></a>. Check the denominator before repeating it. 525 kbps against the 3,025 kbps total is 17.4%, but against the 2,500 kbps you were sending before simulcast it is 21%. The second is the number that answers "what does turning this on cost me?" Expressing overhead as a share of the new total is a common way to make an increase look smaller, and technical readers notice.</p><p>Twenty percent is cheap, and trivial next to <a href="https://samvyo.com/blog/why-your-sfu-bandwidth-cost-scales-with-viewers-not-publishers?ref=samvyo.com">what it saves the server</a>. But bandwidth is not where simulcast actually bills you.</p><h2 id="the-real-cost-is-the-encoder-not-the-network"><strong>The real cost is the encoder, not the network</strong></h2><p>Three layers means three encoders running in parallel on the publishing device, in real time, on top of capture and everything else the application is doing.</p><p>On a desktop with hardware encoding, this is usually unremarkable. On a mid-range phone it is the binding constraint, and it shows up as thermal throttling, battery drain, and frame drops that look like network problems but are not. The pattern is recognisable: a call that is fine for ten minutes and degrades steadily afterwards, on a device that is warm to the touch, with network statistics that look healthy throughout.</p><p><strong>This is why most mobile SDKs publish two layers rather than three, or drop to a single layer when the device reports thermal pressure. If you are configuring a ladder yourself, the number of layers is a device-capability decision before it is a bandwidth decision.</strong></p><p>There is one form of layering that is genuinely free, and it is worth knowing about.</p><h2 id="temporal-layers-are-free-spatial-layers-are-not"><strong>Temporal layers are free; spatial layers are not</strong></h2><p>Everything above concerns spatial layers — different resolutions, separate encodes. Temporal layers are different. A single encoded stream can be structured so that dropping every other frame still produces a decodable 15 fps stream from a 30 fps original, because of how frames reference each other.</p><p>That costs no additional bitrate and no additional encoder, and it gives the server another dimension to degrade along. When a subscriber's connection deteriorates, dropping frame rate is often less objectionable than dropping resolution — particularly for screen sharing and slide content, where sharpness matters more than motion.</p><p>Most implementations combine both: three spatial layers, two or three temporal layers within each. The server picks a point in that grid per subscriber. Only the spatial dimension carries the encoder cost.</p><p>Which brings us to the configuration mistake that produces most of the complaints about simulcast.</p><h2 id="the-ladder-mistake-that-nearly-doubles-your-uplink"><strong>The ladder mistake that nearly doubles your uplink</strong></h2><p>The 1.2x figure depends entirely on the lower layers being small. Spacing them too closely destroys it.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="120"><col width="280"><col width="113"><col width="111"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Ladder</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Layers</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Total uplink</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Multiplier</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Well spaced</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">720p 2.5 Mbps + 360p 400 kbps + 180p 125 kbps</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3.03 Mbps</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1.2x</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Too close</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">720p 2.5 Mbps + 540p 1.4 Mbps + 360p 620 kbps</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">4.52 Mbps</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1.8x</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p>Same three layers, same top resolution, and the second configuration costs nearly twice the uplink instead of a fifth more — because 540p has more than half the pixels of 720p, so it costs more than half the bitrate.</p><p>This is where "simulcast tripled my bandwidth" reports come from. It is almost never simulcast; it is a ladder whose layers are too close together to be worth having. A useful rule of thumb is that each step down should roughly halve the linear dimensions, which quarters the pixel count. 720p, 360p, 180p follows this. 720p, 540p, 360p does not.</p><p>Even a correctly configured ladder is not always worth enabling, though.</p><h2 id="when-simulcast-wastes-bandwidth"><strong>When simulcast wastes bandwidth</strong></h2><p>Four situations where it costs more than it returns.</p><ul><li>One-to-one calls. With a single subscriber there is nothing to select between — that subscriber gets the layer their connection supports, which is what adaptive bitrate would have given them anyway. The extra layers are pure overhead.</li><li>Small rooms with full-screen layouts. If everyone renders everyone at full size, every subscriber wants the top layer, and the lower ones are never forwarded.</li><li>Publishers already constrained on uplink. If someone has 3 Mbps up, spending 20% of it on layers is worse than publishing a single well-chosen stream. Bandwidth estimation will strip the top layer anyway, so you pay the encoder cost for layers that get discarded.</li><li>Screen sharing of static content. A slide deck at 5 fps has an unusual bitrate profile and the lower spatial layers frequently render text illegibly. Temporal layers serve this case far better than spatial ones.</li></ul><h2 id="when-simulcast-earns-its-keep"><strong>When simulcast earns its keep</strong></h2><p>It pays off wherever your subscribers differ from one another, which in practice means most real deployments.</p><ul><li>Grid layouts. The whole point: twenty thumbnails receive 125 kbps each instead of 2.5 Mbps each. In a 20-person room that is the difference between 2.5 Mbps and 50 Mbps of downlink per participant.</li><li>Mixed device and network populations. One participant on fibre and one on a train, in the same call, each getting something appropriate.</li><li>Large rooms generally, because the average forwarded bitrate is multiplied by N x (N-1) on the server side. Dropping the average from 2.5 Mbps to 600 kbps cuts <a href="https://samvyo.com/blog/scaling-video-cost-when-one-media-server-isnt-enough?ref=samvyo.com"><u>the server's egress bill</u></a> by roughly three quarters, which is far more consequential than the publisher's 20%.</li></ul><p><strong>That last point is the one that usually settles it. Simulcast costs one publisher a fifth more uplink and saves the server a multiple of that on every subscriber, which is a good trade at almost any room size above a handful.</strong></p><h2 id="simulcast-or-svc"><strong>Simulcast or SVC?</strong></h2><p>SVC — scalable video coding, available with VP9 and AV1 — achieves the same per-subscriber selection within a single encoded stream rather than several. In principle it is strictly better: lower total bitrate than simulcast, and one encoder instead of three, which removes the device cost entirely.</p><p>In practice the tradeoffs are real. AV1 encoding is computationally heavy in its own right, hardware support is less widespread than for H.264, and SFU support for SVC layer selection is less mature and less uniform across implementations than simulcast, which has been deployed for a decade. Simulcast is the safe default today. SVC is the direction of travel, and worth re-evaluating on a schedule rather than deciding once.</p><h2 id="build-buy-or-deploy"><strong>Build, Buy, or Deploy</strong></h2><p><em>Three routes, with the honest boundary on each.</em></p><h3 id="build-on-open-source"><strong>Build on open source</strong></h3><p>mediasoup, Janus, Pion and LiveKit all support simulcast, and building means you control the ladder, the layer-selection policy and the device-capability fallbacks. Layer selection is one of the two levers that change <a href="https://samvyo.com/blog/sfu-scaling-clustering-cascading-and-where-the-bottleneck-moves?ref=samvyo.com"><u>SFU scaling arithmetic</u></a>. That control matters because the defaults are tuned for general use and the ladder mistake above is easy to make. It also means you own the mobile thermal behaviour, which is the part teams discover late.</p><h3 id="buy-a-cloud-video-api"><strong>Buy a cloud video API</strong></h3><p>Per-minute providers configure simulcast for you, usually sensibly. The limits are that you generally cannot tune the ladder for an unusual layout, and you may not be able to see which layer each subscriber is receiving — which is the single most useful diagnostic when quality complaints arrive.</p><h3 id="deploy-a-commercial-platform"><strong>Deploy a commercial platform</strong></h3><p>The middle path runs a commercial platform on infrastructure you choose. Samvyo is one such option: based on SFU architecture, shipping embeddable SDKs, with the media path, TURN and recording kept on infrastructure you control. Simulcast configuration matters here because average forwarded bitrate determines the egress on your own contract rather than a vendor's margin. It is resilient by design rather than something you assemble.</p><p>Where it does not fit: if your product is one-to-one calling, simulcast is not doing anything for you and none of this applies. And if you need to modify layer-selection behaviour at the source level, building on open source is the honest answer.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Simulcast costs the publisher about 20% more uplink, not 300% — because bitrate scales with pixel count and the lower layers are tiny. If your measured overhead is closer to 80%, your ladder steps are too close together, not your simulcast implementation.</p><p>The real cost is three parallel encoders on the publishing device, which is why mobile clients often publish two layers instead of three. And the real benefit lands on the server, where a lower average forwarded bitrate is multiplied across every subscriber in the room.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>The average forwarded bitrate discussed above drives the egress bill in <a href="https://samvyo.com/blog/scaling-video-cost-what-happens-when-one-media-server-isnt-enough?ref=samvyo.com" rel="noreferrer"><u>what scaling past a single media server costs</u></a>. If you are still choosing a routing model, <a href="https://samvyo.com/blog/sfu-vs-mcu-vs-mesh-which-topology-your-call-size-actually-needs?ref=samvyo.com"><u>SFU vs MCU vs mesh</u></a> explains why only one of the three can do any of this.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What is simulcast in WebRTC?</strong></p><p>Simulcast is when a publisher encodes the same camera feed at several resolutions at once and sends all of them to the media server, which then chooses which version to forward to each subscriber independently. It lets one person's stream arrive as 720p for someone viewing full-screen and 180p for someone viewing a thumbnail, without the publisher sending two separate calls' worth of video.</p><p><strong>Does simulcast use three times the bandwidth?</strong></p><p>No. A typical ladder of 720p at 2.5 Mbps, 360p at 400 kbps and 180p at 125 kbps totals about 3.0 Mbps against 2.5 Mbps for the top layer alone — roughly 20% more. Bitrate scales with pixel count, and the lower layers have a fraction of the pixels.</p><p><strong>Why did enabling simulcast nearly double my uplink?</strong></p><p>Almost certainly the ladder spacing. If your layers are 720p, 540p and 360p, the middle layer alone costs more than half the top layer, and the total lands near 1.8x instead of 1.2x. Each step should roughly halve the width and height, which quarters the pixel count.</p><p><strong>Does simulcast slow down the client?</strong></p><p>It can. Three spatial layers means three encoders running in parallel on the publishing device. On desktops with hardware encoding this is usually fine; on mid-range phones it causes thermal throttling and battery drain that looks like a network problem. Many mobile implementations publish two layers instead of three for this reason.</p><p><strong>When should I turn simulcast off?</strong></p><p>For one-to-one calls, where there is only one subscriber and nothing to select between. For small rooms where everyone renders everyone full-screen. And for publishers whose uplink is already tight, since bandwidth estimation will strip the upper layer anyway and you pay the encoder cost regardless.</p><p><strong>What is the difference between simulcast and SVC?</strong></p><p>Simulcast sends several independently encoded streams; SVC encodes one stream in layers that can be selectively decoded. SVC uses less total bitrate and only one encoder, but hardware support is narrower and SFU handling of it is less mature. Simulcast is the safer default today.</p><p><strong>Does simulcast help the server or the client?</strong></p><p>Both, but the server gains more. The publisher pays about 20% extra uplink once; the server saves that difference on every subscriber it forwards to, and server egress is multiplied by N x (N-1). Lowering the average forwarded bitrate is the highest-leverage change available in a large room.</p>]]></content:encoded></item><item><title><![CDATA[SFU vs MCU vs Mesh: Which Topology Your Call Size Actually Needs]]></title><description><![CDATA[Every video call generates the same quadratic amount of work. The routing topology does not reduce it — it only decides who pays: the client's uplink, the server's CPU, or the server's network. Here is where each model puts the cost, and the call size at which each one stops working.]]></description><link>https://www.samvyo.com/blog/sfu-vs-mcu-vs-mesh-which-topology-your-call-size-actually-needs</link><guid isPermaLink="false">6aaa51668b45c3f0cd63a777</guid><category><![CDATA[SFU vs MCU vs Mesh]]></category><category><![CDATA[Architecture Comparision]]></category><category><![CDATA[Video Conferencing Infrastructure]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 17 Sep 2026 10:53:58 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--01_52_23-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--01_52_23-PM.png" alt="SFU vs MCU vs Mesh: Which Topology Your Call Size Actually Needs"/><p>In a call where everyone sees everyone, N participants generate N x (N-1) streams. That number is fixed by the room, not by your architecture.</p><p>This is the thing that makes the SFU vs MCU vs mesh question tractable. No topology makes the quadratic go away. Each one moves it somewhere else — onto the client's uplink, onto the server's CPU, or onto the server's network interface. Choosing a topology is choosing which of those three you would rather run out of.</p><p>Most architectures are chosen by fashion. SFU is the current default, MCU sounds dated, and mesh sounds elegant. None of that predicts what breaks at your call size.</p><h2 id="sfu-vs-mcu-vs-mesh-where-each-one-puts-the-work"><strong>SFU vs MCU vs mesh: where each one puts the work</strong></h2><p>One sentence each, then the detail.</p><ul><li>Mesh — every participant sends directly to every other participant. No server in the media path. The client pays.</li><li>MCU — the server decodes every stream, composites them into one picture, and re-encodes it. Each client sends one stream and receives one stream. The server's CPU pays.</li><li>SFU — the server receives each stream once and forwards copies without decoding. Each client sends one stream and receives many. The server's network pays.</li></ul><p>The interesting part is not the definitions — <a href="https://samvyo.com/blog/what-is-an-sfu-and-why-does-every-video-platform-use-one?ref=samvyo.com"><u>what an SFU is and why every video platform uses one</u></a> covers those in full. It is where each one hits a wall, and how early.</p><h2 id="mesh-the-client-pays-and-it-runs-out-fast"><strong>Mesh: the client pays, and it runs out fast</strong></h2><p>In a mesh, each participant uploads a separate copy of their own stream to every other participant. That is N-1 uploads per person, and consumer uplink is the scarcest resource in the entire system.</p><p/>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="120"><col width="133"><col width="185"><col width="185"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Participants</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Uploads per client</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Client uplink @ 2.5 Mbps HD</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Client uplink @ 600 kbps SD</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">5.0 Mbps</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1.2 Mbps</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">4</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">7.5 Mbps</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1.8 Mbps</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">5</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">4</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">10.0 Mbps</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2.4 Mbps</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">6</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">5</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">12.5 Mbps</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3.0 Mbps</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>A typical fixed-line connection offers 10 to 20 Mbps up. A mobile connection often has 2 to 5 Mbps. So a four-person HD mesh call already exceeds what many mobile users can sustain, and a six-person one is out of reach for most home connections.</p><p>Bandwidth is not even the hard limit. Each peer connection generally means a separate encode, so a five-person mesh asks the client to run four parallel video encoders. On a laptop that shows up as fan noise and thermal throttling; on a phone it shows up as dropped frames and battery drain. The device gives out before the network does.</p><p>Where mesh genuinely wins: two participants. For a one-to-one call, mesh is not a compromise — it is the optimal answer. No server in the media path means the lowest achievable latency, no infrastructure cost, and no third party holding the media. Any system that routes a two-person call through a server is spending money and milliseconds for nothing.</p><p><em>Past four or five, the work has to move to a server. The question is what the server does with it.</em></p><h2 id="mcu-the-servers-cpu-pays-and-it-is-genuinely-expensive"><strong><em>MCU</em>: the server's CPU pays, and it is genuinely expensive</strong></h2><p>An MCU decodes every incoming stream, composites them into a single video frame, and encodes that frame for delivery. Every client sends one stream and receives one stream, no matter how many people are in the room.</p><p>That constant client cost is the whole point, and it is a real advantage. A ten-year-old device on a 1 Mbps connection can join a fifty-person MCU call, because from the client's perspective a fifty-person call and a two-person call are identical.</p><p>The bill lands on the server instead. Transcoding is orders of magnitude more expensive than forwarding — an SFU rewrites packet headers, while an MCU runs full decode, composite and encode pipelines in real time. Practical MCU capacity runs in the low tens of participants per machine, against hundreds for an SFU on comparable hardware, and published cost comparisons typically put MCU infrastructure at several times SFU infrastructure for the same concurrency.</p><p>There are two modes, and the difference between them is large. A single shared mix means one composite encode for the whole room, which is manageable. Per-participant layouts — where each person sees a view that excludes themselves, or a personalised arrangement — means one encode per participant, and the cost climbs with the room.</p><p>MCU also adds latency that the other two do not, because the mix cannot be produced until the contributing frames have arrived and been decoded. And it destroys information: once streams are composited, the client cannot change the layout, pin a speaker, or render tiles at different sizes, because it is receiving a picture rather than a set of streams.</p><p><strong>MCU is treated as obsolete more often than it deserves. It remains the correct choice for interoperating with SIP and telephony endpoints that expect a single stream, for producing a single composite recording without a separate pipeline, and for any deployment where client devices are genuinely constrained and you control the room size. Dismissing it as legacy is a fashion judgement, not a technical one.</strong></p><p><em>For everything else, the modern default keeps the streams separate.</em></p><h2 id="sfu-the-servers-network-pays-and-the-client-decodes"><strong>SFU: the server's network pays, and the client decodes</strong></h2><p>An SFU receives each published stream once and forwards copies to subscribers without decoding. No transcoding means forwarding is cheap — <a href="https://mediasoup.org/documentation/v3/scalability/?ref=samvyo.com"><u>mediasoup documents roughly 500 forwarded streams per CPU core</u></a> — so the CPU limit that constrains an MCU largely disappears.</p><p>The cost reappears as bandwidth. The server sends N x (N-1) streams, which at an average 600 kbps puts a 40-person room near a full gigabit of egress from a single machine. The quadratic did not vanish; it moved from the client's uplink to <a href="https://samvyo.com/blog/scaling-video-cost-what-happens-when-one-media-server-isnt-enough?ref=samvyo.com" rel="noreferrer"><u>the server's network interface, and onto your infrastructure bill</u></a>.</p><p>And there is a second place it lands that catches teams out: the client's decoder. Each participant now receives up to N-1 separate streams and must decode every one it renders. A 7x7 grid is 49 simultaneous decodes, which no consumer device will do. This is the same constraint that limits <a href="https://samvyo.com/blog/why-watching-500-cameras-is-a-decode-problem-not-a-bandwidth-problem?ref=samvyo.com"><u>how many camera feeds a surveillance operator can watch on one screen</u></a>, and it is the reason large meetings cap visible tiles and forward only the most recent speakers.</p><p>Speaker-based forwarding is what makes large SFU rooms work at all. If the client renders nine tiles, the server forwards nine streams, and N x (N-1) collapses to roughly N x 9 — linear growth instead of quadratic. Almost every large-scale video product does this, and it is usually the difference between a topology that scales and one that does not.</p><h2 id="the-comparison-in-one-table"><strong>The comparison, in one table</strong></h2>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="117"><col width="140"><col width="187"><col width="180"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><br/></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Mesh</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">MCU</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">SFU</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Server CPU</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">None</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Very high — decode, mix, encode</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Low — forwarding only</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Server egress</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">None</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">N streams</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">N x (N-1) streams</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Client uplink</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">(N-1) x stream</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1 stream</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1 stream (~1.2x with simulcast)</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Client downlink</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">(N-1) x stream</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1 stream</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Up to (N-1) streams</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Client decodes</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">N-1</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Up to N-1</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Practical ceiling</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">4–6</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Low tens per box</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Hundreds per box</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Latency</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Lowest — direct path</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Highest — mixing delay</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Low — one forwarding hop</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Client-side layout control</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Full</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">None — receives a picture</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Full</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<h2 id="choosing-between-sfu-mcu-and-mesh-by-call-size"><strong>Choosing between SFU, MCU and mesh by call size</strong></h2><p>Call size is the primary variable. Everything else is a modifier.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="147"><col width="173"><col width="304"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Call size</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Use</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Why</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Mesh (P2P)</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Lowest latency, no infrastructure, no third party in the media path. Routing this through a server is waste.</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3–5</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Mesh if uplink allows, otherwise SFU</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Viable on fixed connections at reduced resolution. Fails on mobile uplink and on parallel encode cost.</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">6–50</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">SFU</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The default range. Forwarding is cheap; egress is manageable on one box.</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">50–200 interactive</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">SFU with speaker-based forwarding</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Quadratic growth must be capped at the tile count or both server egress and client decode break.</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">200+ or broadcast</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">SFU with cascading</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">One machine runs out of network interface long before it runs out of CPU.</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Any size, constrained clients</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">MCU</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Constant client cost regardless of room size — the only topology that offers this.</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">SIP / telephony interop</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">MCU</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6pt 4.5pt 6pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9.5pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Legacy endpoints expect one stream in and one out.</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p>Two modifiers override the table. If any significant share of your users are on mobile networks, drop the mesh row entirely — mobile uplink and battery make it unviable well before the bandwidth math says so. And if you need a single composite recording, an MCU produces it for free, while an SFU needs a separate mixing pipeline to do the same job.</p><h2 id="most-production-systems-are-hybrids"><strong>Most production systems are hybrids</strong></h2><p>In practice these are not exclusive. A well-built platform uses mesh for two-party calls, switches to an SFU the moment a third person joins, and runs a separate mixing pipeline off the SFU when a composite recording or a stream to an RTMP endpoint is required.</p><p>That last piece is worth naming, because it is where the MCU quietly survives: recording and broadcast output is a mixing problem, so most SFU deployments end up running an MCU-shaped component beside the SFU rather than instead of it. The topology question is usually not which one, but which one where.</p><h2 id="build-buy-or-deploy"><strong>Build, Buy, or Deploy</strong></h2><p><em>Three routes, with the honest boundary on each.</em></p><h3 id="build-on-open-source"><strong>Build on open source</strong></h3><p>mediasoup, Janus, Pion and LiveKit are all SFUs, and Janus and Kurento can also perform mixing — <a href="https://samvyo.com/blog/webrtc-media-servers-why-when-and-how-to-choose-one-for-your-next-app?ref=samvyo.com"><u>how to choose a WebRTC media server</u></a> covers the selection. Building gives you control over the mesh-to-SFU switchover and the speaker-forwarding policy, which is the decision that determines whether large rooms work. It also means owning the mixing pipeline separately if you need composite recording, which is frequently underestimated.</p><h3 id="buy-a-cloud-video-api"><strong>Buy a cloud video API</strong></h3><p>Per-minute providers make the topology decision for you, which is genuinely useful when your call sizes are ordinary. The limits show up at the edges: you generally cannot tune the switchover point, change the forwarding policy, or add an MCU path for legacy interop if the provider does not already offer one.</p><h3 id="deploy-a-commercial-platform"><strong>Deploy a commercial platform</strong></h3><p>The middle path is a platform you run on infrastructure you choose. Samvyo is one such option: based on SFU architecture, shipping embeddable SDKs, with the media path, TURN and recording kept on infrastructure you control — which matters here because egress and recording are exactly the two costs the topology choice determines. It is resilient by design rather than something you assemble.</p><p>Where it does not fit: if your product is one-to-one calling only, mesh needs no platform at all. And if your requirement is primarily SIP and telephony bridging, a dedicated conferencing MCU will serve that better than any WebRTC-first platform.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>SFU vs MCU vs mesh is not a ranking. The same N x (N-1) work exists in all three; the topology only decides whether the client's uplink, the server's CPU, or the server's network absorbs it.</p><p>Pick by call size first. Mesh below five, SFU from five to a few hundred, cascading beyond that, and MCU whenever constant client cost or legacy interop matters more than layout control. Then cap the quadratic with speaker-based forwarding, which does more for scale than any topology change.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>If you have settled on an SFU, <a href="https://samvyo.com/blog/sfu-scaling-clustering-cascading-and-where-the-bottleneck-moves?ref=samvyo.com"><u>where the bottleneck actually moves as you scale one</u></a> covers the three limits you hit in order, and <a href="https://samvyo.com/blog/scaling-video-cost-what-happens-when-one-media-server-isnt-enough?ref=samvyo.com" rel="noreferrer"><u>what scaling past a single media server costs</u></a> prices the egress side.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What is the difference between SFU, MCU and mesh?</strong></p><p>Mesh has no server — every participant sends their stream directly to every other participant. An MCU decodes all streams, mixes them into one picture and re-encodes it, so each client sends and receives exactly one stream. An SFU receives each stream once and forwards copies without decoding, so clients send one and receive many. The total work is the same in all three; only its location changes.</p><p><strong>At how many participants does mesh stop working?</strong></p><p>Around four to six, and sooner on mobile. Each participant uploads N-1 copies of their own stream, so a five-person HD call needs about 10 Mbps of uplink per person. Parallel encoding usually bites first — five participants means four simultaneous video encoders on the client device.</p><p><strong>Is an MCU obsolete?</strong></p><p>No, though it is often described that way. An MCU is the only topology where client cost stays constant regardless of room size, which makes it the right answer for constrained devices, poor networks, and interoperation with SIP or telephony endpoints that expect a single stream. It also produces a composite recording for free. What you give up is client-side layout control and some latency.</p><p><strong>Why is an SFU cheaper to run than an MCU?</strong></p><p>Because it never decodes the video. An SFU rewrites packet headers and forwards, which costs roughly 500 streams per CPU core. An MCU runs full decode, composite and encode pipelines in real time, which limits practical capacity to the low tens of participants per machine. The tradeoff is that SFU bandwidth grows quadratically with room size while MCU bandwidth does not.</p><p><strong>Which topology has the lowest latency?</strong></p><p>Mesh, because there is no server in the media path at all. An SFU adds one forwarding hop, which is small. An MCU adds the most, because the mixed frame cannot be produced until the contributing frames have arrived and been decoded.</p><p><strong>How do large meetings with hundreds of people work on an SFU?</strong></p><p>By not forwarding everything. If a client renders nine tiles, the server forwards nine streams rather than all of them, which turns quadratic growth into linear growth. Speaker-based forwarding combined with cascading across multiple servers is how essentially every large-scale video product operates.</p><p><strong>Can I use more than one topology in the same product?</strong></p><p>Yes, and most production systems do. A common pattern is mesh for two-party calls, an SFU from the third participant onward, and a separate mixing pipeline alongside the SFU for composite recording or broadcast output. Some platforms, including Samvyo, handle the switchover without the application having to manage it.</p>]]></content:encoded></item><item><title><![CDATA[SFU Scaling: Clustering, Cascading, and Where the Bottleneck Moves]]></title><description><![CDATA[Scaling an SFU is not one problem. The bottleneck moves three times — from the worker process, to the network interface, to the links between servers — and each move changes what you should be measuring. Here is where each limit bites, with the arithmetic behind it.]]></description><link>https://www.samvyo.com/blog/sfu-scaling-clustering-cascading-and-where-the-bottleneck-moves</link><guid isPermaLink="false">6aaa511e8b45c3f0cd63a770</guid><category><![CDATA[Video Conferencing Infrastructure]]></category><category><![CDATA[Video Architecture]]></category><category><![CDATA[Scaling Video]]></category><category><![CDATA[Cascading]]></category><category><![CDATA[WebRTC]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 17 Sep 2026 10:53:33 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--01_44_57-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--01_44_57-PM.png" alt="SFU Scaling: Clustering, Cascading, and Where the Bottleneck Moves"/><p><em>If you arrived here from the </em><a href="https://samvyo.com/blog/scaling-video-cost-what-happens-when-one-media-server-isnt-enough?ref=samvyo.com" rel="noreferrer"><em>business version</em></a><em>, you're in the right place. </em>That piece covered what scaling past a single media server costs<em>, and why the bill grows with the square of the room. This is the companion "how" — where the bottleneck actually sits at each stage, and what changes when you add the second box.</em></p><p>SFU scaling has a reputation for being a single wall you hit at some participant count. It isn't. The bottleneck moves three times before you genuinely run out of machine, and each move changes which metric is worth watching.</p><p>Most capacity problems in production are not a shortage of capacity. They are a team watching the limit they hit last time.</p><h2 id="first-the-unit-sfu-scaling-is-counted-in-consumers"><strong>First, the unit: SFU scaling is counted in consumers</strong></h2><p>An SFU does not forward participants. It forwards streams, and the working unit is the consumer — one outbound stream to one receiver. In a room where everyone subscribes to everyone, that is N x (N-1).</p><p>This is why participant counts are a poor capacity unit. A room of seven generates 42 consumers. A room of seventy generates 4,830. Same server, same software, 115x the work — and any figure quoted in participants has silently baked in an assumption about room shape that almost certainly does not match yours.</p><p>With the unit fixed, the three limits line up in order.</p><h2 id="bottleneck-1-the-worker-process-and-why-it-is-one-core"><strong>Bottleneck 1: the worker process, and why it is one core</strong></h2><p>Most SFUs run their media path as single-threaded workers, one per CPU core. mediasoup is explicit about this in <a href="https://mediasoup.org/documentation/v3/scalability/?ref=samvyo.com"><u>its own documentation</u></a>: a worker subprocess handles "over ~500 consumers," and scaling within a host means running more workers and distributing routers across them.</p><p>The per-consumer cost is small but real. For each outbound stream the server terminates and re-applies SRTP, rewrites RTP sequence numbers and timestamps, tracks RTCP feedback, and maintains per-consumer state for retransmission and layer selection. None of it is transcoding — that is the whole point of an SFU — but at a few thousand streams the accounting itself becomes the workload.</p><p>What this means practically: a single worker saturates at about 23 participants in one all-see-all room, because 23 x 22 = 506. That is a much smaller number than most teams expect, and it is the reason a 16-core box does not behave like one big server unless your rooms are distributed across its workers deliberately.</p><p>The fix inside one host is routing, not hardware. Pin rooms to workers, and use the SFU's own inter-router piping when a single room needs more than one worker. Get that wrong and you have fifteen idle cores and one saturated one.</p><p>Solve the worker problem and the next limit is already waiting, usually closer than expected.</p><h2 id="bottleneck-2-the-network-interface"><strong>Bottleneck 2: the network interface</strong></h2><p>Egress saturates sooner than CPU in most real deployments, and it is the limit teams model least.</p><p>Work it through. A 40-person room at an average 600 kbps per forwarded stream — a realistic figure when simulcast is on and most grid tiles receive a lower spatial layer — is 1,560 x 600 kbps, or 936 Mbps. That is one room, one machine, and effectively a full gigabit link.</p><p>The <a href="https://uploads-ssl.webflow.com/5c6853c495409838d874a0d2/5cbed66cae2b88609106befa_IPTComm_2018_LoadTesting-12%5B23229%5D.pdf?ref=samvyo.com"><u>independent IPTComm benchmark</u></a> of Jitsi, Janus, Medooze and Kurento is a useful sanity check here. It ran on a 16-vCPU instance with 2 Gbps of dedicated network and topped out around 490 participants in rooms of seven — a configuration that is deliberately egress-light, since rooms of seven generate only 42 consumers each. Put those same 490 people into one room and you would need 239,610 consumers. The hardware was never the variable.</p><p>Two design consequences follow. First, NIC capacity and not core count should drive instance selection for large rooms. Second, average forwarded bitrate is the single highest-leverage number in the whole system, because it is multiplied by N x (N-1) — shaving 100 kbps off the average saves 156 Mbps in a 40-person room. <a href="https://samvyo.com/blog/scaling-video-cost-what-happens-when-one-media-server-isnt-enough?ref=samvyo.com" rel="noreferrer"><u>What that traffic costs depends entirely on where you host it</u></a>.</p><p>When one machine's interface is full, you add a second machine. That is where SFU scaling stops being arithmetic and becomes topology.</p><h2 id="bottleneck-3-the-cascade-mesh-%E2%80%94-and-why-sfu-scaling-across-boxes-is-cheaper-than-it-looks"><strong>Bottleneck 3: the cascade mesh — and why SFU scaling across boxes is cheaper than it looks</strong></h2><p>Cascading splits a room across servers. Participants connect to whichever server is closest or least loaded, and the servers forward published streams to each other so everyone can still subscribe to everyone.</p><p>The common fear is that inter-server traffic explodes. It doesn't — provided the cascade sends one copy of each published stream per server, rather than one copy per remote subscriber. That distinction is the whole design.</p><p>Take a 70-person room. On one server that is 4,830 consumers. Split across two servers with 35 participants each:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="160"><col width="155"><col width="155"><col width="155"/></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Topology</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Egress per server</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Inter-server traffic</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Total streams out</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1 server, 70 users</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">4,830</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">—</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">4,830</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2 servers, 35 each</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2,450</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">35 streams each way</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">4,900</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3 servers, ~23 each</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1,633</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">46 streams per server</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">4,899</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p>Total traffic rises by about 1.4%. Per-server load halves with two boxes and drops to roughly a third with three. The inter-server term stays almost flat because it scales with publishers and servers, not with subscribers — 35 streams crossing between two servers, versus 2,450 going out to clients.</p><p>So cascading is close to free in bandwidth terms. What it actually costs you is elsewhere:</p><ul><li>Placement logic. Which participant lands on which server, and what happens when the answer changes mid-call.</li><li>Failure domains. One server dying no longer ends the call — it partially ends it, for some participants, which is a harder state to handle than a clean failure.</li><li>Added latency on the cross-server hop, which matters for interactive use and compounds with geographic distribution.</li><li>Layer selection across the boundary, since the remote server has to decide which simulcast layer to pull without seeing the subscriber's bandwidth estimate directly.</li></ul><p>That last point is where a lot of quality regressions come from, and it is worth checking what your SFU does before assuming the behaviour. <a href="https://samvyo.com/blog/multi-site-webrtc-surveillance-building-the-site-edge-relay-and-central-sfu-that-scales-to-50-sites?ref=samvyo.com"><u>Cascading in a production surveillance deployment across 50 sites</u></a> shows the pattern working at scale.</p><p>Which brings up the harder question: how do you know when any of this is going wrong?</p><h2 id="what-the-load-tests-actually-measured"><strong>What the load tests actually measured</strong></h2><p>The IPTComm study produced one finding that is more useful than its headline numbers: <a href="https://webrtchacks.com/sfu-load-testing/?ref=samvyo.com"><u>bitrate and round-trip time are poor proxies for video quality</u></a>.</p><p>Across the runs, bitrate and RTT both degraded noticeably at around 250 participants, while perceived video quality — scored with a dedicated video quality algorithm rather than inferred — held up until per-stream bandwidth dropped below roughly 200 kbps. The metrics that were easy to collect moved first; the metric that mattered moved later. Worth noting that the same study recorded Jitsi reaching its 490-participant target with a 79% video-check failure rate, which is the sharpest possible illustration of the same point.</p><p>That asymmetry cuts both ways. It means an alert threshold set on bitrate or RTT will fire before anything is actually wrong, which trains teams to ignore it. And it means that by the time the ignored alert would have been correct, the useful warning window has already passed.</p><p>For SFU scaling specifically, the metrics worth alerting on are the ones with a hard ceiling: consumer count per worker, sustained egress against NIC capacity, and the rate of layer downgrades the server is issuing. The third is the closest thing to an early warning the system produces, because bandwidth estimation reacts before users do.</p><p>Some of the levers that change all three numbers are routing decisions rather than capacity decisions.</p><h2 id="routing-decisions-that-change-the-arithmetic"><strong>Routing decisions that change the arithmetic</strong></h2><p>Two mechanisms alter the consumer count directly, and both are worth deliberate configuration rather than defaults.</p><p><a href="https://samvyo.com/blog/what-is-simulcast-and-when-does-it-save-or-waste-bandwidth?ref=samvyo.com" rel="noreferrer"><u>Simulcast</u></a> lets the SFU choose which spatial layer to forward per subscriber. Publishing three layers costs the sender roughly 20% more uplink — a 720p/360p/180p ladder is about 3.0 Mbps against 2.5 Mbps for the top layer alone, because bitrate scales with pixel count and the lower layers are small. In exchange, the server can send a 180p stream to a thumbnail tile instead of 720p, which is where the average forwarded bitrate in the egress math above comes from. The real cost of simulcast is not bandwidth; it is three parallel encodes on the publisher, which is the binding constraint on mobile.</p><p>Speaker-based forwarding cuts the consumer count outright. If the client only renders the nine most recent speakers, the server has no reason to forward seventy streams to it. This turns N x (N-1) into something closer to N x k, which changes the growth curve from quadratic to linear and is by far the largest single lever available. It also introduces switching artefacts and a dependency on speaker detection being right, so it is a UX decision as much as an infrastructure one.</p><p>Between them, these two decide whether a large room is a capacity problem at all.</p><h2 id="build-buy-or-deploy"><strong>Build, Buy, or Deploy</strong></h2><p><em>Three routes, with the honest boundary on each.</em></p><h3 id="build-on-open-source"><strong>Build on open source</strong></h3><p>mediasoup, Janus, Pion and LiveKit are all production-grade, and the benchmark numbers in this post come from exactly this class of software. Building gives you full control over placement, layer selection and cascade behaviour, which is genuinely valuable if your room shapes are unusual. The cost is that everything in the Bottleneck 3 list becomes yours to design, and cascade failure handling in particular is a deep piece of work that is easy to underestimate.</p><h3 id="buy-a-cloud-video-api"><strong>Buy a cloud video API</strong></h3><p>Per-minute providers hide all three bottlenecks entirely, which is the right trade at low or unpredictable volume. The limits are that you inherit their placement and layer-selection policy, you generally cannot see the consumer-level metrics discussed above, and per-minute pricing is linear in participants while your traffic is quadratic in room size — so large rooms are where the model fits worst.</p><h3 id="deploy-a-commercial-platform"><strong>Deploy a commercial platform</strong></h3><p>The middle path runs a commercial platform on infrastructure you select. Samvyo is one such option: based on SFU architecture, shipping embeddable SDKs, with the media path, TURN and recording kept on infrastructure you control — which is what makes the egress and placement decisions above yours to make rather than a vendor's. It is resilient by design rather than something you assemble from parts.</p><p>Where it does not fit: if you need to modify forwarding behaviour at the source level, or your workload is small enough that none of these bottlenecks will ever bind, building or buying respectively will serve you better.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>SFU scaling is three limits in sequence, not one. The worker caps at roughly 500 consumers per core, the network interface caps well below what most instance types suggest, and the cascade mesh — the one everyone worries about — turns out to add only a few percent to total traffic when implemented correctly.</p><p>Measure consumers rather than participants, watch egress rather than CPU, and treat layer selection and speaker-based forwarding as capacity decisions. They change the growth curve itself, which no amount of hardware does.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>The business companion, <a href="https://samvyo.com/blog/scaling-video-cost-what-happens-when-one-media-server-isnt-enough?ref=samvyo.com" rel="noreferrer"><u>Scaling video cost: what happens when one media server isn't enough</u></a>, prices the traffic this post describes — including the egress line that most self-hosting cost models leave out. For the foundation, <a href="https://samvyo.com/blog/what-is-an-sfu-and-why-does-every-video-platform-use-one?ref=samvyo.com"><u>what an SFU is and why every video platform uses one</u></a> covers the basics.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>What is the main bottleneck in SFU scaling?</strong></p><p>It moves. The worker process limits you first at roughly 500 consumers per CPU core, the network interface limits you second and usually sooner than teams expect, and the links between cascaded servers limit you third. Each stage needs a different metric, which is why capacity problems often look like a team monitoring the limit they hit previously.</p><p><strong>How many consumers can one SFU worker handle?</strong></p><p>Around 500, per mediasoup's own documentation, on one CPU core. That works out to about 23 participants in a single room where everyone sees everyone, since 23 x 22 is 506. Larger rooms need multiple workers with routers piped between them, or multiple hosts.</p><p><strong>Does cascading SFUs increase total bandwidth usage?</strong></p><p>Only marginally — around 1.4% in a 70-person room — provided the implementation sends one copy of each published stream per server rather than one per remote subscriber. Per-server load roughly halves with two servers. The real costs of cascading are placement logic, partial failure handling and the extra hop's latency, not bandwidth.</p><p><strong>Should I scale an SFU vertically or horizontally?</strong></p><p>Vertically until you hit the network interface, then horizontally. Adding cores helps only if rooms are distributed across workers deliberately, and it does nothing once egress is the constraint. A second machine adds a second NIC, which is usually the actual reason to add it.</p><p><strong>Why is CPU low while my SFU is struggling?</strong></p><p>Almost always egress saturation. Forwarding is cheap in CPU terms and expensive in bandwidth terms, so a server can be at 30% CPU with a completely full network interface. Check sustained outbound throughput against NIC capacity before adding cores.</p><p><strong>What metrics should I alert on for SFU scaling?</strong></p><p>Consumer count per worker, sustained egress against interface capacity, and the rate of simulcast layer downgrades the server is issuing. Independent benchmarking has shown that bitrate and round-trip time degrade well before perceived quality does, so alerts built on those two tend to fire early and get ignored.</p><p><strong>Does simulcast reduce the load on the SFU?</strong></p><p>It reduces egress, not CPU. The server forwards a lower spatial layer to subscribers who don't need full resolution, which cuts the average forwarded bitrate substantially in grid layouts. The consumer count is unchanged — the server still tracks per-subscriber state for every stream — so the worker limit still applies.</p>]]></content:encoded></item><item><title><![CDATA[Scaling Video Cost: What Happens When One Media Server Isn't Enough]]></title><description><![CDATA[A single media server does not fail at a user count. It fails at an egress number, and that number grows with the square of the room. Here is the arithmetic behind a 40-person call, the bandwidth bill it generates, and why the same workload costs 90x more on one venue than another.]]></description><link>https://www.samvyo.com/blog/scaling-video-cost-what-happens-when-one-media-server-isnt-enough</link><guid isPermaLink="false">6aaa3ff38b45c3f0cd63a754</guid><category><![CDATA[Video Conferencing Infrastructure]]></category><category><![CDATA[WebRTC]]></category><category><![CDATA[Scaling Video]]></category><category><![CDATA[cost-benefit analysis]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 17 Sep 2026 10:53:18 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--01_11_31-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-17--2026--01_11_31-PM.png" alt="Scaling Video Cost: What Happens When One Media Server Isn't Enough"/><p>Forty people join a call. Your media server is not handling forty streams. It is handling 1,560.</p><p>That number is the whole of scaling video cost, and almost every capacity plan gets it wrong because it counts the wrong thing. Teams size their infrastructure on participants — a headcount, a seat number, something a sales forecast produces. A media server does not spend anything on participants. It spends on outbound streams, and outbound streams grow with the square of the room.</p><p>So the question is not how many people fit on one box. It is how much traffic leaves it.</p><h2 id="the-number-everyone-quotes-%E2%80%94-and-the-unit-its-missing"><strong>The number everyone quotes — and the unit it's missing</strong></h2><p>If you have researched this before, you have seen the figure: a single media server handles roughly 40 to 70 participants. It gets repeated in vendor comparisons, capacity guides and architecture posts, usually without a qualifier.</p><p>The figure is real. It is also close to meaningless on its own, because it is a conclusion, not a specification — and the inputs it depends on almost never travel with it.</p><p>Here is where it comes from. The most rigorous public benchmark of open-source media servers is <a href="https://uploads-ssl.webflow.com/5c6853c495409838d874a0d2/5cbed66cae2b88609106befa_IPTComm_2018_LoadTesting-12%5B23229%5D.pdf?ref=samvyo.com"><u>a comparative study by Andre, Roux and Gouaillard presented at IPTComm 2018</u></a>, which loaded Jitsi, Janus, Medooze and Kurento on a 16-vCPU cloud instance with 2 Gbps of network, streaming 540x360 H.264 at 30 fps, arranged as rooms of seven.</p><p>The headline numbers need their conditions attached, which is the entire point of this section. Medooze was the strongest performer, holding 490 participants across seventy rooms and maintaining good image quality up to about 400. Jitsi also reached 490 — but with a 79% failure rate on the video check, meaning blank or frozen images, and sending bitrate collapsing from 530 kbps to 45 kbps. Janus stopped at 245 in that run, with round-trip time above 6.5 seconds at target load. Kurento/OpenVidu managed 140.</p><p>The Janus figure has since been superseded, and the correction matters. <a href="https://webrtchacks.com/sfu-load-testing/?ref=samvyo.com"><u>The same team's follow-up testing</u></a> identified a bug in libnice that was throttling both Janus and Kurento. After a patch advised by the Janus team, Janus's results improved substantially and it reached roughly 500 users — at which point, in their words, "Janus seems to perform the best." Jitsi in that later round became unstable at exactly 240.</p><p><strong>Two lessons sit in that correction. A participant count on its own can conceal a failed experiment — Jitsi's 490 is a number the process survived, not a number its users would have accepted. And a benchmark measures a build on a particular day rather than a project forever; the Janus result was a bug, and the bug was fixed.</strong></p><p>Meanwhile <a href="https://mediasoup.org/documentation/v3/scalability/?ref=samvyo.com"><u>mediasoup's own documentation</u></a> states a different number entirely: one worker process, pinned to one CPU core, handles "over ~500 consumers." A consumer is one outbound stream to one receiver.</p><p>Those look like contradictory numbers. They are the same number in different units, and the unit is the entire argument.</p><h2 id="why-scaling-video-cost-is-quadratic-not-linear"><strong>Why scaling video cost is quadratic, not linear</strong></h2><p>In a room where everyone sees everyone, each participant receives a stream from every other participant. The server forwards N x (N-1) streams. Add one person to a call and you do not add one stream — you add roughly 2N of them.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="160"><col width="232"><col width="232"/></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Participants</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Outbound streams</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Growth over previous row</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">10</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">90</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">—</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">25</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">600</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">6.7x</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">40</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1,560</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2.6x</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">70</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">4,830</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">3.1x</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">100</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">9,900</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">2.0x</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p>Now the two benchmark figures reconcile. At roughly 500 consumers per core, one core saturates at about 23 people in a single all-see-all room. A 16-vCPU box has about 8,000 consumers of headroom, which lands between 70 and 90 participants in one room — or, split differently, seventy separate rooms of seven, which is 2,940 consumers and well within the same budget.</p><p>Neither 40–70 nor 500 is a property of the software. Both are the same egress budget, divided by a different room shape. A media server does not fail at a user count. It fails at a traffic number, and how you arrange your users decides how fast you reach it.</p><p>Which raises the practical question: what does that traffic number actually cost?</p><h2 id="what-actually-breaks-first"><strong>What actually breaks first</strong></h2><p>Three things can run out, and they run out in a predictable order.</p><p>CPU goes first in small, dense rooms. Forwarding is cheap per stream but not free — the server still terminates encryption, rewrites RTP headers and tracks state per consumer. This is the constraint the per-core consumer figure describes.</p><p>The network interface goes next, and in practice it goes sooner than teams expect. A 40-person room forwarding an average of 600 kbps per stream is pushing 936 Mbps — very close to a gigabit, out of one machine, for one meeting. The IPTComm rig had 2 Gbps, which is precisely why it capped where it did.</p><p>Quality goes last, and this is the counterintuitive part. <a href="https://webrtchacks.com/sfu-load-testing/?ref=samvyo.com"><u>The same benchmarking work</u></a> found that bitrate and round-trip time both degrade well before users notice anything, and that perceived video quality held up until per-stream bandwidth fell below roughly 200 kbps. Your dashboards turn amber long before your users complain. That sounds like good news and it is not: it means the graph that would have warned you is the graph everyone has learned to ignore.</p><p>The instinct at this point is to add a second server. That helps less than it looks.</p><h2 id="the-second-box-doesnt-halve-the-problem"><strong>The second box doesn't halve the problem</strong></h2><p>Splitting one room across two servers does not split the traffic in half, because participants on server A still need the streams published on server B. The servers have to forward to each other, and that inter-server link carries real bandwidth.</p><p>Cascading is the standard answer and it is a good one — it is how every large deployment works, and it buys you geographic proximity as well as headroom. But it converts a capacity problem into a topology problem. You now own decisions about which participants land on which server, how many streams cross between them, and what happens when one of them fails mid-call. None of that is free, and none of it is a configuration flag.</p><p>The honest framing is that clustering does not reduce your scaling video cost. It makes the cost survivable and predictable, which is worth paying for — but the total traffic goes up, not down. The companion technical piece walks <a href="https://samvyo.com/blog/sfu-scaling-clustering-cascading-and-where-the-bottleneck-moves?ref=samvyo.com"><u>where the bottleneck moves as you add boxes</u></a>.</p><p>So it is worth looking directly at the traffic bill, because it is the line item almost nobody models.</p><h2 id="where-the-scaling-video-cost-actually-lands"><strong>Where the scaling video cost actually lands</strong></h2><p><a href="https://samvyo.com/blog/open-source-video-infrastructure-for-enterprise-why-companies-outgrow-jitsi-livekit-and-self-hosted-webrtc?ref=samvyo.com"><u>Total cost of ownership models for self-hosted video</u></a> are common, and most of them are careful about the same four things: server instances, recording capacity, storage, and the engineering time to keep it all running. Those models are useful and they are usually right.</p><p>They also tend to leave out egress, which on some infrastructure is the largest number on the page.</p><p>Take the 40-person room. 1,560 outbound streams at an average 600 kbps is 936 Mbps sustained, which is about 421 GB of outbound traffic per hour of meeting. Priced against <a href="https://aws.amazon.com/ec2/pricing/on-demand/?ref=samvyo.com"><u>published cloud egress rates</u></a>:</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="100"><col width="107"><col width="127"><col width="152"><col width="139"/></col></col></col></col></colgroup><thead><tr style="height:0pt"><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Room size</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Streams out</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Egress per hour</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Major cloud @ $0.09/GB</span></p></th><th style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;" scope="col"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Dedicated server @ ~$1/TB</span></p></th></tr></thead><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">10</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">90</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">24 GB</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$2.19</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$0.03</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">25</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">600</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">162 GB</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$14.58</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$0.17</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">40</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1,560</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">421 GB</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$37.90</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$0.44</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">70</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">4,830</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">1,304 GB</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$117.37</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;padding:4.5pt 6.5pt 4.5pt 6.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:10pt;font-family:Calibri,sans-serif;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">$1.37</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p>One 40-person all-hands costs roughly $38 an hour in bandwidth alone on major-cloud list pricing. The same meeting on a dedicated server with bundled transfer costs about forty-five cents.</p><p><strong>That is not a rounding difference. It is roughly 90x, and it is larger than every other variable in the build-versus-buy decision combined.</strong></p><p>For scale, a <a href="https://samvyo.com/blog/per-minute-video-pricing-at-scale-what-enterprise-teams-actually-pay?ref=samvyo.com"><u>per-minute cloud video API at around $0.004 per participant-minute</u></a> prices that same 40-person hour at about $9.60. Which means major-cloud egress alone runs roughly four times the cost of simply buying the service — while the identical software on dedicated hardware runs about a twentieth of it.</p><p>The conclusion is not that self-hosting is cheap or expensive. It is that "self-hosted" is not one cost model. The software is free either way; where you run it moves the bill by two orders of magnitude, and it is the single variable most TCO comparisons hold constant without saying so.</p><h2 id="build-buy-or-deploy"><strong>Build, buy, or deploy</strong></h2><p>Three routes, with the honest boundary on each.</p><h3 id="build-on-open-source"><strong>Build on open source</strong></h3><p>mediasoup, Janus, Pion and LiveKit are all production-grade and genuinely free to license — <a href="https://samvyo.com/blog/webrtc-media-servers-why-when-and-how-to-choose-one-for-your-next-app?ref=samvyo.com"><u>choosing between them</u></a> is its own decision. This route wins decisively when you have somewhere cheap to put the traffic — dedicated servers, a colocation contract, or committed bandwidth — and an engineer who owns the deployment. It goes wrong when teams take the same open-source stack and run it on metered public-cloud egress, which is where the free software quietly becomes the most expensive option on the table.</p><h3 id="buy-a-cloud-video-api"><strong>Buy a cloud video API</strong></h3><p>Per-minute providers absorb the bandwidth problem entirely, and at low or spiky volume that is excellent value — you pay nothing for the idle hours and nothing for the capacity planning. The economics invert at sustained scale, because the per-minute rate is linear in participants while your actual traffic is quadratic in room size. Large rooms are where per-minute pricing hurts most and where its value is least obvious upfront.</p><h3 id="deploy-a-commercial-platform"><strong>Deploy a commercial platform</strong></h3><p>The middle path is a platform you run on infrastructure you choose, so the egress lands on your contract rather than someone's margin. Samvyo is one such option: it is based on SFU architecture, ships embeddable SDKs, and lets you keep the media path, TURN and recording on infrastructure you control — which is exactly the set of decisions that determines the bandwidth bill above. It is resilient by design rather than something you assemble.</p><p>Where it does not fit: if your volume is genuinely low or highly irregular, a per-minute API will cost less and involve fewer decisions. And if you have deep in-house WebRTC expertise and an existing bare-metal footprint, building on open source is a reasonable and well-trodden path. The platform route earns its keep in the middle — meaningful scale, no dedicated video infrastructure team.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>A media server does not cap at a number of users. It caps at a volume of outbound traffic, and that volume grows with the square of the room, not in step with the headcount. Size your infrastructure on streams, not seats.</p><p>And before comparing self-hosting to buying, price the egress. The software licence is the same either way; the bandwidth is where the decision is actually made, and on major-cloud list rates it can exceed the cost of the service you were trying to avoid.</p><h2 id="whats-next"><strong>What's Next</strong></h2><p>This post covered what scaling past a single media server costs. The companion technical deep-dive, <a href="https://samvyo.com/blog/sfu-scaling-clustering-cascading-and-where-the-bottleneck-moves?ref=samvyo.com"><u>SFU scaling: clustering, cascading, and where the bottleneck moves</u></a>, walks the other half. If you are earlier in the decision, <a href="https://samvyo.com/blog/what-is-an-sfu-and-why-does-every-video-platform-use-one?ref=samvyo.com"><u>what an SFU is and why every video platform uses one</u></a> is the place to start.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><p><strong>How many participants can one media server handle?</strong></p><p>Between roughly 40 and 70 in a single room where everyone sees everyone, on a 16-vCPU class machine at conferencing bitrates — but the figure is misleading on its own. The real limit is outbound streams, around 500 per CPU core. The same hardware that supports 70 people in one room supports several hundred spread across smaller rooms, because a room of seven generates 42 streams while a room of seventy generates 4,830.</p><p><strong>Why does scaling video cost grow faster than the number of users?</strong></p><p>Because in an all-see-all room every participant receives a stream from every other participant, so the server forwards N x (N-1) streams. Doubling a room from 20 to 40 people does not double the load — it roughly quadruples it, from 380 streams to 1,560.</p><p><strong>Is self-hosting a media server cheaper than a per-minute video API?</strong></p><p>It depends almost entirely on where you host it, not on the software. On dedicated servers with bundled bandwidth, self-hosting is dramatically cheaper. On metered public-cloud egress at around $0.09/GB, the bandwidth alone can cost several times what a per-minute API would charge for the same sessions. Price the egress before comparing anything else.</p><p><strong>What is egress, and why is it missing from most TCO models?</strong></p><p>Egress is outbound data transfer — the traffic leaving your server toward users. Most self-hosting cost models carefully account for compute, storage, recording and engineering time, all of which are visible as line items when you provision them. Egress is usage-based and arrives after the fact, so it tends to be estimated rather than modelled, and video is unusually egress-heavy.</p><p><strong>Does clustering media servers reduce bandwidth costs?</strong></p><p>No — it increases total traffic, because servers must forward streams to each other so participants split across boxes can still see everyone. Clustering solves capacity and geography, not cost. What it buys you is a system that keeps working past the point where one machine stops, which is usually worth the additional traffic.</p><p><strong>Can I keep control of the media path without building on open source myself?</strong></p><p>Yes. Some commercial platforms are deployed on infrastructure you choose rather than consumed as a metered cloud service, which keeps the media path, TURN and recording under your control and the bandwidth on your own contract. Samvyo works this way. The tradeoff is that you are still responsible for the hosting decision — which, as the numbers above show, is the decision that matters most.</p><p><strong>What bitrate should I assume when estimating video bandwidth?</strong></p><p>For planning, an average of 500–700 kbps per forwarded stream is a reasonable starting point for conferencing with simulcast enabled, since most participants in a grid view receive a lower layer rather than full-resolution video. Measure your own distribution before committing to a capacity plan — the average matters far more than the peak, because it is multiplied by N x (N-1).</p>]]></content:encoded></item><item><title><![CDATA[Talk-Down at Ten Seconds Is Theater: The Surveillance Intervention Latency Budget]]></title><description><![CDATA[An operator warns a man who left the frame fifteen seconds ago. Intervention runs on a latency budget, and it is paid twice — once carrying the event to the operator, once carrying the reaction back. Here is where every second goes, which stages you control, and which you never will.]]></description><link>https://www.samvyo.com/blog/talk-down-at-ten-seconds-is-theater-the-surveillance-intervention-latency-budget</link><guid isPermaLink="false">6aa2d54e8b45c3f0cd63a604</guid><category><![CDATA[video surveillance]]></category><category><![CDATA[Proactive Surveillance]]></category><category><![CDATA[Control Room]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Fri, 11 Sep 2026 11:03:24 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-10--2026--10_00_59-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-10--2026--10_00_59-PM.png" alt="Talk-Down at Ten Seconds Is Theater: The Surveillance Intervention Latency Budget"/><p><em>An operator warns a man who walked out of frame fifteen seconds ago. That is a surveillance intervention latency failure — a budget problem, not a video problem. Here's where the seconds actually go.</em></p><p>The operator sees it clearly: a figure at the edge of the loading bay, moving along the roller door. They key the microphone and speak — <em>you at the loading door, in the grey jacket, you're on camera.</em> Nobody reacts. The bay is empty. The man walked out of frame while the words were still travelling, because the feed was eight seconds behind the world it was showing.</p><p>That gap is <strong>surveillance intervention latency</strong>, and it isn't the same thing as video latency. Video latency is how long the picture takes to arrive. Intervention latency is how long the whole loop takes — event to eyes, eyes to decision, decision to voice, and back again to see whether any of it worked. Talk-down, verified dispatch and remote guarding all run on that loop. Budget only the first leg and you get a control room that is technically watching and functionally narrating.</p><p><em>The reason the loop matters more than the stream is that you pay for it twice.</em></p><h2 id="intervention-is-a-loop-not-a-stream">Intervention Is a Loop, Not a Stream</h2><p>Watching video is a one-way problem. Packets leave the camera, arrive at a screen, and the only question is how late they are. Intervention is a closed loop with a human inside it: observe, decide, act, observe the result, adjust.</p><p>That fourth stage is the one nobody budgets for, and it's the one that doubles the cost. A talk-down is not fire-and-forget. The operator speaks, then has to see what the subject does — stop, run, look up at the camera, keep walking — because that reaction decides the next move: escalate to dispatch, keep talking, or stand down. So the video latency is paid twice. Once carrying the event to the operator, once carrying the reaction back. An eight-second feed doesn't put the operator eight seconds behind; it makes the decision cycle sixteen seconds wide.</p><p>Anyone who has driven a camera remotely already knows this shape — it's the same closed loop that makes <a href="https://samvyo.com/blog/ptz-over-the-web-why-steering-a-camera-is-harder-than-streaming-it?ref=samvyo.com" rel="noreferrer"><strong><em>PTZ over the web</em></strong></a> overshoot, and it fails for the same reason: the human is steering against delayed feedback. Talk-down is that loop with a voice instead of a joystick.</p><p><em>So the useful question isn't how fast the stream is. It's how wide the decision cycle is, and whether it's narrower than the event.</em></p><h2 id="how-long-you-actually-have">How Long You Actually Have</h2><p>The instinct is to look up how long an incident lasts and call that the budget. That number exists: researchers at UNC Charlotte <a href="https://siacinc.org/wp-content/uploads/2022/04/Burglar-Survey-Study-Final-Report.pdf?ref=samvyo.com"><u>surveyed 422 incarcerated burglars</u></a> across North Carolina, Kentucky and Ohio, and found most burglaries were over in under ten minutes.</p><p>Ten minutes is not your budget. The incident clock starts before you know about it, and the window you're aiming at isn't the whole incident — it's the span between present and committed.</p><p>The same study measures that window directly. Asked what they would do on discovering an alarm <em>after</em> starting a burglary, 50% said they would discontinue the attempt; 37% would sometimes continue, and only 13% would always press on. Read that as a finding about timing rather than about alarms: roughly half of offenders abandon an incident in progress once they learn they've been detected. A talk-down is the least ambiguous version of that signal there is — not a siren, which is a machine, but a human voice describing what someone is wearing, right now.</p><p>Two limits worth stating plainly: the study covers residential burglary in three US states and relies on offender self-report, and it does not measure talk-down directly. Vendors publish talk-down success rates, but those come from companies selling remote guarding. The alarm-discovery finding is the closest rigorous public evidence, and it's directional, not a constant.</p><p><em>What it does establish is the shape: the window opens when the subject registers they've been seen, and closes when they commit. Everything else is accounting.</em></p><h2 id="the-surveillance-intervention-latency-budget-stage-by-stage">The Surveillance Intervention Latency Budget, Stage by Stage</h2><p>Here is the full path from an event happening to a subject hearing a voice — and back, because the loop only closes when the operator sees the reaction.</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    border: 1px solid rgba(128, 128, 128, 0.4);
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 10px 16px;
    color: inherit;
    background: transparent;
    vertical-align: top;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18);
    font-weight: 700;
  }
</style>
<table class="rate-table">
  <colgroup><col width="200"><col width="293"><col width="133"/></col></col></colgroup>
  <thead>
    <tr>
      <th>Stage</th>
      <th>Typical cost</th>
      <th>Who controls it</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Camera encode and packetise</td>
      <td>Deployment-specific; small next to what follows</td>
      <td>Camera config</td>
    </tr>
    <tr>
      <td>NVR or relay hop</td>
      <td>A full store-and-forward step, if the recorder serves your live view</td>
      <td>You</td>
    </tr>
    <tr>
      <td>Transport to the operator</td>
      <td>Sub-second on WebRTC; ~10s on 2-second HLS segments, up to 30s on longer ones</td>
      <td>You</td>
    </tr>
    <tr>
      <td>Keyframe wait on expand</td>
      <td>0–4s, set by the camera's IDR interval</td>
      <td>You</td>
    </tr>
    <tr>
      <td>Client decode and buffer</td>
      <td>A few hundred milliseconds</td>
      <td>Partly</td>
    </tr>
    <tr>
      <td>Operator detection</td>
      <td>The dominant risk: 55% missed a task-relevant target that was on screen for 9 seconds</td>
      <td>Nobody</td>
    </tr>
    <tr>
      <td>Operator decision</td>
      <td>~150–500ms, rising with the number of alternatives on screen</td>
      <td>Nobody</td>
    </tr>
    <tr>
      <td>Key-up and audio encode</td>
      <td>G.711 µ-law; deployment-specific</td>
      <td>Partly</td>
    </tr>
    <tr>
      <td>Audio delivery to the speaker</td>
      <td>No specified bound — see below</td>
      <td>Partly</td>
    </tr>
    <tr>
      <td>Return video: the loop closes</td>
      <td>The transport cost again, in full</td>
      <td>You</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p/><p>The two rows marked <strong>Nobody</strong> are the ones that decide the outcome, and neither is a latency problem. In a <a href="https://journals.plos.org/plosone/article?id=10.1371%2Fjournal.pone.0086157&ref=samvyo.com"><u>PLOS ONE study of CCTV monitoring</u></a>, 66% of participants failed to detect an unexpected event at all, and 80% failed to report it in real time. Even when the target was relevant to the task they'd been given, 55% missed it — on a single screen, in good conditions, with the target visible for nine full seconds.</p><p>The finding that matters for staffing: experience made no difference. Eighty-four military personnel with real CCTV duty — up to nineteen years of it — performed no better than untrained civilians. Detection failure isn't a training gap you can close.</p><p>The decision stage is better behaved and much smaller. Choice reaction time follows <a href="https://web.ics.purdue.edu/~dws/pubs/ProctorSchneider_2018_QJEP.pdf?ref=samvyo.com"><u>Hick's law</u></a> — it grows with the log of the number of alternatives, costing roughly 150 to 500 milliseconds as you go from two options to eight. Real, but sub-second.</p><p>Put those together and the argument inverts the usual one. “Humans are slow” is wrong — the human decision costs milliseconds. The human detection stage is the expensive one, it's unbounded, and you cannot buy it back. Which is exactly why you cannot afford to spend the budget on transport: it's the only part of the loop you actually control.</p><p><em>And one leg of that loop runs on infrastructure most teams never audit at all.</em></p><h2 id="the-audio-path-is-not-the-video-path">The Audio Path Is Not the Video Path</h2><p>Talk-down audio doesn't travel back the way the video came. On most deployments it goes over the <strong>ONVIF audio backchannel</strong> — defined in <a href="https://www.onvif.org/wp-content/uploads/2018/09/ONVIF_Profile_T_Specification_v1-0.pdf?ref=samvyo.com"><u>Profile T</u></a>, section 8.12 — which opens a back-channel connection on the existing RTSP session and streams audio to the camera or an attached speaker. G.711 µ-law is mandatory for devices that support audio output; AAC is conditional.</p><p>Two things about that spec are worth knowing before you design a response loop on top of it.</p><ul><li><strong>The backchannel is conditional, not mandatory. </strong>A camera can be fully Profile T conformant and have no audio output at all. Conformance to the profile is not a guarantee you can talk through it.</li><li><strong>The spec sets no timing, buffering or latency requirement whatsoever. </strong>There is no bound to hold a vendor to, and no conformance test that would fail a camera for taking two seconds to start playing. Whatever your audio path costs, you will have to measure it — nobody has specified it for you.</li></ul><p>There's also no return audio. The operator hears nothing back from site, which means the only confirmation that a talk-down landed is watching the subject react. The return video isn't a nice-to-have in the loop; it's the entire feedback channel.</p><p><em>Which puts the weight back on the live path — and on the one design decision that quietly spends the whole budget.</em></p><h2 id="where-surveillance-intervention-latency-actually-gets-burned">Where Surveillance Intervention Latency Actually Gets Burned</h2><p>The villain is segmented delivery, and the important part is that it isn't an implementation failure. It's the design. The HLS specification requires a client to begin playback <strong>three segments back from the live edge</strong>, so the buffer is a function of segment length: with six-second segments that's an <a href="https://aws.amazon.com/blogs/media/alhls-apple-low-latency-http-live-streaming-explained/?ref=samvyo.com"><u>eighteen-second forward buffer</u></a> before anything else is counted. Push segments down to two seconds — about the practical floor — and you still land near ten seconds; <a href="https://www.mux.com/blog/the-community-gave-us-low-latency-live-streaming-then-apple-took-it-away?ref=samvyo.com"><u>longer segments run to thirty</u></a>.</p><p>A correctly configured HLS deployment will therefore blow an intervention budget every single time, while reporting perfect health. Nothing dropped, nothing buffered late, no alert raised. It is doing exactly what it was built to do — which is deliver video reliably, not quickly.</p><p>Stacked on top of that is the cost of the click itself. Expanding a camera means switching from the grid substream to the main stream and waiting for the next keyframe before the decoder can draw anything — the mechanism, and how to measure it, is the subject of <strong><em>The Blind Five Seconds</em></strong>. For intervention it's worse than for viewing, because the operator expands the tile at exactly the moment the window opens.</p><p><em>All of which is fixable, and none of it by accident.</em></p><h2 id="designing-to-the-budget">Designing to the Budget</h2><p>Five decisions, in the order they pay off:</p><ul><li><strong>Put any camera with an intervention path on sub-second transport. </strong>WebRTC for anything an operator can act on; keep segmented delivery for archive review and low-priority walls — and check <a href="https://samvyo.com/blog/what-sub-80ms-video-latency-actually-means-and-why-most-real-time-isnt?ref=samvyo.com">what a vendor's “sub-second” number actually measures</a>.</li><li><strong>Keep alert-linked cameras warm. </strong>If a camera can raise an event that triggers a talk-down, its high-quality stream should already be flowing or upgradeable in place — never a cold subscribe at the worst moment.</li><li><strong>Force keyframes on demand. </strong>A receiver can request one (PLI/FIR) instead of waiting out the interval, and a media server can serve a cached keyframe the instant a client subscribes.</li><li><strong>Pre-arm the audio channel. </strong>Establish the backchannel when the event fires, not when the operator presses the key. Since the spec bounds nothing, measure your own path and treat the number as a requirement.</li><li><strong>Carry the confirmation view on the same low-latency path. </strong>The return leg is half the loop. Optimising the outbound view and leaving the reaction on a slow path fixes nothing.</li></ul><p>And measure one number, end to end: <strong>event to voice</strong> — from the moment something happens on site to the moment it is audible there. Then measure the return: how long until the operator can see the reaction. Neither appears on any dashboard you already own.</p><p><em>Which turns the last question into a sourcing one.</em></p><h2 id="build-buy-or-deploy">Build, Buy, or Deploy</h2><ul><li><strong>Build on open source. </strong>Media servers like go2rtc and MediaMTX handle RTSP ingest, H.264 passthrough and WebRTC fan-out, with the ONVIF backchannel bridged by you. Maximum control of both legs of the loop, and you own the measurement. Right when live video is core to the product and you have the team to run a media pipeline.</li><li><strong>Use a managed cloud relay. </strong>Fastest route to a working live view, nothing to operate — but your feeds route through a third party, you pay per stream, and the audio return path is usually yours to solve anyway. Right when speed matters more than owning the path.</li><li><strong>Deploy a commercial platform. </strong>A full media stack — ingest, low-latency fan-out, recording — run on-premise or as a managed cloud deployment under a flat license. Samvyo is one such option: it's based on SFU architecture, delivers the live and return legs at sub-second latency, and keeps the media path, TURN and recording under your control while remaining resilient by design. It ships the same embeddable SDKs a CPaaS gives you, plus on-prem deployment and white-label depth. Where it doesn't fit: a site with no intervention path at all, where the job is evidence and reactive infrastructure is enough.</li></ul><p><em>Three routes, one axis — how much of the loop you want to own.</em></p><h2 id="the-bottom-line">The Bottom Line</h2><p>Intervention isn't a stream, it's a loop, and the loop charges you the video latency twice — once to see the event, once to see whether your voice changed it. The evidence says that voice is worth engineering for: roughly half of offenders abandon an incident in progress once they know they've been detected. But the two stages that dominate the budget are the two you can't fix, because detection failure is a property of human attention that experience doesn't cure. Transport is the part you control. Spend ten seconds of it on a segment buffer and the talk-down becomes theater — correct, well-delivered, and addressed to an empty frame.</p><h2 id="whats-next">What's Next?</h2><p>Want the mechanism behind the click-to-fullscreen delay in the table above? <a href="https://samvyo.com/blog/the-blind-five-seconds-what-live-view-latency-costs-you-on-a-video-wall?ref=samvyo.com" rel="noreferrer"><strong><em>The Blind Five Seconds</em></strong></a> breaks down what happens between the click and the first sharp frame, and how to measure it.</p><p>For why this loop exists at all — and which sites should skip it — <a href="https://samvyo.com/blog/proactive-vs-reactive-surveillance-what-proactive-actually-means-and-whos-really-doing-it?ref=samvyo.com" rel="noreferrer"><strong><em>Proactive vs Reactive Surveillance</em></strong></a> covers the response model the latency budget serves.</p><p>And the live path underneath all of it starts with <a href="https://samvyo.com/blog/live-video-in-surveillance-why-rtsp-cameras-still-cant-talk-to-web-browsers-in-2026?ref=samvyo.com" rel="noreferrer"><strong><em>getting RTSP cameras into a browser</em></strong></a>, which is where the transport decision actually gets made.</p><h2 id="frequently-asked-questions">Frequently Asked Questions</h2><h3 id="what-is-surveillance-intervention-latency">What is surveillance intervention latency?</h3><p>It's the total time for a response loop to close: event to operator's eyes, decision, voice out to site, and the return video showing whether the subject reacted. It's larger than video latency because the video leg is traversed twice — once to observe the event, once to confirm the intervention worked.</p><h3 id="how-much-latency-can-a-talk-down-tolerate">How much latency can a talk-down tolerate?</h3><p>Less than most systems deliver, because the budget is spent twice. There's no published threshold, but the practical test is whether the operator can describe what a subject is doing while they're still doing it. At eight to ten seconds of one-way delay, the decision cycle is roughly twenty seconds wide and the warning lands after the moment it was meant for.</p><h3 id="why-does-talk-down-fail-over-the-internet">Why does talk-down fail over the internet?</h3><p>Usually because the live view runs on segmented delivery. The HLS specification requires playback to start three segments behind the live edge, so six-second segments alone produce an eighteen-second buffer. The system reports perfect health while making intervention impossible — nothing is dropped, it's just late by design.</p><h3 id="how-is-talk-down-audio-sent-to-a-camera-or-speaker">How is talk-down audio sent to a camera or speaker?</h3><p>Most commonly over the ONVIF audio backchannel defined in Profile T, which opens a back-channel on the existing RTSP session, with G.711 µ-law mandatory for devices that support audio output. Two catches: the backchannel is conditional rather than mandatory, so a conformant camera may not have it, and the spec sets no latency requirement at all.</p><h3 id="is-webrtc-fast-enough-for-live-intervention">Is WebRTC fast enough for live intervention?</h3><p>Yes — it's the transport built for it, targeting sub-second glass-to-glass on both the outbound and return legs, with on-demand keyframe requests to avoid the wait on expand. Platforms built on it can hold the loop inside a second: Samvyo is based on SFU architecture and delivers both legs at sub-second latency, with the media path, TURN and recording under your control.</p><h3 id="how-do-i-measure-event-to-voice-time">How do I measure event-to-voice time?</h3><p>Trigger a known event on site, and time from that moment until the audio is audible there. Run it several times, because where you land relative to the keyframe interval changes the result. Then measure the return leg separately — how long until the operator sees the reaction — and add them. That sum is your real intervention budget, and it's usually two to three times what anyone expects.</p><h3 id="can-one-operator-run-proactive-monitoring-across-many-cameras">Can one operator run proactive monitoring across many cameras?</h3><p>Only with classification filtering the feed. Research on CCTV monitoring found 55% of operators missed a task-relevant target that was on screen for nine seconds, and experienced operators did no better than untrained ones. Detection failure is what limits the ratio, not latency — but latency is what decides whether a detection is still actionable once a human confirms it.</p>]]></content:encoded></item><item><title><![CDATA[The Operator-to-Camera Ratio That Decides Whether Proactive Monitoring Pays]]></title><description><![CDATA[In a study of 73 operators, detection ran around 50% and only 12% caught more than three-quarters of targets. That ceiling, divided into the cost of a round-the-clock seat, is the operator to camera ratio — the number that decides whether proactive monitoring is a business or a subsidy.]]></description><link>https://www.samvyo.com/blog/the-operator-to-camera-ratio-that-decides-whether-proactive-monitoring-pays</link><guid isPermaLink="false">6aa2d4ac8b45c3f0cd63a600</guid><category><![CDATA[Proactive Surveillance]]></category><category><![CDATA[Control Room]]></category><category><![CDATA[cost-benefit analysis]]></category><category><![CDATA[video surveillance]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Fri, 11 Sep 2026 11:03:18 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-11--2026--04_09_13-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-11--2026--04_09_13-PM.png" alt="The Operator-to-Camera Ratio That Decides Whether Proactive Monitoring Pays"/><p><em>A staffed seat costs about $255,000 a year to run around the clock. How many cameras it covers is the operator to camera ratio — and it decides whether proactive monitoring is a business or a subsidy.</em></p><p>Researchers put 73 people — 42 of them full-time CCTV operators — in front of 90 minutes of processing-plant footage and asked them to catch four kinds of target behaviour. <a href="https://www.academia.edu/20740106/Work_exposure_and_vigilance_decrements_in_closed_circuit_television_surveillance?ref=samvyo.com"><u>They caught about half</u></a>. Only 12% of operators detected more than three-quarters of the targets.</p><p>That is the ceiling every proactive monitoring business is built on top of, and it sets up the only number in the model that matters: the <strong>operator to camera ratio</strong>. How many cameras one person can meaningfully cover determines your cost per camera, and cost per camera determines whether you have a product or an expensive favour.</p><p><em>Start with the seat, because the seat is what you're actually buying.</em></p><h2 id="why-the-ratio-is-the-only-number-that-matters">Why the Ratio Is the Only Number That Matters</h2><p>A monitoring centre's cost is not cameras, storage or bandwidth. It's people watching screens, and the arithmetic of covering a screen continuously is unforgiving.</p><p>A week has 168 hours. A full-time employee works 40. So a single seat staffed around the clock needs 4.2 full-time employees before you account for leave, training, sick cover or breaks — that floor is arithmetic, not an estimate, and real rosters run higher.</p><p>Price that floor. US Bureau of Labor Statistics data for May 2025 puts the mean annual wage for <a href="https://www.bls.gov/news.release/ocwage.t01.htm?ref=samvyo.com"><u>security guards and surveillance officers</u></a> at $42,490. Wages are only part of employment cost: the BLS <a href="https://www.bls.gov/news.release/ecec.nr0.htm?ref=samvyo.com"><u>Employer Costs for Employee Compensation</u></a> release puts benefits at 30.1% of total compensation in private industry, so the fully loaded figure is roughly $60,800 per employee per year. Multiply by 4.2 and one continuously staffed seat costs about $255,000 a year — around $21,300 a month.</p><p>That monthly number is the numerator. The ratio is the divisor. Everything else in a proactive monitoring P&amp;L is rounding.</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    border: 1px solid rgba(128, 128, 128, 0.4);
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 10px 16px;
    color: inherit;
    background: transparent;
    vertical-align: top;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18);
    font-weight: 700;
  }
</style>
<table class="rate-table">
  <colgroup><col width="240"><col width="193"><col width="193"/></col></col></colgroup>
  <thead>
    <tr>
      <th>Cameras per operator</th>
      <th>Cost per camera / month</th>
      <th>Reality check</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>10</td>
      <td>$2,130</td>
      <td>More than the camera, the install and the bandwidth combined</td>
    </tr>
    <tr>
      <td>25</td>
      <td>$851</td>
      <td>Still above most full VSaaS subscriptions</td>
    </tr>
    <tr>
      <td>50</td>
      <td>$426</td>
      <td>Viable only at a premium remote-guarding price point</td>
    </tr>
    <tr>
      <td>100</td>
      <td>$213</td>
      <td>Where the model starts to breathe</td>
    </tr>
    <tr>
      <td>250</td>
      <td>$85</td>
      <td>Competitive with mid-tier managed video</td>
    </tr>
    <tr>
      <td>500</td>
      <td>$43</td>
      <td>Only reachable when the human never searches</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p/><p>Swap in your own wage and roster assumptions — the inputs are all public and the arithmetic is three lines. The shape won't change. Below roughly fifty cameras per operator, you are charging more per camera than the hardware costs, and the only customers who accept that are the ones with something genuinely expensive to lose. Above a couple of hundred, the model looks like software.</p><p><em>So the whole business hangs on a number the research says is stubbornly small.</em></p><h2 id="what-a-human-can-actually-cover">What a Human Can Actually Cover</h2><p>Two studies define the ceiling, and they appear to disagree until you read what each one measured.</p><p>The first is the 2015 <em>Applied Ergonomics</em> study above — Donald, Donald and Thatcher. Detection ran around 50%, false alarms were high (a mean of 15.76 in the first stage), and performance split sharply by background. Novices and generalists declined significantly after the first thirty minutes. Specialists — operators whose regular work matched the task — held for a full hour and then got better. Experience mattered a great deal.</p><p>The second says the opposite. In a <a href="https://journals.plos.org/plosone/article?id=10.1371%2Fjournal.pone.0086157&ref=samvyo.com"><u>PLOS ONE study</u></a>, 66% of participants failed to notice an unexpected event on a single screen in good conditions, and 84 military personnel with up to nineteen years of real CCTV duty performed no better than undergraduates.</p><p>Both are right, and the reconciliation is the most useful thing in this article: experience helps you find what you are looking for. It does nothing for noticing what you weren't. Donald tested trained detection of defined target behaviours — a search task, and specialists win search tasks. PLOS tested an unexpected event nobody was briefed on — and there, expertise bought nothing at all.</p><p>Which means the ratio you can safely run depends entirely on which job you are asking the operator to do. If the system tells them what to look at, experience compounds and the ratio can climb. If they are scanning a wall hoping something catches their eye, you are paying for the mode where twenty years of experience measures the same as none.</p><p><em>At which point most operations reach for the wrong lever.</em></p><h2 id="the-video-wall-is-not-the-lever">The Video Wall Is Not the Lever</h2><p>There is real research on how to arrange a multiplex display. A <a href="https://link.springer.com/article/10.1186/s41235-021-00277-2?ref=samvyo.com"><u>2021 study</u></a> tested 27 scenes in a 9×3 grid and found that grouping them by semantic category and separating them with borders beat a random, borderless layout. The improvement was 3,416 milliseconds versus 3,550.</p><p>A hundred and thirty-four milliseconds. Against a 50% detection rate and a thirty-minute attention cliff, wall layout is a rounding error. It's worth doing — it's nearly free — but no arrangement of tiles turns fifty cameras per operator into two hundred. Neither does a bigger monitor, a curved wall, or better chairs.</p><p><em>The lever is changing the job.</em></p><h2 id="what-actually-moves-the-operator-to-camera-ratio">What Actually Moves the Operator-to-Camera Ratio</h2><p>The ratio moves when the operator stops searching and starts adjudicating. Instead of scanning a hundred tiles for something anomalous, they are handed a queue of candidate events and asked a closed question: is this real, and what do I do about it? That's the task type experience is good at, and it removes the failure mode expertise can't fix.</p><p>Arithmetically it's straightforward. If classification surfaces four events an operator-hour and each takes two minutes to adjudicate, one operator absorbs the alert volume of a very large camera estate — and camera count stops being the constraint. The constraint becomes alerts per hour, which is a function of your site, your scene, and your detector's precision.</p><p>Here is the part vendors skip. There is no independent public benchmark for video-analytics false-positive rates in operational conditions. NIST evaluates face and object detection under controlled protocols, and none of that translates into how many times a specific camera pointed at a specific fence line in specific weather will fire on a plastic bag. Every precision figure in a sales deck is self-reported, measured on data the vendor chose.</p><p>So the ratio is not a specification you can buy. It's a number you measure on your own site, and any proposal that quotes you a ratio before it has seen your cameras is quoting you a hope.</p><p><em>Which makes measuring it the actual first task.</em></p><h2 id="how-to-measure-your-own-ratio">How to Measure Your Own Ratio</h2><p>Run a week of real footage through the detector in shadow mode — alerting to a log, not to an operator — and collect three numbers:</p><ul><li><strong>Alerts per camera per hour. </strong>Broken out by camera, because in almost every estate a handful of cameras generate most of the noise, and fixing those individually moves the ratio more than any platform change.</li><li><strong>Adjudication time. </strong>How long an operator actually takes to open an alert, watch enough to decide, and either dismiss it or act. Time it; don't estimate it. This is where a slow live path silently taxes the ratio.</li><li><strong>Precision on your site. </strong>Of the alerts raised, how many were genuinely worth a human's attention. Not the vendor's number — yours, on your fence line, in your weather.</li></ul><p>Alerts per hour divided into an operator's available adjudication time gives you the real ratio. Then hold back a fraction of capacity, because alerts are not evenly distributed and the ratio that works at 3 a.m. will fail at shift change.</p><p><em>And one input to that calculation is infrastructure rather than staffing.</em></p><h2 id="what-the-ratio-costs-you-in-infrastructure">What the Ratio Costs You in Infrastructure</h2><p>Raising the ratio moves the bottleneck rather than removing it. More cameras per seat means more simultaneous streams reaching one workstation, and the ceiling there isn't bandwidth — <a href="https://samvyo.com/blog/why-watching-500-cameras-is-a-decode-problem-not-a-bandwidth-problem?ref=samvyo.com"><u>watching 500 cameras is a decode problem</u></a>. A single machine that can carry fifty low-resolution tiles will not carry three hundred.</p><p>Adjudication time is the other infrastructure cost hiding in a staffing number. If opening an alert costs the operator three seconds of waiting for a clean frame, and they adjudicate two hundred alerts a shift, that's ten minutes of paid time spent watching a spinner — and it degrades the decision itself, since <strong><em>the delay lands exactly when they're deciding</em></strong>. The live path is a line item in the ratio, not a technical detail underneath it.</p><p><em>Which puts the sourcing question in economic terms rather than architectural ones.</em></p><h2 id="build-buy-or-deploy">Build, Buy, or Deploy</h2><ul><li><strong>Build on open source. </strong>go2rtc or MediaMTX for ingest and low-latency delivery, with your own classification layer on top. You own the cost curve completely, which matters when cost per camera is the business. Right when monitoring is the product and you have the team.</li><li><strong>Use a managed cloud relay. </strong>Fastest to operators watching feeds — but per-stream pricing scales with exactly the number you are trying to grow. A relay that's cheap at 50 cameras per operator is a structural problem at 500.</li></ul><p>Whichever route, the cameras are rarely in one building. Scaling the ratio across a customer base means <a href="https://samvyo.com/blog/multi-site-video-surveillance-architecture-why-connecting-50-sites-to-one-soc-isnt-a-bandwidth-problem?ref=samvyo.com"><u>connecting many sites to one operations centre</u></a>, which is a topology problem the per-seat arithmetic above quietly assumes you have already solved.</p><ul><li><strong>Deploy a commercial platform. </strong>A full media stack under a flat license, run on-premise or as a managed cloud deployment — which changes the shape of the curve, since flat licensing means raising the ratio improves margin instead of raising the bill. Samvyo is one such option: based on SFU architecture, sub-second live delivery for adjudication, with the media path, TURN and recording under your control. Where it doesn't fit: a small estate, or an operation that only reviews footage after the fact.</li></ul><p><em>Three routes, one question — does your cost per camera fall as the ratio rises, or follow it up?</em></p><h2 id="the-bottom-line">The Bottom Line</h2><p>Proactive monitoring is an arithmetic problem wearing a technology costume. A round-the-clock seat costs roughly $255,000 a year, so the operator-to-camera ratio sets your cost per camera and therefore your entire business model. The research says a human scanning a wall detects around half of what matters and slides after thirty minutes, and no video wall layout fixes that — 134 milliseconds is what the best layout buys. What moves the ratio is changing the operator's job from searching to adjudicating, because experience helps enormously with the second and not at all with the first. Just don't buy the ratio from a slide. Measure it on your own cameras, because nobody else's fence line is yours.</p><h2 id="whats-next">What's Next?</h2><p>For the response model this economics sits inside — and how to tell genuine proactive from a faster alert — <strong><em>Proactive vs Reactive Surveillance</em></strong> draws the line.</p><p>For what happens after an operator decides to act, and how much delay the response loop can absorb, see <strong><em>Talk-Down at Ten Seconds Is Theater</em></strong>.</p><p>And the live path that all of it runs on starts with <a href="https://samvyo.com/blog/live-video-in-surveillance-why-rtsp-cameras-still-cant-talk-to-web-browsers-in-2026?ref=samvyo.com"><u>getting RTSP cameras into a browser</u></a>.</p><h2 id="frequently-asked-questions">Frequently Asked Questions</h2><h3 id="what-is-a-good-operator-to-camera-ratio-for-a-monitoring-centre">What is a good operator to camera ratio for a monitoring centre?</h3><p>There isn't a universal figure, because it depends on alerts per hour rather than camera count. What the economics say is that below roughly fifty cameras per operator you are charging more per camera than the hardware costs, and the model only works with AI classification filtering the feed so the operator adjudicates events instead of scanning tiles.</p><h3 id="how-many-cameras-can-one-person-actually-watch">How many cameras can one person actually watch?</h3><p>Far fewer than most staffing plans assume. In a study of 73 people including 42 full-time CCTV operators, detection of target behaviours ran around 50%, only 12% caught more than three-quarters, and novices and generalists declined significantly after the first thirty minutes. Scanning is the failure mode; a filtered alert queue is not.</p><h3 id="does-operator-experience-improve-detection">Does operator experience improve detection?</h3><p>For expected targets, substantially — specialists in the Applied Ergonomics study held performance for an hour and then improved. For unexpected events, not at all: a PLOS ONE study found personnel with up to nineteen years of CCTV duty performed no better than untrained undergraduates. Experience helps you find what you're looking for, not notice what you weren't.</p><h3 id="how-much-does-a-247-monitoring-seat-cost">How much does a 24/7 monitoring seat cost?</h3><p>Around $255,000 a year in the US on public figures. A week is 168 hours and a full-time role is 40, so continuous coverage needs at least 4.2 employees; BLS puts the mean security-officer wage at $42,490 and benefits at 30.1% of total compensation, giving roughly $60,800 fully loaded per person. Real rosters run higher once leave and training are covered.</p><h3 id="does-a-better-video-wall-layout-improve-detection">Does a better video wall layout improve detection?</h3><p>Marginally. Research testing 27 scenes found that semantic grouping plus borders beat a random layout by about 134 milliseconds. Worth doing because it's nearly free, but it doesn't change the ratio — the detection ceiling is an attention problem, not a display problem.</p><h3 id="what-false-positive-rate-should-i-expect-from-video-analytics">What false-positive rate should I expect from video analytics?</h3><p>Whatever your own site produces, which nobody can tell you in advance. There is no independent public benchmark for analytics false-positive rates under operational conditions, and vendor precision figures are self-reported on data they selected. Run the detector in shadow mode against a week of your own footage before committing to a ratio.</p><h3 id="what-infrastructure-does-a-high-operator-to-camera-ratio-require">What infrastructure does a high operator to camera ratio require?</h3><p>More concurrent streams per workstation, which makes decode rather than bandwidth the ceiling, and a live path fast enough that adjudication isn't spent waiting for frames. Samvyo is based on SFU architecture and delivers sub-second live view with flat licensing, so raising the ratio improves margin rather than increasing a per-stream bill.</p>]]></content:encoded></item><item><title><![CDATA[Yard and Dock Video: Watching the Loading Bay from Head Office in Real Time]]></title><description><![CDATA[You can locate a trailer to the metre and still not know what happened at the dock door. The questions head office can't answer are operational, not criminal — and nearly all of them are timestamp questions. Here's what warehouse yard video has to get right to settle them.]]></description><link>https://www.samvyo.com/blog/yard-and-dock-video-watching-the-loading-bay-from-head-office-in-real-time</link><guid isPermaLink="false">6aa2dd748b45c3f0cd63a648</guid><category><![CDATA[Logistics]]></category><category><![CDATA[video surveillance]]></category><category><![CDATA[Warehouse Monitoring]]></category><category><![CDATA[Multi-site]]></category><category><![CDATA[video recording infrastructure]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Fri, 11 Sep 2026 11:03:13 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-11--2026--04_08_01-PM.png" medium="image"/><content:encoded><![CDATA[<blockquote><em>You can locate any trailer in the fleet to the metre and still not know what happened at the dock door. Warehouse yard video closes that gap — but it earns its keep on the daily dispute, not the rare theft.</em></blockquote><img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-11--2026--04_08_01-PM.png" alt="Yard and Dock Video: Watching the Loading Bay from Head Office in Real Time"/><p>Telematics ends at the gate. Head office can tell you where every vehicle is, how fast it went, how long the engine idled and when the door was opened — and then the trailer reverses onto a dock face six hundred kilometres away and the data goes quiet. What happened in the next ninety minutes exists only as a signature, a timestamp typed by somebody, and a phone call three days later when the numbers don't agree.</p><p>That gap is what <strong>warehouse yard video</strong> is for. And the reason most yard camera projects underdeliver is that they get bought as security systems, when the questions head office actually cannot answer are almost entirely operational.</p><p><em>It's worth listing them, because the list decides the whole design.</em></p><h2 id="the-blind-spot-is-operational-not-criminal">The Blind Spot Is Operational, Not Criminal</h2><p>Theft at a yard is real and it is expensive. It is also rare, in the sense that any given site goes a long time between incidents. Meanwhile the following happen constantly: a load arrives short and nobody can say whether it left that way; a customer claims damage that the warehouse insists happened in transit; a carrier bills for detention the site says it never caused; a driver's arrival time and the gate log disagree by forty minutes; a trailer leaves with a seal nobody photographed.</p><p>Every one of those is a dispute, every dispute has a cost, and every one of them is decided by whoever can produce a credible account of what happened and when. Today that account is usually a person's memory and a handwritten line in a book.</p><p>So the honest business case for yard video is not that it will catch a thief. It is that it converts a category of recurring, unwinnable arguments into questions with answers. Buy it for the thing that happens every day, and the rare event is covered as a side effect. Buy it the other way around and you will build a system optimised for an event that hasn't happened yet.</p><p><em>Which sets a requirement most yard installations quietly fail.</em></p><h2 id="every-one-of-those-questions-is-a-timestamp-question">Every One of Those Questions Is a Timestamp Question</h2><p>Look at what actually settles a dock dispute. Not an image — an image with a time on it that the other party cannot dismiss. “The seal was intact at 14:07 and the trailer left at 14:12” only wins the argument if 14:07 means something.</p><p>This is where yard systems tend to be weakest, because a camera's clock is nobody's job. Left unsynchronised, a camera free-runs and its error accumulates from whenever it was last set, silently, with nothing reporting the drift. And conformance doesn't rescue you: the ONVIF Core Specification defines the interfaces for setting device time and NTP configuration but states no accuracy requirement for the device clock at all — the mechanics of which are covered in <a href="https://samvyo.com/blog/multi-camera-synchronization-why-your-four-angles-drift-out-of-alignment?ref=samvyo.com" rel="noreferrer"><strong><em>the multi-camera synchronisation piece</em></strong>.</a></p><p>The second failure is subtler and specific to reconstructing a sequence. A yard dispute usually spans cameras — gate, then yard, then dock face — and the RTP timestamps those streams carry cannot be compared with each other, by design. So if your recorder stamps frames when they arrive rather than when they were captured, you have baked every network delay in the yard into your evidence, permanently, and a forty-second disagreement between the gate camera and the dock camera is enough to lose an argument about whether a driver was made to wait.</p><p>Fix it cheaply: one time source on the local network, every camera pointed at it, capture timestamps carried through to storage rather than receipt times, and a scheduled check that alerts when any camera's reported time drifts. None of that is expensive. All of it is the difference between footage and evidence.</p><p><em>With the clocks honest, the next question is how much of this needs to be live at all.</em></p><h2 id="which-questions-actually-need-real-time">Which Questions Actually Need Real Time</h2><p>Real-time is the headline on most yard video pitches, and it deserves a harder look, because the majority of the value above is archival.</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    border: 1px solid rgba(128, 128, 128, 0.4);
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 10px 16px;
    color: inherit;
    background: transparent;
    vertical-align: top;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18);
    font-weight: 700;
  }
</style>
<table class="rate-table">
  <colgroup><col width="260"><col width="173"><col width="193"/></col></col></colgroup>
  <thead>
    <tr>
      <th>The question head office asks</th>
      <th>Needs live?</th>
      <th>What it actually needs</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Was the trailer sealed when it left?</td>
      <td>No</td>
      <td>Archive with a trustworthy timestamp</td>
    </tr>
    <tr>
      <td>Did the driver arrive when the log says?</td>
      <td>No</td>
      <td>Gate footage the clock can be trusted on</td>
    </tr>
    <tr>
      <td>Was that pallet damaged on our floor?</td>
      <td>No</td>
      <td>Dock-face coverage, retained past the claim window</td>
    </tr>
    <tr>
      <td>Why did that truck wait two hours?</td>
      <td>No</td>
      <td>A reconstructable sequence across cameras</td>
    </tr>
    <tr>
      <td>Is bay 4 free right now?</td>
      <td>Yes</td>
      <td>Low-latency view, low resolution is fine</td>
    </tr>
    <tr>
      <td>Is the driver at the gate now?</td>
      <td>Yes</td>
      <td>Live view plus a way to talk to them</td>
    </tr>
    <tr>
      <td>Is that manoeuvre unsafe, right now?</td>
      <td>Yes</td>
      <td>Live view someone is actually watching</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p/><p>The split is roughly four to three in this list and heavily archival in practice, because the archival questions occur many times a day per site and the live ones occur occasionally. That is not an argument against live view — the live rows are genuine, and a yard controller who can see that bay 4 is empty stops making a driver wait for no reason. It is an argument against paying for a real-time architecture across every camera in the yard when a subset needs it.</p><p>The practical shape that follows: a low-resolution live view available on demand for the decision points, a full-quality continuous recording underneath everything, and the ability to pull either from head office without anyone driving to site.</p><p><em>Which is where the network reality of a yard asserts itself.</em></p><h2 id="what-%E2%80%9Cfrom-head-office%E2%80%9D-actually-costs">What “From Head Office” Actually Costs</h2><p>A distribution network is a multi-site problem before it is a camera problem. Each site has its own uplink, usually sized for ERP traffic and not for video, and the instinct to stream every camera back to a central office is the design that fails first — <a href="https://samvyo.com/blog/multi-site-video-surveillance-architecture-why-connecting-50-sites-to-one-soc-isnt-a-bandwidth-problem?ref=samvyo.com"><u>connecting many sites to one operations centre isn't a bandwidth problem</u></a>, it's a question of what gets relayed at the edge and what only moves when somebody asks for it.</p><p>Yards also punish infrastructure in ways an office building doesn't. Distances exceed comfortable copper runs, so you are into fibre or wireless links across open ground. Cameras sit outdoors through weather, at angles that face directly into low sun twice a day. Vehicles block sightlines that were clear at survey. And the site's own network is often flat, old, and administered by somebody whose main job is the WMS.</p><p>Nor will you be starting fresh. Nearly every yard already has cameras on a recorder that nobody outside the site can reach, and the useful move is usually to take a feed from what exists rather than replace it — which is a design decision in itself, covered in <a href="https://samvyo.com/blog/where-to-tap-the-stream-adding-live-browser-video-without-fighting-the-nvr?ref=samvyo.com"><u>where to tap the stream without fighting the NVR</u></a>.</p><p><em>All of which resolves into a handful of decisions worth making deliberately.</em></p><h2 id="designing-warehouse-yard-video-that-answers-questions">Designing Warehouse Yard Video That Answers Questions</h2><ul><li><strong>Cover decision points, not acreage. </strong>The gate, the seal, the dock face, the trailer parking rows. A camera watching empty tarmac generates storage; a camera watching the seal being applied settles claims. Site the cameras from the list of disputes you actually have.</li><li><strong>Give every camera the same clock, and check it. </strong>One time source on the local network, capture timestamps carried into storage, and an alert on drift. This is the cheapest thing in this article and the one that decides whether the footage is worth anything in an argument.</li><li><strong>Separate the live path from the archive path. </strong>Low-resolution live for the handful of now questions, full-quality continuous recording for everything else. Trying to serve both from one full-resolution stream is what makes yard video expensive.</li><li><strong>Retain past the claim cycle, not past the incident. </strong>Damage and detention disputes surface weeks after the event, so retention is set by your commercial terms rather than by a security policy — and the storage and governance side of that is its own problem, covered in <a href="https://samvyo.com/blog/video-recording-at-scale-architecture-storage-and-the-compliance-trap?ref=samvyo.com"><u>recording at scale and the compliance trap</u></a>.</li><li><strong>Give operations access, not just security. </strong>If the only people who can pull yard footage sit in a security function, the daily operational value never materialises. The yard controller, the claims team and the transport planner are the users who will justify the system.</li><li><strong>Add audio at the gate before you add cameras anywhere else. </strong>Most gate interactions are a question that needs answering — the ability to speak to a driver from a desk removes more delay per pound than another camera angle will.</li></ul><p><em>Which leaves the question of what to build it on.</em></p><h2 id="build-buy-or-deploy">Build, Buy, or Deploy</h2><ul><li><strong>Build on open source. </strong>Media servers like go2rtc or MediaMTX at each site handle RTSP ingest from the existing cameras and deliver low-latency video to a browser, with recording alongside. You own the per-site cost, which matters across a network of depots. Right when you have engineering and the estate is large enough to justify it.</li><li><strong>Use a managed cloud relay. </strong>Quick to get a head-office view working with nothing to run per site — but per-stream pricing across every camera in every yard is the curve that ends these projects, and continuous recording to a third party's cloud gets expensive faster than anyone models.</li><li><strong>Deploy a commercial platform. </strong>A full stack — per-site ingest, low-latency live view, recording and retention — run on-premise or as a managed cloud deployment under a flat license. Samvyo is one such option: based on SFU architecture, delivering live yard and dock views to a browser at sub-second latency, with the media path, TURN and recording under your control, which matters when the archive is what settles commercial disputes. The transport question underneath it is <a href="https://samvyo.com/blog/live-video-in-surveillance-why-rtsp-cameras-still-cant-talk-to-web-browsers-in-2026?ref=samvyo.com"><u>getting RTSP cameras into a browser at all</u></a>. Where it doesn't fit: a single site where somebody can walk to the dock and look.</li></ul><p><em>Three routes, one test — can head office answer the question without phoning the site?</em></p><h2 id="the-bottom-line">The Bottom Line</h2><p>Fleet telematics stops at the gate, and the ninety minutes on the other side of it is where loads go short, damage gets disputed and detention gets billed. Yard video closes that gap, but only if it's bought for the argument that happens daily rather than the theft that happens rarely — and only if the timestamps survive scrutiny, because a dock dispute is settled by a credible time, not by a picture. Give every camera one clock, store capture times rather than arrival times, cover the decision points instead of the tarmac, retain past the claim cycle rather than the incident, and put the footage in the hands of operations rather than only security. Do that and most of the value arrives without anyone watching a screen — which is the opposite of how yard video usually gets sold.</p><h2 id="whats-next">What's Next?</h2><p>The clock problem underneath every dispute in this article — why independent cameras drift and what actually fixes it — is the subject of <a href="https://samvyo.com/blog/multi-camera-synchronization-why-your-four-angles-drift-out-of-alignment?ref=samvyo.com" rel="noreferrer"><strong><em>the multi-camera synchronisation piece</em></strong>.</a></p><p>For the live half, and how much delay a response can absorb before it stops being real time, see <a href="https://samvyo.com/blog/talk-down-at-ten-seconds-is-theater-the-surveillance-intervention-latency-budget?ref=samvyo.com" rel="noreferrer"><strong><em>Talk-Down at Ten Seconds Is Theater</em></strong>.</a></p><p>And for whether the alerts a site generates can realistically be watched by anyone, <a href="https://samvyo.com/blog/the-operator-to-camera-ratio-that-decides-whether-proactive-monitoring-pays?ref=samvyo.com" rel="noreferrer"><strong><em>the operator-to-camera ratio</em></strong></a> does the arithmetic.</p><h2 id="frequently-asked-questions">Frequently Asked Questions</h2><h3 id="what-is-warehouse-yard-video-used-for">What is warehouse yard video used for?</h3><p>Mostly for settling operational disputes rather than catching theft: proving a trailer was sealed, establishing when a driver actually arrived, showing whether damage occurred on site, and reconstructing why a vehicle waited. Those happen daily, whereas theft at any given site is infrequent, so the archival value usually outweighs the live monitoring value.</p><h3 id="do-i-need-real-time-video-at-the-loading-dock">Do I need real-time video at the loading dock?</h3><p>For a subset of questions, yes — whether a bay is free, whether a driver is waiting at the gate, whether an unsafe manoeuvre is happening now. Most yard questions are answered from the archive afterwards. A sensible design gives you low-resolution live view on demand at the decision points, with continuous recording underneath everything.</p><h3 id="why-do-camera-timestamps-matter-so-much-in-a-yard">Why do camera timestamps matter so much in a yard?</h3><p>Because a dock dispute is won with a credible time, not just an image. Unsynchronised cameras free-run and accumulate error silently, and ONVIF conformance guarantees nothing here — the specification defines interfaces for setting device time but states no accuracy requirement for the clock. One shared time source and stored capture timestamps are what make footage usable as evidence.</p><h3 id="can-i-use-the-cameras-already-in-the-yard">Can I use the cameras already in the yard?</h3><p>Usually yes, and it's normally the right move. Most yards already have cameras feeding a recorder that nobody offsite can reach, so the work is taking a feed from the existing estate and delivering it to a browser rather than replacing hardware. Where you tap that stream is a design decision with real consequences for load and latency.</p><h3 id="how-do-i-get-yard-video-to-head-office-without-saturating-the-site-link">How do I get yard video to head office without saturating the site link?</h3><p>Don't stream everything centrally. Relay at the edge, keep full-quality recording on site, and move video to head office only when someone requests it or when a defined event fires. Site uplinks are sized for business systems, not continuous video, so central architecture is what decides whether the system scales across depots.</p><h3 id="how-long-should-yard-footage-be-retained">How long should yard footage be retained?</h3><p>Long enough to cover your commercial claim window, which is typically longer than a security retention policy would suggest. Damage and detention disputes often surface weeks later, so retention should be set from your contractual terms — with the storage cost and data-governance implications planned rather than discovered.</p><h3 id="what-infrastructure-does-multi-site-yard-video-need">What infrastructure does multi-site yard video need?</h3><p>Per-site ingest from existing cameras, edge relay so uplinks aren't saturated, browser-deliverable live view for the decision points, and retention that survives the claims cycle. Samvyo is based on SFU architecture and keeps the media path, TURN and recording under your control, which matters when the archive is what settles commercial disputes.</p>]]></content:encoded></item><item><title><![CDATA[Retail Loss Prevention in Real Time: From Reviewing Theft to Interrupting It]]></title><description><![CDATA[Retailers have never recorded more and shrink still rose to 1.6% of sales. Footage documents theft; it does not interrupt it. Here's what retail loss prevention video can realistically change in the aisle, what the numbers honestly support, and where cameras are the wrong tool entirely.]]></description><link>https://www.samvyo.com/blog/retail-loss-prevention-in-real-time-from-reviewing-theft-to-interrupting-it</link><guid isPermaLink="false">6aa2dc238b45c3f0cd63a63b</guid><category><![CDATA[Loss Prevention]]></category><category><![CDATA[Retail]]></category><category><![CDATA[Proactive Surveillance]]></category><category><![CDATA[video surveillance]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Fri, 11 Sep 2026 11:03:07 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-11--2026--03_58_20-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-11--2026--03_58_20-PM.png" alt="Retail Loss Prevention in Real Time: From Reviewing Theft to Interrupting It"/><p><em>Retail has never recorded more and shrink still went up. Retail loss prevention video only changes the number when it moves from documenting a loss to interrupting one — and that shift is narrower, and more honest, than most pitches admit.</em></p><p>Coverage went up. Resolution went up. Retention went up. And shrink went up with all of it — the National Retail Federation put it at <a href="https://nrf.com/research/national-retail-security-survey-2023?ref=samvyo.com"><u>1.6% of sales for FY2022, $112.1 billion</u></a>, against 1.4% the year before.</p><p>That is the uncomfortable starting point for any conversation about <strong>retail loss prevention video</strong>. A decade of investment in seeing more did not produce losing less, and the reason is structural rather than technical: a camera that records is an evidence device. Evidence is produced after a loss, and a loss that has already happened is not recoverable by knowing more about it.</p><p><em>Which means the useful question is narrow: what can video change while the event is still in progress?</em></p><h2 id="what-the-numbers-honestly-support">What the Numbers Honestly Support</h2><p>Before claiming anything, it's worth being straight about how soft this evidence base is — because the retail industry's own headline statistics have not held up well.</p><p>In December 2023 the NRF <a href="https://www.cnbc.com/2023/12/07/us-retail-lobbyists-retract-key-claim-on-organized-retail-crime-accounting-for-inventory-losses.html?ref=samvyo.com"><u>retracted its widely-quoted claim</u></a> that organised retail crime accounted for nearly half of shrink. The figure had been assembled by attaching a $45 billion estimate from Senate testimony to the federation's own shrink total, and it contradicted the federation's own survey, which attributed 37% of losses to external theft of every kind — not just organised groups. The NRF acknowledged the difficulty of assembling an accurate and agreed-upon dataset.</p><p>Take two things from that. First, treat every dramatic retail theft number — including any a vendor quotes at you — as contested until you see its derivation. Second, and more usefully: external theft is a minority of shrink. The rest is internal theft and process failure, and no camera in the aisle addresses a receiving error, a markdown that never got recorded, or a supplier discrepancy.</p><p>So the honest scope of real-time video is a slice of a minority. That is not an argument against it. It is an argument for sizing it correctly, and for being suspicious of anyone who presents cameras as a solution to shrink rather than to one component of it.</p><p><em>Within that slice, though, the timing question is everything.</em></p><h2 id="the-window-is-narrower-than-the-incident">The Window Is Narrower Than the Incident</h2><p>Retail theft is not a single moment. It's a sequence — selection, concealment, movement toward the exit, departure — and the value of an alert collapses as that sequence progresses, because the range of safe available responses collapses with it.</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    border: 1px solid rgba(128, 128, 128, 0.4);
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 10px 16px;
    color: inherit;
    background: transparent;
    vertical-align: top;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18);
    font-weight: 700;
  }
</style>
<table class="rate-table">
  <colgroup><col width="193"><col width="213"><col width="220"/></col></col></colgroup>
  <thead>
    <tr>
      <th>Moment</th>
      <th>What the system can do</th>
      <th>What it's worth</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Selection — item goes in a bag</td>
      <td>Raise an alert on a defined behaviour in a defined zone</td>
      <td>Highest. Nothing has been lost yet</td>
    </tr>
    <tr>
      <td>On the floor, pre-exit</td>
      <td>Send an associate to offer service nearby</td>
      <td>High, and safe — presence ends most attempts</td>
    </tr>
    <tr>
      <td>At the door</td>
      <td>Alert staff who are told not to intervene physically</td>
      <td>Low. Policy usually forbids the only action left</td>
    </tr>
    <tr>
      <td>After exit</td>
      <td>Produce footage for a report or a case file</td>
      <td>Evidentiary only. The loss already happened</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p/><p>The table is the whole argument. Almost every deployment concentrates its detection at the door, which is the point where the merchandise is already concealed, the subject is committed, and store policy almost universally forbids staff from physically intervening. An alert delivered there is a notification that a loss is leaving the building.</p><p>Move the same detection earlier and the response changes from confrontation to service. An associate who walks into the aisle and asks whether someone needs help finding a size is not accusing anybody, is not at risk, and has just removed the conditions the attempt depended on. That intervention is safe, deniable, lawful, and it happens before anything has been lost.</p><p><em>Which is a latency requirement disguised as a staffing decision.</em></p><h2 id="why-real-time-retail-loss-prevention-video-fails-in-practice">Why Real-Time Retail Loss Prevention Video Fails in Practice</h2><p>An alert about the health-and-beauty aisle that reaches someone ninety seconds later describes a place the subject has left. The response loop in retail is the same closed loop as in any intervention — observe, decide, act, see the result — and it is subject to the same budget covered in <a href="https://samvyo.com/blog/talk-down-at-ten-seconds-is-theater-the-surveillance-intervention-latency-budget?ref=samvyo.com" rel="noreferrer"><strong><em>the intervention latency piece</em></strong>.</a> Retail just spends it differently.</p><p>The differences matter. There is no control room. The person who has to act is a floor associate holding a handheld, doing three other jobs, and the alert competes with a customer standing in front of them. Verification usually happens on a phone screen in poor lighting. And there is rarely a second chance, because the subject is walking.</p><p>So the practical target is not sub-second glass-to-glass for its own sake — it's that from event to an associate looking at the clip on a handheld, the total is short enough that the aisle reference is still true. If your alert path routes video to a cloud, runs inference, sends a push notification and then streams a segmented clip to a phone, measure the whole chain end to end before promising anyone an interruption.</p><p><em>And then measure the thing that actually decides whether any of it gets used.</em></p><h2 id="the-alert-budget-nobody-sets">The Alert Budget Nobody Sets</h2><p>A monitoring centre has operators whose job is adjudicating alerts. A store does not. The person receiving retail alerts has a primary job that isn't security, which means the tolerable alert volume is dramatically lower than in a staffed operation — and the <strong><em>operator-to-camera ratio</em></strong> arithmetic lands harder here, because the denominator is somebody's spare attention rather than their salary.</p><p>Practically: an associate who receives six alerts in an hour and finds five of them worthless stops opening the seventh. Nobody logs that decision, no dashboard reports it, and the system continues generating alerts into a channel that has been quietly abandoned. The failure looks exactly like success right up until someone asks how many alerts led to an intervention.</p><p>Which sets a hard design constraint. Precision matters more than recall in retail, by a wide margin. A system that surfaces two high-confidence events a shift and gets acted on beats one that surfaces forty and gets muted, even though the second one detects more.</p><p><em>That constraint points at where to aim the cameras.</em></p><h2 id="where-real-time-actually-pays">Where Real-Time Actually Pays</h2><ul><li><strong>Self-checkout. </strong>The highest-yield zone in most stores, because the loss mechanism is procedural rather than furtive — non-scans, mis-scans, produce substitution — and it correlates directly with a data stream you already own. Video paired with POS exception data gives an alert with a receipt attached, which is both more accurate and easier to act on politely.</li><li><strong>High-value fixtures, at selection. </strong>A defined zone, a defined dwell threshold, and a service response. Detect the moment of selection, not the moment of exit.</li><li><strong>Back-of-house and receiving. </strong>Unglamorous, and it addresses internal theft and process failure — the majority of shrink that aisle cameras never touch. The intervention here is process correction, not interception.</li><li><strong>Repeat-subject recognition across visits, carefully. </strong>Genuinely useful for organised activity, and the area with the heaviest legal and reputational exposure. Biometric identification is regulated very differently across jurisdictions, so this is a legal decision before it is a technical one.</li></ul><p>Notice that two of the four are not about catching anybody. The biggest available wins in retail shrink are procedural, and a camera's role there is to show you what your process actually does rather than to interrupt a person.</p><p><em>Which changes what the infrastructure has to do.</em></p><h2 id="what-this-demands-of-the-video-layer">What This Demands of the Video Layer</h2><p>A chain is a multi-site problem before it is a camera problem. Hundreds of stores, each with its own uplink and its own bandwidth ceiling, all needing to reach central loss-prevention — and <a href="https://samvyo.com/blog/multi-site-video-surveillance-architecture-why-connecting-50-sites-to-one-soc-isnt-a-bandwidth-problem?ref=samvyo.com"><u>connecting many sites to one operations centre isn't a bandwidth problem</u></a>, it's a topology one. Pushing every store's full-resolution stream to head office is the design that fails first.</p><p>The live leg has to reach a handheld quickly, which means browser-deliverable video without a plugin and without a multi-second segment buffer — the transport problem covered in <a href="https://samvyo.com/blog/live-video-in-surveillance-why-rtsp-cameras-still-cant-talk-to-web-browsers-in-2026?ref=samvyo.com"><u>why RTSP cameras still can't talk to browsers</u></a>. And the archive leg still has to exist underneath it, because the case file, the insurance claim and the prosecution all draw on <a href="https://samvyo.com/blog/video-recording-at-scale-architecture-storage-and-the-compliance-trap?ref=samvyo.com"><u>recording at scale and its compliance constraints</u></a>.</p><p><em>Which puts the sourcing decision in familiar terms.</em></p><h2 id="build-buy-or-deploy">Build, Buy, or Deploy</h2><ul><li><strong>Build on open source. </strong>go2rtc or MediaMTX at each store for ingest and low-latency delivery, with your own detection and POS correlation on top. You own the per-store cost, which matters when the estate is hundreds of sites. Right when loss prevention is a core competency and you have engineering.</li><li><strong>Use a managed cloud relay. </strong>Fast to deploy across a chain, nothing per-store to run — but per-stream pricing multiplied by store count is the cost curve that ends these projects, and customer-facing footage in a third party's cloud is a privacy question you will be asked.</li><li><strong>Deploy a commercial platform. </strong>A full stack — per-site ingest, low-latency delivery to a handheld, recording and retention — on-premise or as a managed cloud deployment under a flat license. Samvyo is one such option: based on SFU architecture, with the media path, TURN and recording under your control, which matters when footage of your customers is the asset being stored. Where it doesn't fit: a handful of stores where a VMS and an occasional footage pull are genuinely enough.</li></ul><p><em>Three routes, one test — can an associate see the aisle while the person is still standing in it?</em></p><h2 id="the-bottom-line">The Bottom Line</h2><p>Recording more didn't reduce shrink, and it was never going to: footage is produced after the loss it documents. Real-time retail loss prevention video is worth building, but size it honestly — external theft is a minority of shrink, the industry's own headline theft statistic was retracted in 2023, and process failure and internal loss are untouched by an aisle camera. Within its real scope, the whole game is moving detection from the door back to the moment of selection, because that is the only point where the available response is a safe one: an associate offering help, before anything has been concealed. Get the alert there while the aisle reference is still true, keep precision high enough that nobody mutes the channel, and put the biggest effort where the biggest losses actually are — which is usually self-checkout and the stockroom, not the shop floor.</p><h2 id="whats-next">What's Next?</h2><p>The response loop this depends on, and how much delay it can absorb before an alert is just a recording with extra steps, is covered in <a href="https://samvyo.com/blog/talk-down-at-ten-seconds-is-theater-the-surveillance-intervention-latency-budget?ref=samvyo.com" rel="noreferrer"><strong><em>Talk-Down at Ten Seconds Is Theater</em></strong></a>.</p><p>For whether anyone can actually adjudicate the alerts you generate, <a href="https://samvyo.com/blog/the-operator-to-camera-ratio-that-decides-whether-proactive-monitoring-pays?ref=samvyo.com" rel="noreferrer"><strong><em>the operator-to-camera ratio</em></strong></a> does the arithmetic.</p><p>And for the distinction between recording and intervening in general, <a href="https://samvyo.com/blog/proactive-vs-reactive-surveillance-what-proactive-actually-means-and-whos-really-doing-it?ref=samvyo.com" rel="noreferrer"><strong><em>Proactive vs Reactive Surveillance</em></strong></a> draws the line.</p><h2 id="frequently-asked-questions">Frequently Asked Questions</h2><h3 id="does-retail-loss-prevention-video-actually-reduce-shrink">Does retail loss prevention video actually reduce shrink?</h3><p>Recorded video on its own has a poor track record — coverage and retention rose across the industry while shrink rose to 1.6% of sales in FY2022. Video reduces loss when it triggers an intervention before concealment, not when it documents one afterwards. And it only ever addresses external theft, which the NRF's own survey puts at a minority of total shrink.</p><h3 id="what-percentage-of-retail-shrink-is-actually-theft">What percentage of retail shrink is actually theft?</h3><p>Less than commonly claimed, and contested. The NRF attributed 37% of losses to external theft of all kinds, and in December 2023 retracted its separate claim that organised retail crime accounted for nearly half of shrink, acknowledging the difficulty of assembling accurate data. Internal theft and process failure make up the remainder.</p><h3 id="when-is-the-best-moment-to-intervene-in-a-retail-theft">When is the best moment to intervene in a retail theft?</h3><p>At selection, before concealment. That's the only point where the available response is safe and non-confrontational — an associate offering assistance nearby. By the exit, the merchandise is concealed, the subject is committed, and most store policies forbid physical intervention, so an alert there is effectively a notification of a loss in progress.</p><h3 id="why-do-store-staff-stop-responding-to-video-alerts">Why do store staff stop responding to video alerts?</h3><p>Because precision is too low and the recipient has another job. An associate who finds most alerts worthless stops opening them, and nothing in the system records that they've disengaged. In retail, precision matters far more than recall — two acted-on alerts a shift beats forty that get muted.</p><h3 id="is-self-checkout-worth-monitoring-with-video">Is self-checkout worth monitoring with video?</h3><p>It's usually the highest-yield zone in the store, because the loss mechanism is procedural — non-scans and mis-scans — and correlates directly with POS exception data you already collect. Pairing video with that data produces alerts with evidence attached, which are both more accurate and easier to handle politely.</p><h3 id="what-video-infrastructure-does-real-time-retail-lp-need">What video infrastructure does real-time retail LP need?</h3><p>Per-store ingest with browser-deliverable low-latency video reaching a handheld, plus retention for case files — across an estate of many sites without pushing full streams to head office. Samvyo is based on SFU architecture and keeps the media path, TURN and recording under your control, which matters when the footage is of your customers.</p>]]></content:encoded></item><item><title><![CDATA[Perimeter Intrusion Detection: Catching the Loiter-and-Probe Before the Breach]]></title><description><![CDATA[Sandia's framework is blunt about it: if nobody assesses the alarm, there is no detection. That single line reframes perimeter intrusion detection — the value isn't the sensor at the fence, it's catching the approach early enough that a response still has somewhere to go.]]></description><link>https://www.samvyo.com/blog/perimeter-intrusion-detection-catching-the-loiter-and-probe-before-the-breach</link><guid isPermaLink="false">6aa2dab88b45c3f0cd63a632</guid><category><![CDATA[Perimeter Security]]></category><category><![CDATA[Proactive Surveillance]]></category><category><![CDATA[Video Conferencing Infrastructure]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Fri, 11 Sep 2026 11:02:59 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-11--2026--03_51_49-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-11--2026--03_51_49-PM.png" alt="Perimeter Intrusion Detection: Catching the Loiter-and-Probe Before the Breach"/><p><em>If nobody assesses the alarm, there is no detection. Everything useful about perimeter intrusion detection follows from that one sentence — including why catching the approach beats catching the breach.</em></p><p>Sandia National Laboratories, in its <a href="https://www.osti.gov/servlets/purl/1837151?ref=samvyo.com"><u>physical protection systems guidance</u></a>, puts it without decoration: “detection cannot and does not occur without assessment. If the adversary opens an alarmed door, and no one assesses the alarm, there is no detection.”</p><p>Read that as an audit instruction. Every <strong>perimeter intrusion detection</strong> alert your site raised last night that nobody looked at contributed exactly nothing to your security posture. Not a reduced amount. Nothing. The sensor fired, the log filled, and by the framework's own definition no detection took place.</p><p><em>Which means the first thing to fix isn't the fence line. It's what the word detection is being used to mean.</em></p><h2 id="detection-is-sensing-plus-assessment">Detection Is Sensing Plus Assessment</h2><p>A physical protection system does three things: detect, delay, respond. Sensors and barriers get the budget, but the three are a chain, and the chain has a specific arithmetic that most perimeter procurement skips.</p><p>Detection is sensing plus assessment. A sensor produces a signal; assessment turns that signal into knowledge that something real is happening. Skip the second half and the first half has no value, because nothing downstream — no delay, no response — is ever triggered by an alarm nobody read.</p><p>The measurement vocabulary matters too, because two terms get used interchangeably and mean different things. Nuisance alarm rate covers all alarms from non-intrusion causes — the bird, the branch, the headlight sweep. False alarm rate is narrower: alarms from unknown sources, a subset of NAR. And probability of detection isn't a marketing percentage but a lower confidence bound: thirty successful test trials support a PD of 0.9 at 95% confidence, because thirty trials is not enough evidence to claim more.</p><p>Those definitions connect in a way worth internalising. A high nuisance alarm rate doesn't just annoy people — it actively degrades probability of detection through what the report calls cry-wolf syndrome. Your PD is not a property of the sensor. It's a property of the sensor and the human together, and the human's half is destroyed by noise.</p><p><em>Once detection is defined properly, the reason to detect early becomes arithmetic rather than instinct.</em></p><h2 id="the-race-you-are-actually-running">The Race You Are Actually Running</h2><p>The framework's core inequality is simple: the time your system needs — assess the alarm, decide, deploy a response — must be less than the adversary's remaining task time from the moment detection occurs. Everything else is detail.</p><p>That single relationship explains why a fence-mounted sensor, on its own, is a weak instrument. It sits at what the guidance calls the critical detection point — the last layer before the target. Detection there starts the response clock at the latest possible moment, with the smallest remaining task time on the other side of the inequality. It's not that the sensor is bad. It's that it's positioned to give you the least possible warning.</p><p>Detect the approach instead and nothing about the response force changes — you have simply moved the start of the clock earlier and made the same inequality much easier to satisfy. That's all a predictive perimeter really is. Not prophecy. Earlier position on the same timeline.</p><p><em>Which raises the fair question of whether there is anything out there to catch before the fence.</em></p><h2 id="the-approach-phase-is-real">The Approach Phase Is Real</h2><p>There is. In the UNC Charlotte survey of 422 incarcerated burglars, planning was common but short: among burglaries that were planned in advance, 49% took place within 24 hours of the target being selected, and 16% involved one to three days. Longer horizons existed but were the minority.</p><p>So the reconnaissance window is not a security-industry invention — but it is measured in hours and days, not weeks. A perimeter that only compares tonight against tonight will miss it. One that can ask whether this vehicle was also here yesterday afternoon is looking at the right timescale, and that is a data-retention and query problem as much as a detection one.</p><p><em>The trouble starts when vendors describe what they claim to see during that window.</em></p><h2 id="you-cannot-detect-intent-%E2%80%94-and-nor-can-anyone-else">You Cannot Detect Intent — and Nor Can Anyone Else</h2><p>The pitch for predictive perimeter security usually promises recognition of hostile reconnaissance: someone loitering with intent, casing the site, behaving suspiciously. The evidence base for that capability is weak, and it has been reviewed properly. Zoe Marchment and Paul Gill at <a href="https://crestresearch.ac.uk/resources/the-human-ability-to-recognise-suspicious-activity-hostile-reconnaissance/?ref=samvyo.com"><u>CREST</u></a> screened 7,033 studies on the human ability to recognise suspicious activity and hostile reconnaissance, and found accuracy sitting around chance level — with no meaningful difference between experienced CCTV operators and untrained observers.</p><p>Their central point is the one to carry into any procurement conversation: establishing non-verbal indicators of hostile intent that hold up across different contexts is genuinely difficult. Not unsolved-for-now difficult. Difficult in a way that has resisted a large literature.</p><p>This is where the honest reframe lives. If trained humans cannot reliably distinguish reconnaissance from a person waiting for a lift, a model trained on somebody else's footage and evaluated by its own vendor has not solved it either. Intent is not a visible property. Treat any claim to detect it as a claim requiring evidence you have not been shown.</p><p><em>Fortunately, the thing that actually works never needed intent at all.</em></p><h2 id="detect-rule-violations-not-intentions">Detect Rule Violations, Not Intentions</h2><p>Effective perimeter detection replaces an unanswerable question with several answerable ones. Not “is this person a threat” but “is anyone in the substation compound between midnight and 5 a.m.” The second question has a definite answer, can be tested, and produces a measurable PD and NAR on your specific site.</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    border: 1px solid rgba(128, 128, 128, 0.4);
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 10px 16px;
    color: inherit;
    background: transparent;
    vertical-align: top;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18);
    font-weight: 700;
  }
</style>
<table class="rate-table">
  <colgroup><col width="220"><col width="200"><col width="207"/></col></col></colgroup>
  <thead>
    <tr>
      <th>What you'd like to detect</th>
      <th>Why it fails</th>
      <th>What to detect instead</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Hostile intent</td>
      <td>Not observable; human accuracy sits near chance</td>
      <td>A person inside a zone that should be empty</td>
    </tr>
    <tr>
      <td>Suspicious behaviour</td>
      <td>No stable cross-context definition exists</td>
      <td>Dwell beyond a set threshold in a defined area</td>
    </tr>
    <tr>
      <td>Someone casing the site</td>
      <td>Requires inferring a plan from a single view</td>
      <td>The same vehicle appearing on separate days</td>
    </tr>
    <tr>
      <td>A person who will return later</td>
      <td>Prediction about the future, untestable today</td>
      <td>Direction of travel across a line, at an hour with no legitimate traffic</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p/><p>None of the right-hand column requires inferring anything about a person's mind. Each is an observable fact about a place and a time, which is why each can be walk-tested, tuned and measured — and why it produces an alert an operator can adjudicate in seconds rather than one asking them to read a stranger's motives.</p><p>It also fits what the burglary data actually says. Someone whose target selection happened yesterday afternoon shows up as the same vehicle on two days, or as a person on a service road at an hour with no legitimate traffic. You do not need to know why they were there. You need to know that they were, and to have someone look while they still are.</p><p><em>Which turns the design problem into a handful of concrete decisions.</em></p><h2 id="designing-perimeter-intrusion-detection-that-earns-its-alerts">Designing Perimeter Intrusion Detection That Earns Its Alerts</h2><ul><li><strong>Layer outward from the asset. </strong>Outer zones for awareness, inner zones for alarm, with different rules and different urgency. Detection at the critical detection point should be your last line, not your only one.</li><li><strong>Work with the cameras you have. </strong>Perimeter projects almost never start from an empty field, and <a href="https://samvyo.com/blog/youre-never-greenfield-what-it-really-costs-to-put-existing-cctv-in-a-browser?ref=samvyo.com"><u>you're never greenfield</u></a> — the existing estate sets what detection zones are even possible before any rule gets written.</li><li><strong>Tune the nuisance alarm rate per camera, not per system. </strong>In most estates a small number of views generate most of the noise — a tree, a road, a security light. Fixing those individually protects the PD of every other camera by protecting the operator's willingness to look.</li><li><strong>Measure PD by walk-testing, and state the confidence. </strong>Thirty successful trials support 0.9 at 95% confidence. Run the tests, in the dark and in the rain, and record what you actually achieved rather than what the datasheet claimed.</li><li><strong>Budget the assessment, not just the sensor. </strong>An alert nobody can adjudicate is not detection, so alerts per hour has to fit inside the operator capacity you actually have. That constraint is the subject of the operator-to-camera ratio, and it caps how aggressive your rules can be.</li><li><strong>Keep the assessment path live. </strong>Assessment means watching, now, not opening a clip afterwards. If pulling up the alerting camera costs several seconds, the approach window you worked to buy is being spent at the moment it matters.</li><li><strong>Retain enough to ask about yesterday. </strong>Cross-day questions are where the approach phase becomes visible, and they need retention plus a way to search it. A system that can only answer questions about the last hour cannot see reconnaissance at the timescale the data says it happens.</li></ul><p>That last one is a bigger commitment than it sounds. Holding days of footage across every perimeter camera so you can ask cross-day questions is exactly where <a href="https://samvyo.com/blog/video-recording-at-scale-architecture-storage-and-the-compliance-trap?ref=samvyo.com"><u>recording at scale meets the compliance trap</u></a> — retention long enough to be useful, governed well enough to be defensible.</p><p><em>All of which rests on video infrastructure that can carry live assessment and archive in the same system.</em></p><h2 id="build-buy-or-deploy">Build, Buy, or Deploy</h2><ul><li><strong>Build on open source. </strong>go2rtc or MediaMTX for ingest and low-latency delivery, with your own detection rules and retention on top. You own the tuning loop entirely, which matters because NAR tuning is site-specific and never finished. Right when perimeter monitoring is core to your product.</li><li><strong>Use a managed cloud relay. </strong>Fast to a working live view, but per-stream costs scale with camera count, and cross-day retention in somebody else's cloud is a cost and governance question before it is a technical one.</li><li><strong>Deploy a commercial platform. </strong>A full media stack — ingest, sub-second live view for assessment, recording and retention — on-premise or as a managed cloud deployment under a flat license. Samvyo is one such option: based on SFU architecture, with the media path, TURN and recording under your control, which matters for a site whose archive is also its evidence. Where it doesn't fit: a small site with no monitored response, where a recording system and a good fence are the honest answer.</li></ul><p><em>Three routes, one test — can somebody assess the alert while it is still true?</em></p><h2 id="the-bottom-line">The Bottom Line</h2><p>Perimeter intrusion detection is not a sensor problem. Detection, by the definition the discipline actually uses, does not occur until somebody assesses the alarm — so an unassessed alert contributes nothing, and a high nuisance alarm rate degrades detection by destroying the operator's willingness to look. The case for catching the approach rather than the breach is arithmetic: your assess-decide-respond time has to fit inside the adversary's remaining task time, and a fence-mounted sensor starts that clock at the worst possible moment. Just don't buy intent detection to do it. A review of 7,033 studies puts human recognition of hostile reconnaissance at around chance, so build rules about places and times instead, measure their PD on your own site, and make sure someone can watch while the alert is still true.</p><h2 id="whats-next">What's Next?</h2><p>Whether you can afford to adjudicate the alerts your rules generate is the subject of <a href="https://samvyo.com/blog/the-operator-to-camera-ratio-that-decides-whether-proactive-monitoring-pays?ref=samvyo.com" rel="noreferrer"><strong><em>the operator-to-camera ratio</em></strong></a>, which is where perimeter design meets monitoring economics.</p><p>For what happens after assessment, and how much delay a response can absorb, see <a href="https://samvyo.com/blog/talk-down-at-ten-seconds-is-theater-the-surveillance-intervention-latency-budget?ref=samvyo.com" rel="noreferrer"><strong><em>Talk-Down at Ten Seconds Is Theater</em></strong></a>.</p><p>And the live path that assessment depends on starts with <a href="https://samvyo.com/blog/live-video-in-surveillance-why-rtsp-cameras-still-cant-talk-to-web-browsers-in-2026?ref=samvyo.com"><u>getting RTSP cameras into a browser</u></a>.</p><h2 id="frequently-asked-questions">Frequently Asked Questions</h2><h3 id="what-is-perimeter-intrusion-detection">What is perimeter intrusion detection?</h3><p>A system that senses unauthorised approach or entry at a site boundary and enables assessment of what triggered it. The important nuance from physical-protection doctrine is that sensing alone isn't detection — Sandia's guidance states that detection does not occur without assessment, so an alarm nobody evaluates provides no detection at all.</p><h3 id="whats-the-difference-between-nuisance-alarm-rate-and-false-alarm-rate">What's the difference between nuisance alarm rate and false alarm rate?</h3><p>Nuisance alarm rate covers all alarms from non-intrusion causes with known sources — animals, weather, vegetation, vehicle lights. False alarm rate is narrower, covering alarms whose source is unknown, and is a subset of NAR. Both matter because a high nuisance rate degrades detection through cry-wolf desensitisation.</p><h3 id="what-probability-of-detection-should-i-specify">What probability of detection should I specify?</h3><p>Specify it with a confidence level or the number is meaningless. PD is a lower confidence bound derived from testing: thirty successful trials support PD of 0.9 at 95% confidence. Walk-test on your own site, in poor conditions, and record what you achieved rather than trusting a datasheet figure.</p><h3 id="can-ai-detect-someone-casing-a-site-before-a-break-in">Can AI detect someone casing a site before a break-in?</h3><p>Be sceptical of that claim. A CREST review of 7,033 studies found human ability to recognise suspicious activity and hostile reconnaissance sits around chance level, with experienced CCTV operators no better than untrained observers, and no stable cross-context indicators of hostile intent. Detect observable rule violations — presence, dwell, direction, repeat appearance — rather than inferred intent.</p><h3 id="how-much-warning-does-detecting-the-approach-actually-buy">How much warning does detecting the approach actually buy?</h3><p>It changes which side of the inequality you're on. Response time must be shorter than the adversary's remaining task time from the moment of detection, and a fence-mounted sensor sits at the critical detection point — the last layer before the target — so it starts that clock with the least time remaining. Detecting further out extends the window without changing anything about the response force.</p><h3 id="how-long-before-a-break-in-does-reconnaissance-happen">How long before a break-in does reconnaissance happen?</h3><p>Often hours rather than weeks. In a survey of 422 incarcerated burglars, 49% of planned burglaries occurred within 24 hours of the target being selected and 16% involved one to three days of planning. That timescale means cross-day queries matter, which makes retention part of your detection design.</p><h3 id="what-video-infrastructure-does-perimeter-assessment-need">What video infrastructure does perimeter assessment need?</h3><p>A live view an operator can open within seconds and stay on, plus retention long enough to ask cross-day questions. Samvyo is based on SFU architecture and delivers sub-second live view alongside recording, with the media path, TURN and recording under your control — which matters when the same archive serves both detection and evidence.</p>]]></content:encoded></item><item><title><![CDATA[Multi-Camera Synchronization: Why Your Four Angles Drift Out of Alignment]]></title><description><![CDATA[Four cameras cover one incident and produce four different accounts of when it happened. Multi camera synchronization fails in two separate places — the clock that stamps the frame and the pipeline that delivers it — and fixing one does nothing for the other. Here's how both break.]]></description><link>https://www.samvyo.com/blog/multi-camera-synchronization-why-your-four-angles-drift-out-of-alignment</link><guid isPermaLink="false">6aa2d9d88b45c3f0cd63a628</guid><category><![CDATA[video surveillance]]></category><category><![CDATA[WebRTC]]></category><category><![CDATA[RTSP]]></category><category><![CDATA[System Integration]]></category><category><![CDATA[Video Architecture]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Fri, 11 Sep 2026 11:02:54 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-11--2026--03_48_06-PM.png" medium="image"/><content:encoded><![CDATA[<blockquote><em>Four cameras watched the same incident and produced four different accounts of when it happened. Multi camera synchronization breaks in two separate places, and fixing one does nothing for the other.</em></blockquote><img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-11--2026--03_48_06-PM.png" alt="Multi-Camera Synchronization: Why Your Four Angles Drift Out of Alignment"/><p>Something happens in a loading yard. Four cameras cover it: one on the gate, one on the dock, one on the corner of the building, one on the truck lane. You pull all four to reconstruct the sequence — did the vehicle arrive before or after the gate opened? — and the four clips disagree. Not by a frame. By seconds.</p><p>This is the <strong>multi camera synchronization</strong> problem, and the reason it survives in otherwise well-run systems is that it isn't one problem. It's two, they have different causes and different fixes, and solving either one alone leaves you exactly as unable to answer the question.</p><p><em>So separate them before trying to fix anything.</em></p><h2 id="two-problems-wearing-one-name">Two Problems Wearing One Name</h2><p>The first is capture alignment: what instant does this frame actually represent, and can I compare that instant to a frame from another camera? This is a question about clocks and timestamps, and it determines whether you can build a defensible timeline after the fact.</p><p>The second is presentation alignment: are the four tiles on my wall showing the same moment right now? This is a question about delivery paths, and it determines whether an operator watching live is seeing a coherent scene or four slightly different times stitched together.</p><p>They're independent. Cameras can be perfectly time-synchronised and still display three seconds apart, because the frames took different routes to the screen. And they can display in perfect lockstep while carrying timestamps that are minutes off, because the wall aligned them on arrival rather than on capture. One system is wrong in court; the other is wrong in the moment.</p><p><em>Both start with the same discovery: the protocol carrying your video was never going to solve this for you.</em></p><h2 id="why-rtp-cant-align-your-cameras">Why RTP Can't Align Your Cameras</h2><p>Video over RTP carries a timestamp on every packet, so the obvious move is to compare them. <a href="https://datatracker.ietf.org/doc/html/rfc3550?ref=samvyo.com"><u>RFC 3550</u></a> closes that door explicitly: the initial value of the RTP timestamp “SHOULD be random,” and streams “may advance at different rates and usually have independent, random offsets.” The specification's own conclusion is that “directly comparing RTP timestamps from different media is not effective for synchronization.”</p><p>An RTP timestamp is a measure of elapsed sampling within one stream. It says nothing about what time it was in the world. Two cameras started at different moments with different random seeds, so their timestamps are two rulers with the zero mark filed off in different places.</p><p>The bridge is RTCP. A sender report pairs an RTP timestamp with a wall-clock NTP timestamp, telling a receiver what real-world instant a given stream position corresponds to. That is the mechanism, and there are two things to know about it. Sender reports arrive at a much lower rate than data packets, so alignment is interpolated between them rather than exact per-frame. And the spec assumes “the reference clock is shared by all media to be synchronized” — which holds inside one sender, and is precisely what independent cameras do not have.</p><p><em>Which pushes the whole problem down onto the camera's own clock.</em></p><h2 id="the-clock-underneath-multi-camera-synchronization">The Clock Underneath Multi Camera Synchronization</h2><p>A camera is a small computer with a cheap oscillator. Left alone, its clock free-runs and the error accumulates from the moment it was last set — there is no self-correction, and nothing on any dashboard reports the drift. Whatever the camera stamps into the video is what your evidence says happened, and it is wrong by an amount nobody is tracking.</p><p>So you give it a time source. NTP is the near-universal answer, and its accuracy is highly situational: the NTP project's own reference material puts typical results between <a href="http://www.ntp.org/reflib/ptp/?ref=samvyo.com"><u>a few microseconds on PPS-assisted primary servers and tens of milliseconds across widely dispersed internet networks</u></a>. The failure mode worth knowing is asymmetry — when the path to the time server is faster in one direction than the other, the offset that introduces is, per <a href="https://kb.meinbergglobal.com/kb/time_sync/time_synchronization_accuracy_with_ntp?ref=samvyo.com"><u>Meinberg's technical documentation</u></a>, one “which the client software can't determine.” It doesn't show up as an error. It shows up as confident, precise, wrong time.</p><p>Where accuracy genuinely matters, PTP (IEEE 1588) is the step up, at roughly <strong>100 nanoseconds</strong> — but that figure depends on the network interface capturing hardware timestamps at the physical layer, so it's a hardware capability before it's a configuration option. Most surveillance estates won't have it, and mostly won't need it: for reconstructing a yard incident, low-millisecond LAN-based NTP is comfortably sufficient. The gap that hurts is between milliseconds and minutes, not between milliseconds and nanoseconds.</p><p>One caveat about conformance, and it will look familiar to anyone who has read the <strong><em>audio backchannel spec</em></strong>. The <a href="https://www.onvif.org/specs/core/ONVIF-Core-Specification.pdf?ref=samvyo.com"><u>ONVIF Core Specification</u></a> (v26.06) defines the interfaces — GetSystemDateAndTime, SetSystemDateAndTime, GetNTP, SetNTP — and states no accuracy requirement for the device clock at all. ONVIF conformance tells you a camera can be told the time. It does not tell you the camera keeps it.</p><p><em>And even with every clock perfect, the second problem is entirely untouched.</em></p><h2 id="the-delivery-path-adds-its-own-skew">The Delivery Path Adds Its Own Skew</h2><p>Presentation alignment fails for reasons that have nothing to do with clocks. Frames stamped at exactly the same instant reach the screen at different times because they took different routes.</p><p>The biggest offender is an uneven pipeline. If one camera's H.264 stream passes through untouched while another's H.265 stream has to be decoded and re-encoded to reach the browser, the transcoded path carries the full cost of that work and the passthrough one doesn't — the two tiles are now permanently offset by however long the transcode takes. That codec split is the subject of <a href="https://samvyo.com/blog/live-video-in-surveillance-why-rtsp-cameras-still-cant-talk-to-web-browsers-in-2026?ref=samvyo.com"><u>why RTSP cameras still can't talk to browsers</u></a>, and here it shows up as a synchronisation bug rather than a cost one.</p><p>Then the smaller contributors stack. Cameras with different keyframe intervals start displaying at different points after a subscribe. Each stream gets its own jitter buffer sized to its own network conditions. Different physical paths through the estate have different latencies. None of these are faults; every one of them is a component doing its job independently, which is exactly why the result is four independent timelines.</p><p>Scale that across buildings and it gets worse rather than better, because each site's relay adds its own hop and its own buffering — <a href="https://samvyo.com/blog/multi-site-webrtc-surveillance-building-the-site-edge-relay-and-central-sfu-that-scales-to-50-sites?ref=samvyo.com"><u>the site-edge relay and central SFU pattern</u></a> is where cross-site timing has to be handled deliberately, since two cameras in different cities share nothing but the clock you gave them.</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    border: 1px solid rgba(128, 128, 128, 0.4);
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 10px 16px;
    color: inherit;
    background: transparent;
    vertical-align: top;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18);
    font-weight: 700;
  }
</style>
<table class="rate-table">
  <colgroup><col width="207"><col width="213"><col width="207"/></col></col></colgroup>
  <thead>
    <tr>
      <th>Source of skew</th>
      <th>Magnitude</th>
      <th>What fixes it</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Free-running camera clock</td>
      <td>Unbounded — accumulates continuously from the last time it was set</td>
      <td>A common time source, checked</td>
    </tr>
    <tr>
      <td>NTP across a WAN with an asymmetric path</td>
      <td>Milliseconds, and the client cannot detect the offset</td>
      <td>Keep the time source on the LAN</td>
    </tr>
    <tr>
      <td>NTP on a local network</td>
      <td>Microseconds to low milliseconds</td>
      <td>Usually good enough for review</td>
    </tr>
    <tr>
      <td>PTP with NIC hardware timestamping</td>
      <td>~100 nanoseconds</td>
      <td>The ceiling, if your hardware supports it</td>
    </tr>
    <tr>
      <td>RTP timestamps compared across streams</td>
      <td>Arbitrary — the offsets are random by design</td>
      <td>Use RTCP sender reports instead</td>
    </tr>
    <tr>
      <td>Transcoded stream alongside a passthrough one</td>
      <td>A full decode-and-re-encode on one path only</td>
      <td>Keep the pipeline uniform</td>
    </tr>
    <tr>
      <td>Mismatched keyframe intervals</td>
      <td>0–4s at stream start</td>
      <td>Align GOP settings across cameras</td>
    </tr>
    <tr>
      <td>Independent jitter buffers per stream</td>
      <td>Tens to hundreds of milliseconds</td>
      <td>Sync playback to the slowest stream</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p/><p><em>The cost of leaving this alone is larger than a slightly untidy video wall.</em></p><h2 id="what-drift-actually-costs-you">What Drift Actually Costs You</h2><ul><li><strong>The timeline stops being defensible. </strong>Reconstructing a sequence across cameras is the core forensic use of a multi-camera estate, and it rests entirely on comparing timestamps. If nobody can say how well the clocks agreed, the ordering of events becomes an assertion rather than a record.</li><li><strong>Cross-camera analytics degrade quietly. </strong>Following a subject from one camera to the next depends on temporal alignment as much as visual matching. Feed a tracker two views that disagree by seconds and it will confidently produce a wrong path, with no error to catch.</li><li><strong>Live decisions get made off the wrong tile. </strong>An operator comparing the gate camera to the dock camera to decide whether to intervene is comparing two different moments, and nothing on screen says so.</li><li><strong>Nothing alerts you. </strong>Drift produces no dropped frames, no failed health check, no logged error. It is invisible until the first time someone needs the answer, which is the worst possible moment to discover it.</li></ul><p><em>All of which is fixable with a handful of deliberate decisions.</em></p><h2 id="designing-for-multi-camera-synchronization">Designing for Multi Camera Synchronization</h2><ul><li><strong>One time source, on the local network. </strong>Every camera, the recorder and the analytics host point at the same server, reachable over the LAN rather than across a WAN whose path asymmetry you can't measure. Use PTP where the hardware supports it and the application justifies it.</li><li><strong>Verify the clocks, don't assume them. </strong>Poll each camera's reported time on a schedule and alert on divergence. It's a few lines of ONVIF and it converts an invisible failure into a monitored one.</li><li><strong>Record capture time, never receipt time. </strong>If the recorder stamps frames when they arrive, you have baked every network delay into your evidence permanently. Carry the camera's capture timestamp through the pipeline and store it.</li><li><strong>Align streams via RTCP, not RTP. </strong>Use sender reports to map each stream onto wall clock, exactly as the specification intends, and treat raw RTP timestamps as stream-internal only.</li><li><strong>Keep the pipeline uniform. </strong>Same codec handling, same keyframe interval, same delivery transport across cameras that will be viewed together. A synchronised group should be a deliberate configuration, not an accident of which cameras happened to be bought together.</li><li><strong>For synchronised playback, buffer to the slowest. </strong>A multi-view that aligns properly is one that holds every stream back to match the laggiest, and tells the operator the group is running a known delay. Say the number in the interface — a synchronised view that silently costs a second is a trap in a live-response context.</li></ul><p>And measure it before you trust it: put a running clock display in frame, view it on every camera at once, and photograph the wall. Whatever disagreement you can read off that image is your real synchronisation error, and it is the only number that isn't an assumption.</p><p><em>Which leaves the question of what you're building it on.</em></p><h2 id="build-buy-or-deploy">Build, Buy, or Deploy</h2><ul><li><strong>Build on open source. </strong>go2rtc and MediaMTX handle RTSP ingest and WebRTC delivery, and give you direct control over the passthrough-versus-transcode decision that causes most presentation skew. You own the timestamp handling end to end, which is the part that matters here. Right when you have the team to operate a media pipeline.</li><li><strong>Use a managed cloud relay. </strong>Quick to a working multi-view, but the pipeline is a black box — whether it preserves capture timestamps or restamps on ingest is a question you have to ask explicitly, and the answer determines whether your archive is evidentially useful.</li><li><strong>Deploy a commercial platform. </strong>A full stack — ingest, uniform passthrough, low-latency fan-out, recording — on-premise or as a managed cloud deployment under a flat license. Samvyo is one such option: based on SFU architecture, with the media path and recording under your control, so capture timestamps stay yours rather than being restamped in somebody else's cloud. Where it doesn't fit: a handful of cameras, or a single-view deployment where cross-camera timing never comes up.</li></ul><p><em>Three routes, one requirement — somebody has to own the clock.</em></p><h2 id="the-bottom-line">The Bottom Line</h2><p>Four angles drift apart for two unrelated reasons, and you have to fix both. The capture side fails because RTP timestamps carry random offsets by design and cannot be compared across streams, so alignment depends on RTCP sender reports and on cameras genuinely sharing a reference clock — which ONVIF conformance does not guarantee, since the spec sets no accuracy requirement for a device clock at all. The presentation side fails because a transcoded stream, a longer keyframe interval and an independently sized jitter buffer each add delay to some paths and not others. Give every camera the same time source, carry capture timestamps rather than arrival times, keep the pipeline uniform across cameras that get viewed together — and then put a clock in frame and photograph the wall, because that photograph is the only measurement in this whole article that isn't an assumption.</p><h2 id="whats-next">What's Next?</h2><p>Feeding many synchronised views to one workstation runs into a separate ceiling — <a href="https://samvyo.com/blog/why-watching-500-cameras-is-a-decode-problem-not-a-bandwidth-problem?ref=samvyo.com"><u>watching 500 cameras is a decode problem, not a bandwidth problem</u></a>, and a machine dropping frames under load will break alignment no matter how good your clocks are.</p><p>For what happens to a live view at the moment an operator expands it — a related timing failure with a different cause — see <a href="https://samvyo.com/blog/the-blind-five-seconds-what-live-view-latency-costs-you-on-a-video-wall?ref=samvyo.com" rel="noreferrer"><strong><em>The Blind Five Seconds</em></strong></a>.</p><p>And for why any of this timing precision matters operationally, <a href="https://samvyo.com/blog/talk-down-at-ten-seconds-is-theater-the-surveillance-intervention-latency-budget?ref=samvyo.com" rel="noreferrer"><strong><em>Talk-Down at Ten Seconds Is Theater</em></strong></a> covers the response loop it feeds.</p><h2 id="frequently-asked-questions">Frequently Asked Questions</h2><h3 id="why-are-my-security-camera-timestamps-different-across-cameras">Why are my security camera timestamps different across cameras?</h3><p>Because each camera keeps its own clock and free-runs unless it's synchronised to a shared time source. Error accumulates from the moment the clock was last set, produces no alert, and gets written permanently into recorded video. Point every camera at the same NTP server on the local network and poll their reported times to catch divergence.</p><h3 id="can-rtp-timestamps-be-used-to-synchronise-multiple-cameras">Can RTP timestamps be used to synchronise multiple cameras?</h3><p>No. RFC 3550 specifies that RTP timestamps start from a random value and that streams have independent, random offsets, and states directly that comparing RTP timestamps across streams is not effective for synchronisation. Alignment requires RTCP sender reports, which map each stream's RTP timestamps onto wall-clock time.</p><h3 id="what-is-multi-camera-synchronization-in-video-surveillance">What is multi camera synchronization in video surveillance?</h3><p>It's two separate problems: capture alignment, meaning frames from different cameras carry comparable timestamps so a timeline can be reconstructed, and presentation alignment, meaning multiple live views on screen show the same instant. Clock configuration fixes the first; a uniform delivery pipeline fixes the second.</p><h3 id="is-ntp-accurate-enough-for-cctv-or-do-i-need-ptp">Is NTP accurate enough for CCTV, or do I need PTP?</h3><p>NTP on a local network is normally sufficient — reconstructing an incident needs millisecond-level agreement, not nanoseconds. PTP reaches around 100 nanoseconds but requires network interfaces that capture hardware timestamps. The damaging gap is between milliseconds and minutes, which is what unsynchronised cameras produce.</p><h3 id="does-onvif-conformance-guarantee-accurate-camera-time">Does ONVIF conformance guarantee accurate camera time?</h3><p>No. The ONVIF Core Specification defines the interfaces for reading and setting device time and NTP configuration, but states no accuracy requirement for the device clock. Conformance means a camera can be told the time; it says nothing about how well it keeps it.</p><h3 id="why-do-my-live-camera-tiles-show-different-moments">Why do my live camera tiles show different moments?</h3><p>Because the streams took different routes. A transcoded H.265 stream carries decode-and-re-encode delay that a passthrough H.264 stream doesn't, keyframe intervals differ, and each stream gets its own jitter buffer. Keeping codec handling, GOP settings and transport uniform across a viewing group removes most of it.</p><h3 id="how-do-i-measure-camera-synchronisation-error">How do I measure camera synchronisation error?</h3><p>Display a running clock where several cameras can see it, pull all of them up simultaneously, and photograph the screen. The spread you can read across the tiles is your actual error. Samvyo is based on SFU architecture with uniform low-latency delivery and keeps the media path and recording under your control, so capture timestamps survive the pipeline rather than being restamped elsewhere.</p>]]></content:encoded></item><item><title><![CDATA[The Blind Five Seconds: What Live View Latency Costs You on a Video Wall]]></title><description><![CDATA[On a video wall, clicking one camera to full-screen can cost three to five seconds of live view — starting the instant an operator spots trouble. Here's what causes that live view latency, why no dashboard catches it, and how a system built for live video closes the gap.]]></description><link>https://www.samvyo.com/blog/the-blind-five-seconds-what-live-view-latency-costs-you-on-a-video-wall</link><guid isPermaLink="false">6aa2d6338b45c3f0cd63a60e</guid><category><![CDATA[video surveillance]]></category><category><![CDATA[video wall]]></category><category><![CDATA[Embedded WebRTC]]></category><category><![CDATA[Remote Camera Control]]></category><category><![CDATA[Control Room]]></category><category><![CDATA[VMS]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Fri, 11 Sep 2026 11:02:48 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/blind-five-secs.png" medium="image"/><content:encoded><![CDATA[<blockquote><em>An operator clicks the one suspicious camera and waits three to five seconds for it to fill the screen. That wait is live view latency, and it lands at the worst possible instant. Here's what opens the gap, why almost nobody measures it, and how a system built for live video shuts it.</em></blockquote><img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/blind-five-secs.png" alt="The Blind Five Seconds: What Live View Latency Costs You on a Video Wall"/><p>A monitoring operator watches a hundred cameras on one wall. Most of a shift, nothing on it needs a second look. Then something does — a figure along a fence line that should be empty. The operator clicks that tile to bring it full-screen, leans in, and waits. On a lot of systems that wait runs three to five seconds, and for those seconds the one camera that matters is the one they cannot see. The gap has a name — <strong>live view latency</strong> — and unlike most latency, it opens at the exact instant someone decided to look.</p><h2 id="what-you-actually-lose"><strong>What you actually lose</strong></h2><p>First, the correction that matters to anyone evaluating this seriously. You do not lose the recording. In a normal VMS or NVR deployment, every camera records continuously on the server the moment it connects, no matter what any operator has on screen. Those five seconds sit in the archive, and you can scrub back to them later.</p><p>What you lose is live attention at the moment you chose to spend it. The operator flagged that tile because something looked wrong now. Going blind for five seconds starting now is the expensive kind of blind. If the response you're trying to run is an intervention — a talk-down over a speaker, a call to a patrol, a dispatch — live eyes are the whole mechanism, and a clip pulled from the archive an hour later does none of that work.</p><p>So the honest framing isn't “lost footage.” It's a live view gap that opens at the least convenient second on the clock.</p><p><em>Which raises the obvious question: why does clicking a camera cost seconds at all?</em></p><h2 id="where-live-view-latency-comes-from"><strong>Where live view latency comes from</strong></h2><p>Showing a hundred live feeds on one wall is expensive, so systems economize, sensibly. Each tile in the grid usually renders a low-resolution, low-framerate substream — sometimes only a few frames a second. A hundred of those is survivable. A hundred full-resolution main streams decoded at once would melt most workstations.</p><p>When the operator expands a tile, the client switches from that thin substream to the camera's high-resolution main stream. Three things have to happen before a single sharp frame appears, and they stack:</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    border: 1px solid rgba(128, 128, 128, 0.4);
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 10px 16px;
    color: inherit;
    background: transparent;
    vertical-align: top;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18);
    font-weight: 700;
  }
</style>
<table class="rate-table">
  <colgroup><col width="147"><col width="297"><col width="180"/></col></col></colgroup>
  <thead>
    <tr>
      <th>Step</th>
      <th>What happens</th>
      <th>Typical cost</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Stream switch</td>
      <td>Client subscribes to the high-res main stream</td>
      <td>a round trip or two</td>
    </tr>
    <tr>
      <td>Keyframe wait</td>
      <td>Decoder can't draw until an I-frame (IDR) arrives</td>
      <td>0–4 s, set by the keyframe interval</td>
    </tr>
    <tr>
      <td>Buffer</td>
      <td>Player buffers briefly before playback starts</td>
      <td>a few hundred ms</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p>The middle row is the one that hurts. Video isn't a sequence of full images; it's an occasional full frame — the keyframe, or IDR — followed by a run of delta frames that only describe what changed. A decoder can't render anything until it receives a keyframe to build from. If the camera emits one every two to four seconds and the operator clicked one second after the last, the player sits idle until the next one arrives. Add the switch and the buffer, and five seconds isn't an outlier. On HLS-based viewers, where segments are several seconds long by design, it's worse.</p><p><em>The strangest part is that a gap this real never shows up anywhere you'd look for it.</em></p><h2 id="why-almost-nobody-measures-it"><strong>Why almost nobody measures it</strong></h2><p>The gap is invisible in every channel that normally catches defects. It doesn't show up in the recording, because the recording is fine. It doesn't trip an alert. It doesn't dent uptime or frame-loss stats — the camera never went down and no packets dropped. The only person who experiences it is the operator, in the moment, and operators rarely have a way to file “the screen made me wait” as a bug.</p><p>So it survives, unmeasured, in systems that look healthy on every dashboard. The first time it costs someone the moment they were watching for, it stops being invisible.</p><p><em>Closing it is an architecture decision, with trade-offs worth naming out loud.</em></p><h2 id="what-closes-the-live-view-latency-gap"><strong>What closes the live view latency gap</strong></h2><p>Keep the stream warm. If the expanded view is already flowing to the client at full quality, or can be upgraded in place, there's no fresh subscription to negotiate. <a href="https://samvyo.com/blog/what-is-simulcast-and-when-does-it-save-or-waste-bandwidth?ref=samvyo.com">Simulcast — several quality layers from one camera</a> and layered (SVC) encoding let a client hold a low layer for the grid tile and step up to a high layer on click, without tearing a stream down and rebuilding it.</p><p>Don't wait for the camera's next natural keyframe. In a WebRTC path, a receiver can send a Picture Loss Indication or Full Intra Request to demand a keyframe immediately, instead of waiting out the interval. A media server in the path can also cache the most recent keyframe per stream and hand it to the client the instant it subscribes, so decoding starts on the first frame rather than the next scheduled one.</p><p>Use a transport built for sub-second delivery. WebRTC targets sub-second glass-to-glass latency; segment-based delivery like HLS trades latency for simplicity and lands in the multi-second range. For a wall whose job is to react, that trade runs the wrong way.</p><p>None of this is free, and pretending otherwise is how you end up with a surprise bill. Keeping streams warm and running simulcast layers costs bandwidth and server resources; forcing keyframes more often raises bitrate. A system that closes the gap is spending compute and network to do it. For a passive review archive, that spend isn't worth it. For a control room whose job is to intervene while something is still happening, it usually is.</p><p><em>So the real question at purchase time isn't “does it stream” — it's how you source a live path that doesn't blink.</em></p><h2 id="build-buy-or-deploy"><strong>Build, Buy, or Deploy</strong></h2><ul><li><strong>Build on open source. </strong>Media servers like go2rtc and MediaMTX handle RTSP-to-WebRTC conversion, H.264 passthrough, and keyframe handling — run and scaled by you. Maximum control over the live path and its costs. Right when live video is core to your product and you have the team to operate a media pipeline.</li><li><strong>Use a managed cloud relay. </strong>Fastest to a working browser view, nothing to run — but your camera feeds route through a third party, and you pay per stream as you scale. Right when speed matters more than owning the path.</li><li><strong>Deploy a commercial platform. </strong>A full media stack — ingest, passthrough, low-latency fan-out, recording — delivered as something you run on-premise or as a managed cloud deployment under a flat license. Samvyo is one such option: it's based on SFU architecture, keeps the media path, TURN, and recording under your control, and is designed to switch and scale streams without the click-to-fullscreen blink — resilient by design. It ships the same embeddable SDKs a CPaaS gives you, plus on-prem/managed deployment and white-label depth. Where it doesn't fit: a handful of cameras or a hobby project, where open source or a relay is plenty.</li></ul><p><em>Put it together and the gap stops being a mystery.</em></p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>The five seconds you lose when you expand a camera aren't lost from the archive — they're lost from live view, at the one moment an operator was actually watching. The cause is mechanical: a substream-to-mainstream switch, a wait for the next keyframe, and a playback buffer, stacked on a transport that was never built to react. Close it by keeping streams warm, forcing keyframes on demand, and carrying the live view over sub-second transport — and measure it with the one number nobody takes: time from click to first sharp frame.</p><h2 id="whats-next"><strong>What's Next?</strong></h2><p>Curious why that live view matters so much in the first place? The companion piece on proactive vs reactive surveillance explains why intervention lives or dies on the live path, and what “proactive” actually buys.</p><p><strong>→ </strong><a href="https://samvyo.com/blog/proactive-vs-reactive-surveillance-what-proactive-actually-means-and-whos-really-doing-it?ref=samvyo.com" rel="noreferrer"><strong><em>Proactive vs Reactive Surveillance: What “Proactive” Actually Means</em></strong></a></p><p><strong>→ </strong><a href="https://www.samvyo.com/blog/what-is-an-sfu-and-why-does-every-video-platform-use-one?ref=samvyo.com" rel="noreferrer"><strong><em>What Is an SFU — and Why Does Every Video Platform Use One?</em></strong></a>&nbsp; </p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><h3 id="why-does-a-live-camera-feed-take-several-seconds-to-load-when-i-click-it"><strong>Why does a live camera feed take several seconds to load when I click it?</strong></h3><p>Because the viewer switches from a low-res grid substream to the high-res main stream, and the decoder can't render until the next keyframe (IDR) arrives. With a two-to-four-second keyframe interval plus a stream switch and a buffer, that's often three to five seconds. WebRTC with on-demand keyframes and simulcast collapses it to under a second.</p><h3 id="is-the-footage-actually-lost-during-that-gap"><strong>Is the footage actually lost during that gap?</strong></h3><p>No — server-side recording runs continuously regardless of what's on screen, so the archive keeps those seconds. What's lost is live view: the operator can't see the high-res feed in real time at the moment they expanded it, which matters when the point is to intervene rather than review.</p><h3 id="what-causes-live-view-latency-on-a-video-wall"><strong>What causes live view latency on a video wall?</strong></h3><p>Three stacked costs: subscribing to the high-res stream, waiting for a keyframe before decoding can start, and a short playback buffer. Long camera keyframe intervals and segment-based transports like HLS make it worse; sub-second transports and keyframe caching make it nearly disappear.</p><h3 id="how-do-i-measure-the-gap"><strong>How do I measure the gap?</strong></h3><p>Time from click to first sharp frame. Click a grid tile, start a stopwatch, stop it when the full-resolution image is actually live and moving. Repeat a few times, because where you land relative to the keyframe interval changes the result. Under a second is healthy; drifting toward five means a blind window is built into your wall.</p><h3 id="does-webrtc-remove-the-delay-completely"><strong>Does WebRTC remove the delay completely?</strong></h3><p>It removes most of it. Sub-second transport, on-demand keyframe requests (PLI/FIR), and simulcast layer-switching kill the two big causes — the keyframe wait and the slow transport. Some setup cost remains, but the visible gap drops from seconds to well under one.</p><h3 id="can-samvyo-avoid-the-click-to-fullscreen-gap"><strong>Can Samvyo avoid the click-to-fullscreen gap?</strong></h3><p>Yes. Samvyo is based on SFU architecture with low-latency switching, so it can step a client between stream layers and serve a cached keyframe on subscribe rather than waiting for the camera's next one. Continuous recording still runs underneath, and the media path, TURN, and recording can stay under your control while the platform remains resilient by design.</p>]]></content:encoded></item><item><title><![CDATA[Proactive vs Reactive Surveillance: What “Proactive” Actually Means — and Who's Really Doing It]]></title><description><![CDATA[Every camera vendor now sells “proactive,” and most mean reactive with a quicker alert. The real difference is a response loop reactive surveillance doesn't have. Here's what separates proactive surveillance from reactive, who actually runs it, and where reactive still wins.]]></description><link>https://www.samvyo.com/blog/proactive-vs-reactive-surveillance-what-proactive-actually-means-and-whos-really-doing-it</link><guid isPermaLink="false">6aa2d7dd8b45c3f0cd63a618</guid><category><![CDATA[Proactive vs Reactive]]></category><category><![CDATA[Proactive Surveillance]]></category><category><![CDATA[video surveillance]]></category><category><![CDATA[Security Ops]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Fri, 11 Sep 2026 11:02:39 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/proactive-vs-reactive.png" medium="image"/><content:encoded><![CDATA[<blockquote><em>Every camera vendor now sells “proactive.” Most of what they mean is reactive, just faster. Genuine proactive surveillance runs a response loop that reactive doesn't have — and that loop, not the marketing, is the whole difference. Here's what separates the two, who runs real proactive today, and what it costs.</em></blockquote><img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/proactive-vs-reactive.png" alt="Proactive vs Reactive Surveillance: What “Proactive” Actually Means — and Who's Really Doing It"/><p>Reactive surveillance answers one question: what happened? Something goes wrong, and later someone pulls the footage to find out. Proactive surveillance tries to answer a different one — what's happening right now, and can anyone act before it's over? That shift, from evidence to intervention, is what <strong>proactive surveillance</strong> actually means. And here's the uncomfortable part most vendors won't say out loud: the large majority of what's sold as proactive is just reactive with a faster alert. A real-time notification on a live feed is still a reaction — quicker, but still after the event has begun.</p><p><em>To see the difference clearly, start with the model almost every deployment already runs.</em></p><h2 id="reactive-surveillance-the-evidence-model"><strong>Reactive surveillance: the evidence model</strong></h2><p>Reactive surveillance is the default, and for good reason. Cameras record continuously, footage lands in an archive, and when an incident happens — a break-in, a dispute, a loss — someone reviews the relevant clip. It's how the overwhelming majority of the world's cameras work, and for a huge range of jobs it's exactly right. Insurance claims, prosecutions, dispute resolution, after-the-fact investigation: all of these need a reliable record, not a live responder. Reactive surveillance is evidence infrastructure, and evidence is valuable.</p><p>What reactive can't do is change the outcome of the event it's recording. By the time anyone looks, the thing has already happened. For a warehouse documenting shrinkage that's fine. For a site trying to stop an intrusion in progress, it isn't.</p><p><em>Which is exactly the line proactive is trying to cross.</em></p><h2 id="what-makes-proactive-actually-proactive"><strong>What makes proactive actually proactive</strong></h2><p>The difference isn't a smarter camera or a sharper image. It's a response loop that reactive surveillance simply doesn't have. Reactive runs a short chain: incident, eventual notice, footage review, outcome days later. Proactive inserts stages in the middle that compress the time between event and response toward zero.</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    border: 1px solid rgba(128, 128, 128, 0.4);
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 10px 16px;
    color: inherit;
    background: transparent;
    vertical-align: top;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18);
    font-weight: 700;
  }
</style>
<table class="rate-table">
  <colgroup><col width="113"><col width="255"><col width="255"/></col></col></colgroup>
  <thead>
    <tr>
      <th>Stage</th>
      <th>Reactive</th>
      <th>Proactive</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Detect</td>
      <td>Motion / continuous recording</td>
      <td>Motion or AI event on the live stream</td>
    </tr>
    <tr>
      <td>Classify</td>
      <td>— reviewed later by a person</td>
      <td>Person, vehicle, or weapon? filter the noise</td>
    </tr>
    <tr>
      <td>Verify</td>
      <td>—</td>
      <td>A human or system confirms the threat live</td>
    </tr>
    <tr>
      <td>Respond</td>
      <td>After the fact</td>
      <td>Intervene now — talk-down, dispatch, lockdown</td>
    </tr>
    <tr>
      <td>Resolve</td>
      <td>Investigate</td>
      <td>Incident stopped, or evidence escalated</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p>The two stages reactive skips — classify and verify — are the whole game. Detection has existed for decades; motion alarms are ancient. The reason proactive didn't work for most of that time is that raw detection drowns operators in false alarms, they go numb, and the system becomes noise. What changed is that classification got good enough to separate a person from a passing car, which is what makes the rest of the loop economically possible.</p><p><em>And “economically possible” is doing real work in that sentence — it's where proactive lives or dies.</em></p><h2 id="the-two-stages-that-decide-whether-proactive-works"><strong>The two stages that decide whether proactive works</strong></h2><p>Start with classification, because it sets the economics. A proactive monitoring center's cost is people watching screens. If every shadow and stray cat fires an alert, one operator can meaningfully watch only a handful of cameras before fatigue sets in and real events get lost in the noise. AI classification that filters events down to “person on the perimeter at 2 a.m.” lifts that ratio — one operator can cover fifty or more cameras when the system only surfaces events worth a human's attention. That ratio is the entire business case for proactive; without it, the model is too expensive to run.</p><p>Then verification, because it's where proactive earns its keep operationally. Police increasingly deprioritize unverified alarms — the false-alarm rate on traditional systems is high enough that an unconfirmed trip goes to the back of the queue. A monitoring operator who can say “I'm watching an intruder on camera right now” changes the priority of that call. Verification is also where the single most effective feature lives: the talk-down. An operator speaking through a site speaker — “you in the grey jacket, you're on camera, police are on the way” — ends a surprising share of incidents before anything is taken. The intervention, not the recording, is the product.</p><p><em>Which is no longer theoretical — a whole industry now runs on it.</em></p><h2 id="whos-actually-running-proactive-right-now"><strong>Who's actually running proactive right now</strong></h2><p>Proactive surveillance isn't a forecast; it's a live market, sorted into a few models worth recognizing.</p><ul><li><strong>Remote video monitoring — guarding by camera. </strong>Staffed centers watch live feeds from unmanned sites and intervene by talk-down or by dispatching patrols and police. It's the dominant proactive model for construction sites, car dealerships, scrap yards, and after-hours commercial premises — anywhere a physical guard is expensive and a camera plus a remote operator is cheaper. Providers such as Deep Sentinel and Stealth Monitoring build on this model.</li><li><strong>AI video management with real-time alerting. </strong>VMS platforms that run classification on live streams and surface events to an operator as they happen, rather than leaving them in an archive. This is the layer that lifts the operator-to-camera ratio.</li><li><strong>License-plate recognition networks. </strong>Systems that read plates at scale and alert on flagged vehicles automatically — Flock Safety is the prominent example, widely deployed alongside law enforcement. This is proactive at city scale, and also the model drawing the most scrutiny, which is worth understanding before adopting it.</li><li><strong>Weapon and gunshot detection. </strong>Audio and vision systems that flag a firearm or a shot and alert within seconds. The category is real and growing, and also contested on accuracy and civil-liberties grounds — another reason to test claims rather than take them at face value.</li></ul><p><em>All of which makes proactive sound like the obvious upgrade. It isn't always, and saying so is the honest part.</em></p><h2 id="where-reactive-is-still-the-right-call"><strong>Where reactive is still the right call</strong></h2><p>Proactive costs more and carries more risk, and plenty of sites shouldn't buy it. It needs live monitoring — staffed or automated — which reactive doesn't; it runs on classification that still produces false positives, and every false positive either wastes a response or erodes trust in the system; and the intervention models raise real privacy and legal questions, especially the ones that loop in law enforcement automatically. For a site whose job is to document what happened — a warehouse tracking inventory loss, a facility gathering evidence for claims — reactive is cheaper, simpler, and sufficient. The upgrade to proactive is worth it only when stopping the event, not recording it, is the actual goal.</p><p><em>And when it is the goal, everything depends on one thing that rarely gets discussed: the live path itself.</em></p><h2 id="what-proactive-actually-requires-to-run"><strong>What proactive actually requires to run</strong></h2><p>Every proactive model above shares one hard dependency: the live stream has to reach the person or system that acts on it, fast. Talk-down at a ten-second delay is theater — the intruder is gone before the operator can speak. Verified response depends on an operator seeing the event as it happens, not seconds behind. So the response loop is only as good as the latency of the live path underneath it, and that's an infrastructure decision, not a feature.</p><ul><li><strong>Build on open source. </strong>Media servers like go2rtc or MediaMTX get camera feeds into a browser at low latency, run by you. Right when you have the team and want to own the path.</li><li><strong>Use a managed relay. </strong>Fastest to a working live view; your feeds route through a third party and you pay per stream. Right when speed beats ownership.</li><li><strong>Deploy a commercial platform. </strong>A full low-latency media stack you run on-premise or as managed cloud under a flat license. Samvyo is one such option: based on SFU architecture, it delivers live feeds to the browser at sub-second latency — the precondition for talk-down and verified response — while the media path, TURN, and recording stay under your control and the platform remains resilient by design. It ships the same embeddable SDKs a CPaaS gives you, plus on-prem/managed deployment and white-label depth. Where it doesn't fit: a site that only needs an archive to review later, where reactive infrastructure is enough.</li></ul><p><em>Which leaves one question to settle before anything else.</em></p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Reactive surveillance records what happened; proactive surveillance tries to change it. The difference isn't a better camera — it's a response loop, detect through resolve, whose two middle stages (classify the event, verify it live) separate genuine proactive from a faster alert. Classification makes it affordable by lifting the operator-to-camera ratio; verification makes it effective by enabling talk-down and priority dispatch. And all of it rests on a live path fast enough to act on. Name whether your goal is evidence or intervention, and which system you need writes itself.</p><h2 id="whats-next"><strong>What's Next?</strong></h2><p>Want the mechanism behind that “live path fast enough to act on”? The companion piece on the blind five seconds explains why expanding a live feed can cost you the exact moment you're watching for, and how to close that gap.</p><p><strong>→ <em>T</em></strong><a href="https://samvyo.com/blog/the-blind-five-seconds-what-live-view-latency-costs-you-on-a-video-wall?ref=samvyo.com" rel="noreferrer"><strong><em>he Blind Five Seconds: What Live View Latency Costs You on a Video Wall</em></strong></a></p><p><strong>→ </strong><a href="https://samvyo.com/blog/what-is-an-sfu-and-why-does-every-video-platform-use-one?ref=samvyo.com" rel="noreferrer"><strong><em>What Is an SFU — and Why Does Every Video Platform Use One?</em></strong></a>&nbsp;</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><h3 id="whats-the-difference-between-proactive-and-reactive-surveillance"><strong>What's the difference between proactive and reactive surveillance?</strong></h3><p>Reactive surveillance records events for review after the fact — evidence. Proactive surveillance detects, classifies, and verifies events on the live stream so someone can intervene while they're still happening. The dividing line is whether the system can change the outcome or only document it.</p><h3 id="is-most-%E2%80%9Cproactive%E2%80%9D-surveillance-actually-proactive"><strong>Is most “proactive” surveillance actually proactive?</strong></h3><p>Often not. A lot of it is reactive with a faster alert — a real-time notification is still a reaction to something that's already started. Genuine proactive adds classification to filter false alarms and verification to confirm a live threat, so a response can happen before the event completes.</p><h3 id="what-is-a-talk-down-in-surveillance"><strong>What is a talk-down in surveillance?</strong></h3><p>It's a live verbal intervention: an operator watching a feed speaks through an on-site speaker to warn an intruder they've been seen and that help is coming. It ends a meaningful share of incidents before any loss occurs — and it only works if the live video reaches the operator with sub-second latency.</p><h3 id="why-does-proactive-surveillance-need-low-latency"><strong>Why does proactive surveillance need low latency?</strong></h3><p>Because intervention is time-bound. Talk-down and verified dispatch depend on an operator seeing the event as it happens; a multi-second delay means acting on something that's already over. Proactive models run on a live path fast enough to respond to, which is why transport latency is an infrastructure decision, not a detail.</p><h3 id="how-many-cameras-can-one-operator-monitor-proactively"><strong>How many cameras can one operator monitor proactively?</strong></h3><p>It depends entirely on the false-positive rate. Without filtering, a handful before fatigue sets in. With AI classification that only surfaces genuine events, one operator can cover fifty or more. That ratio is the core economics of proactive monitoring.</p><h3 id="does-samvyo-provide-proactive-surveillance"><strong>Does Samvyo provide proactive surveillance?</strong></h3><p>Samvyo isn't a monitoring service — it's the video infrastructure underneath one. Based on SFU architecture, it delivers live camera feeds to a browser at sub-second latency, the precondition for talk-down and verified response, and it keeps the media path, TURN, and recording under your control while remaining resilient by design.</p>]]></content:encoded></item><item><title><![CDATA[Enterprise Video Conferencing Architecture: What Actually Runs Behind the Six Enterprise Checks]]></title><description><![CDATA[Six enterprise checks reduce to one architectural question: how much of the media path can you actually run? This technical companion walks each — deployable stack, server-side recording, scaled SFUs, admin APIs, failover behind the SLA, and white-label — layer by layer.]]></description><link>https://www.samvyo.com/blog/enterprise-video-conferencing-architecture-what-actually-runs-behind-the-six-enterprise-checks</link><guid isPermaLink="false">6a9066e58b45c3f0cd63a438</guid><category><![CDATA[enterprise video solutions]]></category><category><![CDATA[Video Conferencing Infrastructure]]></category><category><![CDATA[On-prem Video Conferencing]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Tue, 01 Sep 2026 05:06:55 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/08/ChatGPT-Image-Aug-28--2026--10_57_06-AM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/08/ChatGPT-Image-Aug-28--2026--10_57_06-AM.png" alt="Enterprise Video Conferencing Architecture: What Actually Runs Behind the Six Enterprise Checks"/><p>If you arrived from the <a href="https://www.samvyo.com/what-enterprise-grade-actually-means-for-video-conferencing-and-what-vendors-hide-behind-the-label?ref=samvyo.com" rel="noreferrer">business version</a>, &nbsp;you already have the six checks that separate real enterprise video from a rebranded consumer app: deployment control, recording with an audit trail, concurrent scale, admin APIs, contractual SLAs, and white-label depth. This is the companion “how.” Enterprise video conferencing architecture is what decides whether a vendor can actually pass those checks or just claim them — because five of the six are downstream consequences of one design decision, and the sixth is how you prove it.</p><p>We won’t re-argue the buying case. We go straight to the wiring: what runs under each check, where the media flows, and what you own at each layer — so the technical evaluation matches the business one instead of drifting from it.</p><p><em>Start with the one test that predicts the other five.</em></p><h2 id="the-architecture-test-if-you-can%E2%80%99t-deploy-it-it%E2%80%99s-saas-with-a-bigger-price-tag">The Architecture Test: If You Can’t Deploy It, It’s SaaS With a Bigger Price Tag</h2><p>Here is the single question that sorts enterprise video conferencing architecture from consumer software wearing an enterprise price: can the media and recordings run somewhere the vendor doesn’t control? If the honest answer is no — if the media path, TURN, and recording only ever live in the vendor’s multi-tenant cloud — then every other “enterprise” claim is bounded by that fact.</p><p>That’s because deployment isn’t one feature among six. It’s the variable the others depend on. Where the media path physically runs determines whether you can guarantee residency, whether recordings land in storage you control, whether your brand can reach all the way down, and whether you can scale on infrastructure you provision. A platform that can’t leave its own cloud can bolt on SSO, a bigger seat cap, and a nicer dashboard — but it cannot change the answer to “whose machines is the video on.”</p><p>So the six checks aren’t a flat checklist. They’re one architectural fork — how much of the stack you can run — expressed six ways. The rest of this piece walks each one as an architecture, not a feature.</p><p><em>Here’s the whole map before we expand it.</em></p><h2 id="the-six-criteria-as-architecture">The Six Criteria as Architecture</h2><p>Each check reduces to a concrete part of the stack. Consumer platforms and enterprise-grade infrastructure differ not in whether the feature exists, but in where it runs and who owns it.</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    border: 1px solid rgba(128, 128, 128, 0.4);
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 10px 16px;
    color: inherit;
    background: transparent;
    vertical-align: top;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18);
    font-weight: 700;
  }
</style>
<table class="rate-table">
  <colgroup><col width="167"><col width="229"><col width="229"/></col></col></colgroup>
  <thead>
    <tr>
      <th>Check</th>
      <th>Consumer / SaaS build</th>
      <th>Enterprise-grade architecture</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Deployment control</td>
      <td>Multi-tenant cloud only</td>
      <td>Media, TURN &amp; recording on infra you control</td>
    </tr>
    <tr>
      <td>Recording + audit</td>
      <td>Client/cloud capture, vendor storage</td>
      <td>Server-side egress into storage you control</td>
    </tr>
    <tr>
      <td>Concurrent scale</td>
      <td>Fixed shared capacity</td>
      <td>Elastic, resilient by design</td>
    </tr>
    <tr>
      <td>Admin APIs</td>
      <td>Dashboard, limited API</td>
      <td>Full provisioning API + webhooks</td>
    </tr>
    <tr>
      <td>SLA</td>
      <td>Advertised uptime</td>
      <td>Engineered redundancy + failover</td>
    </tr>
    <tr>
      <td>White-label / OEM</td>
      <td>Logo + color theming</td>
      <td>Media &amp; recordings under your brand and domain</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p/><h3 id="1-deployment-control-%E2%80%94-media-and-recordings-on-your-infrastructure">1. Deployment control — media and recordings on your infrastructure</h3><p>The dividing line is whether the parts that matter to you run where you control them. On an enterprise-grade platform, the media path, STUN/TURN for NAT traversal, and the recording pipeline — processing and storage — sit on infrastructure you specify, on-premise or in a single-tenant cloud, so your video and your recordings never leave an environment you own. A consumer platform hands you a client SDK in front of a media backend you can never touch. You can tell the two apart in one question: can the media and recordings run on your own infrastructure, or only in “our cloud”? Everything below depends on this answer.</p><h3 id="2-recording-with-an-audit-trail-%E2%80%94-server-side-egress">2. Recording with an audit trail — server-side egress</h3><p>A record button captures a file; an audit trail is a pipeline. Enterprise recording runs server-side: a dedicated egress service (often a headless client or a media-server capture path) writes streams into storage you control, with your encryption keys, your retention policy, and an access log on every retrieval. Client-side or vendor-cloud recording inverts all three — the vendor holds the file, the region, and the access model, and you inherit whatever they log. The architectural test is where the egress writes and who can read it, not whether “recording” appears on the feature list.</p><h3 id="3-concurrent-session-scale-%E2%80%94-horizontal-sfus-not-a-bigger-box">3. Concurrent session scale — horizontal SFUs, not a bigger box</h3><p>Scale here means many simultaneous sessions, not one large call — and that’s a capacity problem, not a bigger-box problem. <a href="https://samvyo.com/blog/scaling-video-cost-what-happens-when-one-media-server-isnt-enough?ref=samvyo.com">A single media node has a ceiling</a>; enterprise-grade platforms are built to spread sessions across many nodes and to cascade between them so one meeting can span more than one server, staying resilient as load climbs and degrading gracefully when a node saturates. What you should look for is elastic capacity under peak and predictable behavior at the edges — resiliency engineered into the platform, not something you hand-tune. A platform built for a predictable consumer load curve simply isn’t designed for this, which is why “scales to your needs” with no numbers is a non-answer.</p><h3 id="4-admin-and-provisioning-apis-%E2%80%94-surface-area-and-webhooks">4. Admin and provisioning APIs — surface area and webhooks</h3><p>Programmatic control is an API-surface question. Enterprise architecture exposes room creation, token issuance (the <a href="https://samvyo.com/blog/what-is-a-video-room-api-and-how-is-it-different-from-a-video-sdk?ref=samvyo.com">video room API</a> layer), user provisioning and deprovisioning, role-based access, and usage export as first-class API calls — plus webhooks for the events your systems must react to (participant joined, recording ready, session ended). A dashboard is that same surface with a human clicking it. If the automatable surface is thin — a few endpoints and no event callbacks — you’ll hit the wall the moment provisioning has to run at your scale rather than a rep’s.</p><h3 id="5-sla-guarantees-%E2%80%94-the-redundancy-that-backs-the-number">5. SLA guarantees — the redundancy that backs the number</h3><p>An SLA is only as real as the architecture underneath it. A contractual 99.9%+ commitment implies engineered redundancy: no single point of failure in the media path, failover between nodes and ideally regions, health checks that pull bad nodes out of rotation, and geo-distribution so one region’s outage isn’t a total one. A vendor that can’t describe how its platform fails over is quoting a marketing number. The architecture question behind the SLA is simply: what happens when a media node dies mid-session, and how fast does the next one take over?</p><h3 id="6-white-label-and-oem-depth-%E2%80%94-two-layers-not-one">6. White-label and OEM depth — two layers, not one</h3><p>Buyers routinely merge two separate layers. Interface branding — your UI, built on media primitives rather than an iframe — gets you a pixel-perfect front end, but if the media still traverses the vendor’s cloud, white-label stops at the interface. Infrastructure ownership — your brand and domain, with the media path and recordings on infrastructure you control and no upstream trace where it matters — is the deeper layer, and only a platform that runs the media on your own infrastructure delivers it. An iframe embed is the shallow end (their UI, restyled); full primitives with the media and recordings under your control is the deep end. OEM buyers almost always mean the deep end, even when they say “branding.”</p><p><em>Put the six together and build-versus-buy stops being a philosophy and becomes a specification.</em></p><h2 id="build-buy-or-deploy-an-enterprise-video-conferencing-architecture">Build, Buy, or Deploy an Enterprise Video Conferencing Architecture</h2><p>Three approaches, one axis — how much of the media path you want to own:</p><ul><li><strong>Build on open source. </strong>Assemble and operate the stack yourself — SFU, signaling, TURN, recording, scaling, failover. Total control, total operational surface. Right when video is core to the product and you have the real-time specialists to run a distributed system.</li><li><strong>Buy a cloud API / CPaaS. </strong>A client SDK in front of the vendor’s SFU cloud, billed per participant-minute. Fastest to production; least control over media path, residency, and the recording location. Right when speed outweighs ownership and vendor-cloud routing is acceptable.</li><li><strong>Deploy a commercial platform. </strong>The media path, TURN, and recording — processing and storage — delivered onto infrastructure you control, on-premise or in a single-tenant cloud, flat-licensed and resilient by design. The middle path: control of the media and data that matter to you, without assembling the stack yourself.</li></ul><p>Samvyo is one option in that last category: SFU-based real-time video infrastructure where the media path, TURN, and recording run on infrastructure you control, flat-licensed and resilient by design, with white-label/OEM depth and the same embeddable SDKs you’d get from a CPaaS provider. It fits when the six checks include controlling where the media and recordings live and shipping under your own brand — and it’s more than the problem needs if a call button on vendor-cloud routing would do.</p><p><em>Which leaves the questions engineers ask when they map the checks to a stack.</em></p><h2 id="what%E2%80%99s-next">What’s Next?</h2><p><strong><em>Want the decision-maker’s version — the six checks as a buying test, the red flags, and how to place your use case without the wiring? </em></strong>The companion business piece frames the same six criteria as a decision you can forward to a non-engineer stakeholder: <strong>link to </strong><a href="https://www.samvyo.com/what-enterprise-grade-actually-means-for-video-conferencing-and-what-vendors-hide-behind-the-label?ref=samvyo.com" rel="noreferrer"><strong>business version</strong></a></p><h2 id="frequently-asked-questions">Frequently Asked Questions</h2><h3 id="what-is-enterprise-video-conferencing-architecture">What is enterprise video conferencing architecture?</h3><p>It’s the stack that runs multi-party video — the SFU (media server), signaling, STUN/TURN for NAT traversal, and the recording pipeline — plus how those are deployed, scaled, and owned. What makes an architecture “enterprise” is that the media and recordings can run on infrastructure you control, and you can prove where they live, not just that it holds a meeting.</p><h3 id="why-does-deployment-control-decide-the-other-enterprise-criteria">Why does deployment control decide the other enterprise criteria?</h3><p>Because residency, recording location, white-label depth, and scale all depend on where the media path physically runs. A platform locked to its own multi-tenant cloud can add SSO and seats but can’t change whose machines the video is on — so it can’t fully satisfy the checks that depend on that answer.</p><h3 id="can-enterprise-video-conferencing-be-self-hosted-in-the-cloud-or-only-on-premise">Can enterprise video conferencing be self-hosted in the cloud, or only on-premise?</h3><p>Both. It means the media path, TURN, and recording — processing and storage — run on infrastructure you control, either on-premise in your own data centre or in a single-tenant cloud region you choose. What separates it from a cloud API is that the parts that matter to you are dedicated and flat-licensed, not multi-tenant and per-minute.</p><h3 id="what-sla-architecture-should-enterprise-video-have">What SLA architecture should enterprise video have?</h3><p>Redundancy with no single point of failure in the media path, failover between nodes and ideally regions, health checks that evict bad nodes, and geo-distribution. A contractual 99.9%+ number is only credible if the platform can describe what takes over when a media node fails mid-session.</p><h3 id="does-white-label-mean-the-same-thing-as-owning-the-infrastructure">Does white-label mean the same thing as owning the infrastructure?</h3><p>No — they’re two layers. Interface branding (your UI on media primitives) is achievable with a video SDK. Infrastructure ownership (your brand and domain, with the media and recordings on infrastructure you control and no upstream trace where it matters) is the deeper layer. Enterprise and OEM buyers usually need both; a Video SDK alone only gives the first.</p>]]></content:encoded></item><item><title><![CDATA[What “Enterprise-Grade” Actually Means for Video Conferencing — and What Vendors Hide Behind the Label]]></title><description><![CDATA[Every vendor sells an 'Enterprise' plan; almost none tell you what it buys. On most platforms it's just the top pricing tier on a consumer product. Here are the six checks — deployment, recording, scale, APIs, SLAs, white-label — that separate real enterprise video from a rebrand.]]></description><link>https://www.samvyo.com/blog/what-enterprise-grade-actually-means-for-video-conferencing-and-what-vendors-hide-behind-the-label</link><guid isPermaLink="false">6a9066068b45c3f0cd63a434</guid><category><![CDATA[enterprise video solutions]]></category><category><![CDATA[video conferencing integration]]></category><category><![CDATA[video API integration]]></category><category><![CDATA[decision guide]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Tue, 01 Sep 2026 05:06:24 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/08/ChatGPT-Image-Aug-28--2026--10_20_26-AM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/08/ChatGPT-Image-Aug-28--2026--10_20_26-AM.png" alt="What “Enterprise-Grade” Actually Means for Video Conferencing — and What Vendors Hide Behind the Label"/><p>Every video vendor sells an “Enterprise” plan. Almost none of them will tell you what the word buys you. On most pricing pages, enterprise video conferencing is simply the top billing row — the same consumer product with SSO, a higher seat cap, and a sales rep attached. The infrastructure underneath is identical to the free tier.</p><p>That gap matters when you’re the one signing a contract that has to survive an audit, a security review, and a few thousand concurrent users. If you already know you need enterprise video, the real question isn’t which tier — it’s whether “enterprise” on the label means anything at all. This piece gives you six concrete checks to tell the real thing from a rebranded consumer app, and the red flags that give the rebrand away.</p><p><em>Start with why the label is so easy to abuse.</em></p><h2 id="%E2%80%9Centerprise%E2%80%9D-is-a-pricing-tier-not-a-guarantee">“Enterprise” Is a Pricing Tier, Not a Guarantee</h2><p>There’s no certification you have to pass to call your product enterprise-grade. No auditor signs off. The word is marketing, and it’s applied to the top of the price ladder by default — which means a platform architected for casual team calls can wear the same badge as one built for regulated, high-scale deployment.</p><p>The tell is what changes when you move up the tiers. On genuine enterprise infrastructure, the architecture changes: you can deploy it differently, scale it differently, govern it differently. On a rebranded consumer product, only the invoice changes. You get SSO, longer meeting limits, a dashboard with more toggles — bolted onto the exact same SaaS backend everyone else uses.</p><p>So the question to hold every vendor against isn’t “do they have an enterprise plan.” It’s “what actually differs at the enterprise tier besides the price.” The next six criteria are how you answer that.</p><p><em>Here’s what genuinely separates the two.</em></p><h2 id="the-6-things-that-separate-enterprise-grade-from-rebranded-consumer-video">The 6 Things That Separate Enterprise-Grade From Rebranded Consumer Video</h2><p>Each of these follows the same pattern: what it means, what vendors claim, and what you should actually verify before you believe them.</p><h3 id="1-deployment-control">1. Deployment control</h3><p><em>What it means: </em>You choose where the media runs — your own infrastructure (on-prem), a single-tenant managed cloud, or a public multi-tenant SaaS. Enterprise buyers often can’t legally or contractually put their traffic on shared infrastructure.</p><p><em>What vendors claim: </em>“Enterprise-grade cloud.”</p><p><em>What you verify: </em>Ask whether you can run it on your own infrastructure or in a dedicated single-tenant environment. If the only answer is “our cloud,” you’re buying SaaS. Deployment control is the single hardest criterion to fake, which is why it’s first — a consumer platform can add SSO overnight but can’t hand you a deployable build.</p><h3 id="2-recording-with-an-audit-trail">2. Recording with an audit trail</h3><p><em>What it means: </em>Recording that captures not just the video but who accessed it, when, and from where — with retention you control and tamper-evidence you can prove.</p><p><em>What vendors claim: </em>“Cloud recording included.”</p><p><em>What you verify: </em>A record button is not an audit trail. Ask where recordings are stored, who can retrieve them, whether every access is logged, and whether you set the retention period. Consumer recording gives you a file; enterprise recording gives you a defensible chain of custody.</p><h3 id="3-concurrent-session-scale">3. Concurrent session scale</h3><p><em>What it means: </em>Hundreds or thousands of simultaneous sessions without degradation — not a single large meeting, but many meetings at once across your whole org.</p><p><em>What vendors claim: </em>“Scales to your needs.”</p><p><em>What you verify: </em>Get numbers. Concurrent sessions, not participants in one call. Ask what happens at peak and whether capacity is contractual. Consumer platforms are engineered for a predictable load curve; enterprise ones are engineered for yours.</p><h3 id="4-admin-and-provisioning-apis">4. Admin and provisioning APIs</h3><p><em>What it means: </em>Programmatic control — create rooms, issue tokens, provision and deprovision users, pull usage data — through an API, not by clicking around a dashboard.</p><p><em>What vendors claim: </em>“Full admin dashboard.”</p><p><em>What you verify: </em>Ask for the API docs, not the dashboard tour. Can you automate user lifecycle and room creation? Are there webhooks for events you need to react to? A dashboard is a person doing work by hand; an API is your systems doing it at scale.</p><h3 id="5-sla-guarantees">5. SLA guarantees</h3><p><em>What it means: </em>A contractual uptime commitment with defined consequences — service credits, escalation paths, response times — signed, not advertised.</p><p><em>What vendors claim: </em>“99.9% uptime.”</p><p><em>What you verify: </em>Is that number in the contract, and what do you get when they miss it? A marketing-page uptime figure with no credit structure is a wish. An SLA is a liability the vendor has accepted in writing.</p><h3 id="6-white-label-and-oem-depth">6. White-label and OEM depth</h3><p><em>What it means: </em>Your brand, end to end — not just a logo in the corner, but the ability to embed the experience so deeply that your users never see the vendor’s name.</p><p><em>What vendors claim: </em>“Custom branding available.”</p><p><em>What you verify: </em>Ask how far the branding goes. Logo upload and a color picker is theming. True white-label / OEM means the vendor is invisible in the product, the URLs, and the client. If you’re building this into a product you sell, that difference is everything.</p><p><em>Once you know the six, the fakes get easy to spot.</em></p><h2 id="red-flags-%E2%80%94-when-%E2%80%9Centerprise%E2%80%9D-is-just-a-bigger-price-tag">Red Flags — When “Enterprise” Is Just a Bigger Price Tag</h2><p>You don’t always have time to run all six checks. These shortcuts usually give the rebrand away:</p><ul><li><strong>SaaS-only, no deployment option. </strong>If “where does it run” has exactly one answer, deployment control isn’t on the table.</li><li><strong>“99.9% uptime” with no SLA credits. </strong>A number with no consequence attached is copy, not a commitment.</li><li><strong>A record button but no access log. </strong>Recording without an audit trail is a consumer feature wearing an enterprise name.</li><li><strong>A dashboard but no API. </strong>If administration only happens by hand, it won’t survive your scale.</li><li><strong>“Custom branding” that stops at a logo. </strong>Theming is not white-label.</li></ul><p>Any one of these can be acceptable depending on your use case. Two or three together usually mean the “Enterprise” tier is a price, not an architecture.</p><p><em>So who actually delivers these, and who just charges for them?</em></p><h2 id="the-provider-landscape-%E2%80%94-who-actually-delivers-what">The Provider Landscape — Who Actually Delivers What</h2><p>The market sorts into three archetypes, and knowing which one you’re talking to tells you most of what you need before the first sales call.</p><p><strong>Consumer platforms with enterprise tiers. </strong>Built for individual and team meetings, with an enterprise plan layered on top. Strong for internal collaboration and turnkey deployment. Weaker where you need to control deployment, embed deeply, or govern recordings on your own terms — because the underlying architecture was never meant to leave their cloud.</p><p><strong>CPaaS / SDK providers. </strong>You get building blocks — APIs and SDKs to add video into your own product. Far more programmatic control and embed depth than a consumer platform. The trade-offs live in pricing at scale and, usually, the same multi-tenant-cloud constraint on where media runs.</p><p><strong>Self-hostable / OEM infrastructure</strong>— typically <a href="https://samvyo.com/blog/what-is-an-sfu-and-why-does-every-video-platform-use-one?ref=samvyo.com">SFU-based</a><strong>. </strong>Video infrastructure you can deploy on your own environment and ship under your own brand. This is the only archetype that can satisfy deployment control and full white-label depth at the same time — at the cost of taking on more of the operational responsibility yourself.</p><p>None of these is “the enterprise one.” They’re three different trades. Which one is right depends on how many of the six criteria are non-negotiable for you.</p><p><em>That maps directly onto the oldest decision in this space.</em></p><h2 id="build-buy-or-deploy-%E2%80%94-matching-the-6-criteria-to-a-model">Build, Buy, or Deploy — Matching the 6 Criteria to a Model</h2><p>Score your six criteria by which are hard requirements, then match:</p><ul><li><strong>Buy (consumer enterprise tier) </strong>if your needs are internal collaboration and turnkey rollout, and deployment control and OEM depth aren’t requirements.</li><li><strong>Build on a CPaaS/SDK </strong>if you need programmatic control and embed depth, and you can live with their cloud and their pricing curve — see <a href="https://samvyo.com/blog/what-happens-when-your-video-api-provider-gets-acquired-or-shuts-down?ref=samvyo.com">what happens when your provider gets acquired or shuts down</a> before you commit to one.</li><li><strong>Deploy your own infrastructure </strong>if deployment control, data governance, and white-label depth are non-negotiable — for regulated environments or when video is part of a product you sell.</li></ul><p>Samvyo sits in that last category — but it isn’t a trade-down from the SDK tier to get there. It ships the same embeddable SDKs a CPaaS provider gives you, and adds what they can’t: full OEM/white-label depth and a managed-service option, all on infrastructure that runs on-premise or as managed cloud under flat licensing. In short, everything the SDK vendors offer, plus the deployment control and branding they don’t — for teams whose six criteria include controlling where the media runs and whose name is on the product. It’s one option among the three trades above, and the right one only if deployment and branding are where your requirements actually are.</p><p><em>Which leaves the questions buyers ask most.</em></p><h2 id="what%E2%80%99s-next">What’s Next?</h2><p><strong><em>Want the engineering-level version — how deployment isolation, server-side recording, SFU scaling, admin APIs, and white-label actually work under the hood? </em></strong>The companion technical deep-dive walks the architecture behind each of the six criteria, for the team that has to build or evaluate it: <strong>link to </strong><a href="https://www.samvyo.com/enterprise-video-conferencing-architecture-what-actually-runs-behind-the-six-enterprise-checks?ref=samvyo.com" rel="noreferrer"><strong>technical version</strong></a></p><h2 id="frequently-asked-questions">Frequently Asked Questions</h2><h3 id="what-makes-video-conferencing-enterprise-grade">What makes video conferencing enterprise-grade?</h3><p>Not a pricing tier — an architecture. Genuine enterprise video gives you deployment control, recording with an audit trail, contractual SLAs, admin APIs, real concurrent scale, and true white-label depth. If moving up a tier only changes the invoice and not what you can deploy or govern, it isn’t enterprise-grade.</p><h3 id="is-a-%E2%80%9Cconsumer-enterprise-tier%E2%80%9D-actually-enterprise-grade">Is a “consumer enterprise tier” actually enterprise-grade?</h3><p>Sometimes — for internal collaboration at scale, those tiers are capable. Where they’re weakest is deployment control and OEM depth: they run on the vendor’s cloud, under the vendor’s brand. Whether that counts as enterprise-grade depends on whether those two criteria matter to you.</p><h3 id="can-i-self-host-enterprise-video-conferencing">Can I self-host enterprise video conferencing?</h3><p>Yes. Self-hostable infrastructure like Samvyo runs on your own environment or as managed single-tenant cloud — with the same embeddable SDKs you’d get from a CPaaS provider, plus OEM and managed-service options — which is the only way to guarantee where your media lives and to ship the experience under your own brand.</p><h3 id="what-sla-should-enterprise-video-have">What SLA should enterprise video have?</h3><p>A contractual uptime commitment — typically 99.9% or higher — with defined service credits and escalation paths when it’s missed. A number on a marketing page with no credit structure behind it isn’t an SLA.</p>]]></content:encoded></item><item><title><![CDATA[What Happens When Your Video API Provider Gets Acquired — or Shuts Down]]></title><description><![CDATA[Twilio announced the end of its video API, then reversed. Dyte got acquired and folded into Cloudflare. When you build on a video API, the roadmap belongs to someone else — and it can move without your consent. Two real cases, and five portability questions to ask before you sign.]]></description><link>https://www.samvyo.com/blog/what-happens-when-your-video-api-provider-gets-acquired-or-shuts-down</link><guid isPermaLink="false">6a9067118b45c3f0cd63a43c</guid><category><![CDATA[video API integration]]></category><category><![CDATA[video API provider]]></category><category><![CDATA[Proprietary video SDKs]]></category><category><![CDATA[Real-world cases]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Tue, 01 Sep 2026 05:06:05 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/08/ChatGPT-Image-Aug-28--2026--10_58_43-AM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/08/ChatGPT-Image-Aug-28--2026--10_58_43-AM.png" alt="What Happens When Your Video API Provider Gets Acquired — or Shuts Down"/><p>Sometime in 2024, a lot of engineering teams got the same unwelcome news: the video API their product was built on was being discontinued. The company was Twilio, the product was Programmable Video, and for a stretch the plan was that it would simply stop working. Then Twilio reversed course — but the lesson didn’t reverse with it. Video API vendor risk — the chance that the provider underneath your product changes course, gets acquired, or disappears — isn’t a tail scenario. It’s a structural feature of building real-time video on someone else’s infrastructure. This piece walks two real cases from the last two years, then gives you five portability questions to ask before you sign the next contract.</p><p><em>Start with why the risk is baked in, not bolted on.</em></p><h2 id="the-roadmap-you-rent">The Roadmap You Rent</h2><p>When you embed a video API, you aren’t buying a capability — you’re renting a roadmap. The media servers, the SDKs, the pricing model, the compliance posture, the support you depend on all belong to the vendor. Every one of them can change under you on the vendor’s timeline, not yours. That’s the trade you make for shipping fast, and for most teams it’s a reasonable one.</p><p>The problem is how the trade gets evaluated. Teams pick a provider on features and per-minute price at signing time, and almost never on exit cost — what it would take to leave if they had to. That asymmetry is exactly where video api vendor risk lives: it’s invisible on the day you choose, and expensive on the day the choice is taken away from you. Two recent stories show what that day actually looks like.</p><p><em>The first one is the provider that announced its own shutdown.</em></p><h2 id="case-one-twilio-announced-the-end-of-its-video-product-%E2%80%94-then-took-it-back">Case One: Twilio Announced the End of Its Video Product — Then Took It Back</h2><p>In late 2023, Twilio announced that Programmable Video, its real-time video API, would reach end-of-life — originally on December 5, 2024. Customers were told to plan a migration; Twilio even stopped onboarding new accounts. Then in March 2024, after customer pushback, it pushed the deadline back by two years to December 5, 2026 — and in October 2024 it reversed the decision entirely. Programmable Video remains a supported, generally available product today, still open to new accounts.</p><p>A happy ending, on paper. But look at what happened in the middle. Teams that took the announcement seriously did the responsible thing and started evaluating <strong>Twilio alternatives</strong> — scoping migrations, re-architecting around other providers, spending real engineering cycles on a move they hadn’t planned. Roadmaps froze while the question hung open. And even after the reversal, the fact underneath it didn’t un-happen: this is a provider that will put a core product on the chopping block when the business case shifts. The reversal restores the product; it doesn’t restore the assumption that the product is permanent.</p><p>That’s the first shape of vendor risk — discontinuation, or the credible threat of it. The second shape is quieter, and arguably more common.</p><p><em>Because a provider doesn’t have to shut down to change what you depend on. It can just get bought.</em></p><h2 id="case-two-dyte-got-acquired-%E2%80%94-and-became-a-feature-in-someone-else%E2%80%99s-stack">Case Two: Dyte Got Acquired — and Became a Feature in Someone Else’s Stack</h2><p>Dyte was a well-regarded video and voice API, popular with teams who wanted a modern SDK without building their own infrastructure. In April 2025, Cloudflare acquired Dyte and folded its technology into RealtimeKit, Cloudflare’s real-time offering.</p><p>Nothing “broke” in the dramatic sense — the product didn’t vanish overnight. But an acquisition redirects a roadmap by definition. Priorities realign to the acquirer’s strategy. A standalone product you chose on its own merits becomes one component inside a larger platform, positioned to serve that platform’s goals. The independent pricing, support relationship, and roadmap you signed up for are now subject to someone else’s decisions. Even when an acquisition is a good outcome for the company, it changes the thing you were depending on — and you had no vote.</p><p>Put the two cases side by side and the pattern is clear: whether a provider shuts down, threatens to, or gets absorbed, the common thread is that the roadmap moved and you were a passenger. So what, concretely, breaks when that happens?</p><p><em>The failure isn’t usually “the API turns off.” It’s subtler than that.</em></p><h2 id="what-actually-breaks-when-a-provider-exits">What Actually Breaks When a Provider Exits</h2><p>“Vendor shuts down” sounds binary, but the real damage arrives as a set of smaller failures — most of which hit even when the product technically survives:</p><ul><li><strong>Forced migration timelines. </strong>You migrate on the vendor’s clock, not yours — often mid-roadmap, pulling engineers off the work that actually differentiates your product.</li><li><strong>Frozen SDKs and versions. </strong>Once a product is deprioritized or in wind-down, SDK updates slow or stop. You’re now shipping on a platform that isn’t moving while browsers and OSes underneath it are.</li><li><strong>Pricing renegotiation. </strong>New ownership or a new strategy often means new prices. The per-minute rate that penciled out at signing can move once you’re embedded and switching is expensive.</li><li><strong>Support and SLA degradation. </strong>The responsive team you evaluated can thin out after an exit or acquisition, exactly when you need them most.</li><li><strong>Compliance and BAA continuity. </strong>If you rely on a business-associate agreement or a specific data-residency guarantee, an ownership change can put that continuity in question.</li><li><strong>Data and recording export. </strong>Getting your recordings, logs, and metadata out in a usable form is rarely a one-click operation — and it’s hardest to arrange after the relationship has soured.</li></ul><p>None of these requires a full shutdown. All of them follow from the same root cause: you don’t control the roadmap. Which means the useful question isn’t “will my provider fail” — it’s “how cheaply could I leave if it did.” That’s portability, and it’s something you can evaluate before you ever sign.</p><p><em>Here are the five questions that measure it.</em></p><h2 id="five-portability-questions-to-ask-before-you-sign">Five Portability Questions to Ask Before You Sign</h2><p>Ask these during evaluation, while you still have leverage — not during a migration, when you don’t. Each one turns an invisible exit cost into a visible one.</p><h3 id="1-how-do-i-get-my-data-recordings-and-metadata-out">1. How do I get my data, recordings, and metadata out?</h3><p>Ask for the export path in concrete terms: what formats, what APIs, how much operational work, and whether recordings come out in a standard container or a proprietary one. If there’s no clean egress story, you’re not a customer — you’re a hostage with a monthly invoice.</p><h3 id="2-how-standard-is-the-api-%E2%80%94-how-much-of-a-rewrite-is-switching">2. How standard is the API — how much of a rewrite is switching?</h3><p>The closer a provider’s API sits to open standards (WebRTC primitives, common patterns for rooms, tokens, and tracks), the less your integration has to be rewritten to move. A deeply proprietary surface area is convenient on day one and a cage on the day you want to leave. Measure the integration by how portable it is, not just how fast it ships.</p><h3 id="3-is-there-a-viable-second-source-%E2%80%94-and-can-you-name-it-now">3. Is there a viable second source — and can you name it now?</h3><p>Before you sign, you should be able to name the provider you would migrate to if this one disappeared. If you can’t — if the market has exactly one option that fits — that’s concentration risk you’re accepting knowingly rather than discovering later. Knowing your fallback also tells you how standard your integration needs to be (see question 2).</p><h3 id="4-what-contractual-protections-cover-acquisition-and-end-of-life">4. What contractual protections cover acquisition and end-of-life?</h3><p>Look for notice periods for deprecation, price-change protections for the contract term, data-return obligations on termination, and — where it matters — source or configuration escrow. These clauses feel like paperwork at signing and become the only thing that matters when the roadmap moves. Negotiate them while you’re still the one being courted.</p><h3 id="5-could-you-run-it-yourself-if-you-were-forced-to">5. Could you run it yourself if you were forced to?</h3><p>The strongest portability position is an escape hatch to infrastructure you control — an open-source underpinning you could self-host, or a provider whose stack can be deployed on your own environment. You may never use it. But the option to run the media path yourself caps your downside: the worst case stops being “rebuild from scratch” and becomes “take over the stack you already understand.”</p><p><em>Which raises the obvious follow-up — does owning the infrastructure make the risk disappear?</em></p><h2 id="the-bottom-line">The Bottom Line</h2><p>Twilio’s reversal and Dyte’s acquisition tell the same story from two directions: when you build on a video API, the roadmap belongs to someone else, and it can move without your consent. You can’t eliminate that — but you can measure it. Ask the five questions before you sign, know your second source, and keep an escape hatch to infrastructure you could run yourself. And if you’re weighing that last option, our <a href="https://www.samvyo.com/white-label-video-infrastructure-build-buy-or-embed-a-decision-guide?ref=samvyo.com" rel="noreferrer"><u>guide to building, buying, or embedding video infrastructure</u></a> walks the trade-offs in exactly these terms — ownership, portability, and what each path costs you down the line.</p><h2 id="frequently-asked-questions">Frequently Asked Questions</h2><h3 id="is-twilio-video-still-available">Is Twilio Video still available?</h3><p>Yes. After announcing that Programmable Video would be discontinued and later extending the timeline to December 2026, Twilio reversed the decision in October 2024, and the product remains generally available. The episode is still instructive: a provider that will schedule a core product’s end-of-life once has shown it can do so again.</p><h3 id="what-happened-to-dyte">What happened to Dyte?</h3><p>Dyte was acquired by Cloudflare in April 2025 and folded into RealtimeKit, Cloudflare’s real-time stack. The technology lives on inside a larger platform; the independent product, pricing, and roadmap that customers originally chose are now part of Cloudflare’s strategy.</p><h3 id="does-self-hosting-eliminate-video-api-vendor-risk">Does self-hosting eliminate video API vendor risk?</h3><p>It reduces the sharpest form of it, but doesn’t erase risk entirely — and it’s worth being honest about the difference. Self-hosting or deploying a stack you control means a provider’s shutdown or acquisition can’t force-migrate you: you hold the deployable software and the media path. A platform like Samvyo, which is SFU-based and deploys on-premise or as a managed cloud deployment under a flat license, sits in this category — you own where the media runs. What self-hosting doesn’t remove is your dependence on the underlying technology, your own operational burden, and, for open-source foundations, the health of that project. It changes vendor risk from “they can take it away” to “you’re responsible for keeping it running” — a trade that’s worth it for some teams and overkill for others.</p><h3 id="how-do-i-evaluate-video-api-portability-quickly">How do I evaluate video API portability quickly?</h3><p>Run the five questions above: data export, API standardness, a named second source, contractual protections for EOL and acquisition, and whether you could run it yourself in a pinch. If a provider scores poorly on most of them, treat the low price as a loan against a future migration bill.</p><h3 id="should-vendor-risk-stop-me-from-using-a-cpaas-provider">Should vendor risk stop me from using a CPaaS provider?</h3><p>No — and it shouldn’t be read that way. For plenty of teams a video API is the right call: it ships fast, it’s cheap at low or unpredictable volume, and the risk is manageable if you’ve priced it in. Vendor risk is a factor to evaluate and protect against, not a veto. The goal isn’t to avoid providers — it’s to sign with your eyes open and your exit mapped.</p>]]></content:encoded></item><item><title><![CDATA[What Is a Video Room API — and How Is It Different from a Video SDK?]]></title><description><![CDATA[Everyone reaches for the SDK when they build video. But the SDK only joins the call — something on your server has to create it, guard it, and decide who gets in. That’s the video room API. Here’s what each layer does, and why the split is the difference between a demo and a system.]]></description><link>https://www.samvyo.com/blog/what-is-a-video-room-api-and-how-is-it-different-from-a-video-sdk</link><guid isPermaLink="false">6a956e678b45c3f0cd63a4ad</guid><category><![CDATA[Video room api]]></category><category><![CDATA[video API integration]]></category><category><![CDATA[learning material]]></category><category><![CDATA[api vs sdk]]></category><category><![CDATA[video api guide]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Tue, 01 Sep 2026 05:05:46 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-1--2026--09_57_22-AM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-1--2026--09_57_22-AM.png" alt="What Is a Video Room API — and How Is It Different from a Video SDK?"/><p>If you’ve ever integrated video, you probably started by reaching for an SDK. That’s the part everyone talks about. But an SDK, on its own, can’t create a call, decide who’s allowed into it, or shut it down when it’s over. Something on your server has to do that — and that something is a <strong>video room API</strong>. The two are constantly confused: treated as interchangeable, or assumed to be one product with two names. They aren’t. One runs the session; the other joins it. Getting the split right is the difference between a demo and a system you can actually operate.</p><h2 id="every-video-app-has-two-halves-the-session-and-the-media">Every video app has two halves: the session and the media</h2><p>Before defining either term, notice that every real-time video product is really two systems wearing one name. There’s the session — the room itself: it exists, it has rules, it has a lifespan, it has a guest list. And there’s the media — the camera, the microphone, the frames on screen, the audio in your ear. These live in different places. The session is authoritative and lives on servers; the media is experiential and lives in the browser or the app. A video room API governs the first. A video SDK delivers the second. Almost every point of confusion in this space traces back to collapsing the two into one.</p><p>Start with the half people understand least — the room.</p><h2 id="what-a-video-room-api-actually-is">What a video room API actually is</h2><p>A <strong>video room API</strong> is a server-side interface your backend calls to create, manage, and control video sessions — the “rooms” participants join. It’s the control plane. Your application server makes the requests: create a room, configure it (how many participants, how long it lives, whether it records), issue the tokens that let specific people in, list who’s currently connected, remove someone, end the room.</p><p>The key word is server-side. A room API is a conversation between your backend and the provider’s backend. No camera touches it; no video frame flows through it. It deals in the facts of the session — who, when, how long, what’s allowed — not the pixels. That’s exactly why it’s where every rule you care about ends up living.</p><p>If the room API is your backend’s tool, the SDK is what runs in front of the user.</p><h2 id="what-a-video-sdk-is-%E2%80%94-and-why-it-doesn%E2%80%99t-replace-the-room-api">What a video SDK is — and why it doesn’t replace the room API</h2><p>A video SDK is a client-side library. It runs inside the browser tab or the mobile app, and its job is the media experience: capture the camera and microphone, encode and send those streams, receive everyone else’s, and render them on screen. It handles the messy real-time parts — device permissions, codecs, network adaptation, reconnection.</p><p>Here’s the distinction people miss: the SDK joins a room; it doesn’t own one. When your app calls the SDK to “join,” it’s joining a session the room API already created. Strip the room API away and the SDK has nothing to connect to. They aren’t competing layers or two ways to do the same thing — they’re two ends of the same call. One is issued by your server; the other runs on your user’s device.</p><p>Which raises the question that actually matters when you’re deciding where your logic goes.</p><h2 id="the-line-that-matters-who-enforces-the-rules">The line that matters: who enforces the rules</h2><p>Anything that has to be trusted has to live on the server. That single sentence draws the line between the two.</p><p>Consider who’s allowed to join a call. You can’t enforce that in the SDK, because the SDK runs on the user’s machine, where the user controls everything — they can edit client code, replay requests, or lie about who they are. So permission has to be decided somewhere they can’t reach: your backend, via the room API, which mints a token that says “this person, this room, these rights, until this time.” The SDK then presents that token; it doesn’t grant it.</p><p>The same logic covers the rest of the business rules. When does recording start, and can the user stop it? Who can mute or remove another participant? When does the room expire? How many people fit inside? None of these can be trusted to the client — they belong to the room API. The SDK’s job is to deliver a great experience within whatever rules the server already set. Get this backward — try to enforce policy in the SDK — and you’ve built something that works in the demo and fails the moment someone pokes at it.</p><p>With the division of labor clear, here’s what the room API side of that line actually exposes.</p><h2 id="what-a-video-room-api-gives-you">What a video room API gives you</h2><p>The exact surface varies by provider, but a room API almost always exposes the same core operations. They cluster into four jobs: managing rooms, managing participants, controlling recording, and being notified when things happen.</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    border: 1px solid rgba(128, 128, 128, 0.4);
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 10px 16px;
    color: inherit;
    background: transparent;
    vertical-align: top;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18);
    font-weight: 700;
  }
</style>
<table class="rate-table">
  <colgroup><col width="122"><col width="241"><col width="229"/></col></col></colgroup>
  <thead>
    <tr>
      <th>Category</th>
      <th>Typical operations</th>
      <th>What it's for</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Room lifecycle</td>
      <td>Create room, configure (size, expiry, recording policy), end/delete room</td>
      <td>Bring a session into existence and set its rules</td>
    </tr>
    <tr>
      <td>Access</td>
      <td>Issue join tokens with scoped permissions</td>
      <td>Decide who gets in and what they can do</td>
    </tr>
    <tr>
      <td>Participants</td>
      <td>List participants, mute, remove / kick</td>
      <td>Observe and moderate the live session from the server</td>
    </tr>
    <tr>
      <td>Recording</td>
      <td>Start, stop, and manage recordings server-side</td>
      <td>Trigger recording by policy, not by client trust</td>
    </tr>
    <tr>
      <td>Events</td>
      <td>Webhooks: participant joined/left, recording ready, room ended</td>
      <td>React inside your own system to what happens in the room</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p>The webhook row is easy to overlook and often the most useful. Because the room API sits on the server, it’s the natural place to be told what happened — a participant left, a recording finished, a room emptied out — so your application can react: update a database, send a notification, close a ticket. The SDK can’t do this reliably; a user closing their laptop lid doesn’t send you a clean event.</p><p>Seeing the pieces listed is one thing. Watching them work together in a single request is what makes the split click.</p><h2 id="how-the-two-work-together-one-join-walked-through">How the two work together: one join, walked through</h2><p>Follow a single user joining a call.</p><ol><li>Your frontend asks your backend to join room X. Your backend — not the browser — decides whether this user is allowed.</li><li>Your backend calls the video room API: create the room if it doesn’t exist, then issue a token scoped to this user, this room, with the right permissions and an expiry.</li><li>Your backend hands that token back to the frontend.</li><li>The frontend passes the token to the video SDK and calls join. The SDK connects to the media servers, starts sending and receiving streams, and renders the call.</li><li>As things happen — the user joins, later leaves, a recording finishes — the room API fires webhooks to your backend, which updates your system accordingly.</li></ol><p>Notice that the SDK never makes a trust decision. It receives a token and renders media. Every “can they / should they / when does it” question was answered server-side, one step earlier, by the room API. That’s the whole relationship in one sequence: the server composes the session, the client experiences it.</p><p>Which is also why the two labels shouldn’t be shopped for as if they were rivals.</p><h2 id="the-bottom-line">The Bottom Line</h2><p>A video room API and a video SDK are not two options to choose between; they’re two halves of one build. The room API is the server-side control plane — it creates sessions, enforces who can do what, triggers recording, and tells your backend what happened. The SDK is the client-side experience — it joins the session the API created and handles the live media. If you’re evaluating providers, don’t ask “SDK or API?” Ask how cleanly each one separates the two, how much control the room API actually hands your server, and whether the permission and recording model is one you can trust. That separation is the real product.</p><h2 id="what%E2%80%99s-next">What’s Next?</h2><p>To go a level deeper on how a client actually joins — the tokens, the tracks, the room object in code — read <a href="https://www.samvyo.com/how-to-integrate-a-video-sdk-rooms-tokens-tracks-and-the-parts-the-quickstart-skips?ref=samvyo.com" rel="noreferrer"><em>Integrate a Video SDK: Rooms, Tokens, and Tracks</em></a>. If you’re still sorting out which kind of SDK you even need, <a href="https://www.samvyo.com/video-call-sdk-vs-video-conferencing-sdk-vs-video-chat-sdk-whats-the-difference-and-which-one-do-you-actually-need?ref=samvyo.com" rel="noreferrer"><em>Video Call vs Conferencing vs Chat SDK</em></a> draws those lines. </p><h2 id="frequently-asked-questions">Frequently Asked Questions</h2><h3 id="what-is-a-video-room-api">What is a video room API?</h3><p>A video room API is a server-side interface for creating, managing, and controlling video sessions. Your backend uses it to spin up rooms, set their rules, issue join tokens, moderate participants, and control recording. It handles the session — not the camera, microphone, or on-screen video, which are the SDK’s job.</p><h3 id="what%E2%80%99s-the-difference-between-a-video-room-api-and-a-video-sdk">What’s the difference between a video room API and a video SDK?</h3><p>A video room API runs on the server and controls the session; a video SDK runs on the client and delivers the media. The room API decides who can join and what they can do; the SDK joins the room and handles camera, mic, and rendering. You typically use both together — the API creates the room, the SDK joins it.</p><h3 id="do-you-need-both-a-video-room-api-and-a-video-sdk">Do you need both a video room API and a video SDK?</h3><p>In almost all cases, yes. The SDK can’t create a session or enforce permissions on its own, and the room API doesn’t render video. The API composes and guards the room; the SDK lets users experience it. Building with only one leaves a gap the other was meant to fill.</p><h3 id="does-recording-get-triggered-by-the-sdk-or-the-room-api">Does recording get triggered by the SDK or the room API?</h3><p>Recording should be triggered server-side through the room API, not the client SDK. Anything running on the user’s device can be tampered with, so recording policy — when it starts, whether a user can stop it — belongs on the server, where it can be trusted and audited.</p><h3 id="can-a-platform-like-samvyo-provide-both-the-video-room-api-and-the-sdk">Can a platform like Samvyo provide both the video room API and the SDK?</h3><p>Yes. Samvyo ships the same embeddable client SDKs a CPaaS provider gives you, alongside the server-side room API that creates and controls sessions — so session control and the media experience come from one platform. Because it’s based on an SFU architecture, offered both on-premise and as a managed cloud, teams that need to keep the media path, TURN, and recording under their own control can, while the platform stays resilient by design. It’s the same SDK surface the SDK vendors give you, plus the deployment control and white-label depth they typically don’t.</p>]]></content:encoded></item><item><title><![CDATA[What Is an SFU — and Why Does Every Video Platform Use One?]]></title><description><![CDATA[You’ve seen “SFU” in every architecture diagram and never a definition. An SFU forwards video streams selectively instead of mixing or re-encoding them — which is how modern calls scale past a few people. Here’s what it does, why it beat mesh and MCU, and why every platform runs one.]]></description><link>https://www.samvyo.com/blog/what-is-an-sfu-and-why-does-every-video-platform-use-one</link><guid isPermaLink="false">6a9570308b45c3f0cd63a4b8</guid><category><![CDATA[SFU guide]]></category><category><![CDATA[learning material]]></category><category><![CDATA[video SDK architecture]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Tue, 01 Sep 2026 05:05:24 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-1--2026--10_05_46-AM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-1--2026--10_05_46-AM.png" alt="What Is an SFU — and Why Does Every Video Platform Use One?"/><p>Open almost any video-infrastructure doc and you’ll hit three letters with no explanation: SFU. So — <strong>what is an SFU</strong>, and why did an entire industry quietly agree to build on one? An SFU is the routing layer that sits in the middle of a modern video call, deciding which streams go where. It isn’t glamorous, but it’s the single choice that determines whether your call scales past a handful of people, how much it costs to run, and how fast it feels. Here’s what it does — and why mesh and MCU lost.</p><h2 id="the-problem-every-video-call-has-to-solve">The problem every video call has to solve</h2><p>Every real-time call is really a distribution problem. Each participant produces media — their camera and mic — and needs to receive everyone else’s. With two people that’s trivial. With ten, each person’s outgoing stream has to reach nine others, and each person has to receive nine incoming streams. The question that decides everything is: who does the work of copying and routing all that media? There are only three answers, and the one you pick sets the ceiling on how many people fit in the room, how good their devices have to be, and how much latency everyone eats.</p><p>Start with the simplest answer, and watch it fall apart.</p><h2 id="three-ways-to-route-video-mesh-mcu-and-sfu">Three ways to route video: mesh, MCU, and SFU</h2><p>The first option is mesh: every participant sends their stream directly to every other participant, peer to peer, with no server in the media path. Elegant for two people. But each person now uploads their video once per other participant — five people means each client encodes and uploads four copies of itself. Uplink is the scarcest resource on most connections, so mesh collapses somewhere around four or five participants.</p><p>The second is the MCU — a Multipoint Control Unit. Every participant sends one stream to a central server; the server decodes them all, mixes them into a single composited video, re-encodes it, and sends one stream back to each person. The client’s job is trivial — send one, receive one — but the server is doing enormous work. Decoding and re-encoding every stream in real time is CPU-expensive, and the mixing step adds latency. MCUs scale in client simplicity, not in server cost.</p><p>The third is the SFU — and it’s the compromise that won.</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    border: 1px solid rgba(128, 128, 128, 0.4);
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 10px 16px;
    color: inherit;
    background: transparent;
    vertical-align: top;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18);
    font-weight: 700;
  }
</style>
<table class="rate-table">
  <colgroup><col width="76"><col width="134"><col width="70"><col width="77"><col width="63"><col width="142"/></col></col></col></col></col></colgroup>
  <thead>
    <tr>
      <th>Architecture</th>
      <th>How it routes media</th>
      <th>Client cost</th>
      <th>Server cost</th>
      <th>Latency</th>
      <th>Practical ceiling</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Mesh (P2P)</td>
      <td>Everyone sends to everyone directly</td>
      <td>High (N‑1 uploads)</td>
      <td>None</td>
      <td>Lowest</td>
      <td>~4‑5 people</td>
    </tr>
    <tr>
      <td>MCU</td>
      <td>Server mixes all streams into one</td>
      <td>Lowest (1 up / 1 down)</td>
      <td>Very high (decode + re-encode)</td>
      <td>Higher (mixing)</td>
      <td>Large, but costly</td>
    </tr>
    <tr>
      <td>SFU</td>
      <td>Server forwards streams selectively</td>
      <td>Moderate (1 up / N down)</td>
      <td>Moderate (no re-encode)</td>
      <td>Low</td>
      <td>Large and affordable</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p>To see why the SFU is the compromise everyone settled on, look at what it actually does with a stream.</p><h2 id="what-an-sfu-actually-does">What an SFU actually does</h2><p>SFU stands for Selective Forwarding Unit, and the whole design is in the middle word. Each participant sends their media to the SFU once. The SFU does not decode it, mix it, or re-encode it — it simply forwards each incoming stream to the participants who should receive it, selectively. A router for media, not a mixer.</p><p>That “no re-encoding” is the entire trick. Because the SFU never decodes and re-encodes video, it avoids the MCU’s crushing CPU cost and its added latency — the frames pass through nearly untouched. And because each client only uploads once, to the SFU, instead of once per peer, it avoids mesh’s uplink problem. The client uploads one stream and downloads several; the server forwards without transcoding. Everyone’s cost stays reasonable.</p><p>That single decision — forward, don’t mix — is why the SFU displaced both alternatives.</p><h2 id="why-the-sfu-won-for-real-time">Why the SFU won for real-time</h2><p>Line these up and the SFU wins on the axes that matter for live video. Latency: forwarding is faster than mixing, so the SFU stays close to peer-to-peer even with a server in the path. Cost: no transcoding means one server handles far more participants than an MCU — though <a href="https://samvyo.com/blog/scaling-video-cost-what-happens-when-one-media-server-isnt-enough?ref=samvyo.com" rel="noreferrer">a single SFU still has a ceiling.</a> Quality and flexibility: because streams aren’t flattened into one mixed picture, each receiver keeps every remote stream as a separate, full-quality track — so the client can lay them out however it likes, show the speaker large and others small, or drop streams it doesn’t need. A mixed MCU output can’t be un-mixed. Scale follows from the same economics: forwarding is cheap enough that large calls stay affordable, which is why real-time platforms standardized on it.</p><p>But the basic idea — forward every stream to everyone — would still drown a client in a big call. What makes a production SFU good is what it does on top.</p><h2 id="the-clever-parts-simulcast-bandwidth-estimation-active-speaker">The clever parts: simulcast, bandwidth estimation, active speaker</h2><p>A naive SFU forwards every stream to everyone at full quality, and a participant on a weak connection would be buried. Real SFUs are smarter in three ways.</p><p>Simulcast is the big one. Instead of sending a single stream, each participant's client encodes their video at several quality layers at once — say high, medium, and low — and sends all of them to the SFU, which is cheap for the server and <a href="https://samvyo.com/blog/what-is-simulcast-and-when-does-it-save-or-waste-bandwidth?ref=samvyo.com" rel="noreferrer">not free for the sender's uplink</a>. The SFU then picks, per receiver, which layer to forward based on that receiver’s screen size and connection. Someone shown in a tiny tile gets the low layer; someone pinned full-screen gets the high one. The senders publish options; the SFU chooses.</p><p>Bandwidth estimation is the second. The SFU continuously watches each connection for signs of congestion and adapts what it forwards — stepping down to a lower simulcast layer before packets start dropping, rather than after.</p><p>Active speaker detection is the third. The SFU can tell who’s currently talking and prioritize accordingly — forwarding the speaker’s stream at higher quality, or driving the “who’s on screen” logic the client renders.</p><p>All of which makes the SFU sound like the answer to everything. It isn’t — and being honest about that is the point.</p><h2 id="when-mesh-or-mcu-still-make-sense">When mesh or MCU still make sense</h2><p>The SFU won the general case, not every case. For a one-to-one call, mesh is often the right choice: two peers, no server in the media path, the lowest possible latency and cost, and better privacy because the media never touches a middlebox. Adding an SFU there buys you nothing.</p><p>The MCU still earns its place whenever you genuinely need a single composited output. Recording a call as one flat video file, broadcasting to a “dumb” endpoint that can only accept one stream, or bridging into telephony and SIP systems that expect a single mixed feed — those are mixing problems, and mixing is exactly what an MCU does. Some platforms even run an SFU for the live call and an MCU-style component only for the recording. The architectures aren’t rivals so much as tools for different shapes of problem.</p><p>Which brings the whole picture together.</p><h2 id="the-bottom-line">The Bottom Line</h2><p>An SFU — a Selective Forwarding Unit — is the server that routes real-time video by forwarding streams selectively instead of mixing or re-encoding them. It beat mesh, which can’t get past a handful of participants, and it beat the MCU, whose constant transcoding is slow and expensive. By forwarding rather than mixing, it keeps latency low, cost manageable, and every remote stream independent — and with simulcast and bandwidth estimation on top, it adapts to each participant’s device and connection. That’s why, whatever platform you’re evaluating, you’ll find an SFU at the center of it. Open-source implementations like mediasoup, Janus, and LiveKit made the pattern ubiquitous; commercial platforms build on the same idea. When someone says a video product is “SFU-based,” this is what they mean.</p><h2 id="what%E2%80%99s-next">What’s Next?</h2><p>Now that you know what carries the media, see what controls the session: <a href="https://www.samvyo.com/what-is-a-video-room-api-and-how-is-it-different-from-a-video-sdk?ref=samvyo.com" rel="noreferrer"><em>What Is a Video Room API — and How Is It Different from a Video SDK?</em></a> explains the server-side layer that creates and governs the rooms an SFU serves. If you’re mapping the whole stack for a real deployment, <em>Enterprise Video Conferencing Architecture</em> walks the layers end to end. And <a href="https://www.samvyo.com/video-call-sdk-vs-video-conferencing-sdk-vs-video-chat-sdk-whats-the-difference-and-which-one-do-you-actually-need?ref=samvyo.com" rel="noreferrer"><em>Video Call vs Conferencing vs Chat SDK</em></a> helps you pick the right client library to sit on top.</p><h2 id="frequently-asked-questions">Frequently Asked Questions</h2><h3 id="what-is-an-sfu">What is an SFU?</h3><p>An SFU (Selective Forwarding Unit) is a server that routes real-time video by forwarding each participant’s stream selectively to the others, without decoding, mixing, or re-encoding it. It sits in the middle of a video call and decides which streams reach whom — which is what lets modern calls scale beyond a few people.</p><h3 id="what%E2%80%99s-the-difference-between-an-sfu-and-an-mcu">What’s the difference between an SFU and an MCU?</h3><p>An MCU mixes all participants’ streams into a single composited video and re-encodes it; an SFU forwards streams individually without re-encoding. The MCU makes the client’s job trivial but costs far more server CPU and adds latency. The SFU keeps latency low and each remote stream independent, which is why it’s the default for live calls.</p><h3 id="why-do-video-platforms-use-sfus-instead-of-peer-to-peer">Why do video platforms use SFUs instead of peer-to-peer?</h3><p>Because mesh (peer-to-peer) doesn’t scale. In a mesh call, every participant uploads a copy of their video to every other participant, and upload bandwidth runs out around four or five people. An SFU means each participant uploads once, to the server, which then forwards — removing the uplink bottleneck while keeping latency low.</p><h3 id="does-an-sfu-decode-or-re-encode-video">Does an SFU decode or re-encode video?</h3><p>No. That’s the defining feature of an SFU: it forwards streams without decoding or re-encoding them. Avoiding transcoding is what keeps its CPU cost and latency low compared with an MCU, which decodes and re-encodes every stream in order to mix them.</p><h3 id="is-webrtc-an-sfu">Is WebRTC an SFU?</h3><p>No — they’re different layers. WebRTC is the browser technology that lets clients capture and transport real-time media; an SFU is a server role that routes that media between participants. A WebRTC call with more than a couple of people almost always routes through an SFU, but WebRTC itself isn’t one.</p><h3 id="does-samvyo-use-an-sfu-architecture">Does Samvyo use an SFU architecture?</h3><p>Yes. Samvyo is based on an SFU architecture, which is why it can carry large real-time calls at low latency without the transcoding cost of a mixed approach. It offers the same embeddable SDKs a CPaaS provider gives you, plus on-premise and managed-cloud deployment and white-label depth — and for teams that need it, the media path, TURN, and recording can stay under their own control while the platform remains resilient by design.</p>]]></content:encoded></item><item><title><![CDATA[How to Integrate a Video SDK: Rooms, Tokens, Tracks, and the Parts the Quickstart Skips]]></title><description><![CDATA[The quickstart gets two people on video in an afternoon. Production needs the parts it skips: server-issued scoped tokens, selective track subscription, STUN/TURN, a real recording pipeline, and clean teardown with reconnection. Here’s the full path to integrate a video SDK properly.]]></description><link>https://www.samvyo.com/blog/how-to-integrate-a-video-sdk-rooms-tokens-tracks-and-the-parts-the-quickstart-skips</link><guid isPermaLink="false">6a8925e78b45c3f0cd63a3d5</guid><category><![CDATA[Integration Effort]]></category><category><![CDATA[video SDK architecture]]></category><category><![CDATA[Video SDK]]></category><category><![CDATA[Proprietary video SDKs]]></category><category><![CDATA[video API integration]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Sat, 22 Aug 2026 05:53:30 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/08/ChatGPT-Image-Aug-22--2026--11_05_30-AM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/08/ChatGPT-Image-Aug-22--2026--11_05_30-AM.png" alt="How to Integrate a Video SDK: Rooms, Tokens, Tracks, and the Parts the Quickstart Skips"/><p>If you came from the <a href="https://www.samvyo.com/adding-video-to-your-product-what-integrate-a-video-sdk-actually-costs-and-commits-you-to?ref=samvyo.com" rel="noreferrer">business version</a>, that piece covered what you commit to when you adopt a provider — pricing, residency, lock-in. This is the companion “how,” for the engineer who has to build it. Every provider’s quickstart is excellent and nearly identical: to <strong>integrate a video SDK</strong> at demo level, you initialise the client, join a room, publish your camera, and two people are on video in an afternoon. None of that is the hard part. The hard part is everything the quickstart quietly assumes — that tokens are minted safely, that you only subscribe to the tracks you need, that the network cooperates, that recording and teardown are somebody’s job. This post is the map past the happy path.</p><h2 id="the-quickstart-vs-the-production-path"><strong>The Quickstart vs the Production Path</strong></h2><p>The five-minute version hides five real subsystems. Here’s the gap in one view — the left column is the tutorial, the right column is what actually ships.</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    border: 1px solid rgba(128, 128, 128, 0.4);
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 10px 16px;
    color: inherit;
    background: transparent;
    vertical-align: top;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18);
    font-weight: 700;
  }
</style>
<table class="rate-table">
  <colgroup><col width="312"><col width="312"/></col></colgroup>
  <thead>
    <tr>
      <th>The quickstart gives you</th>
      <th>Production also needs</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Init the SDK and join a room</td>
      <td>Server-issued, scoped tokens with a TTL — not a hardcoded secret</td>
    </tr>
    <tr>
      <td>One local camera + mic published</td>
      <td>Simulcast layers and selective subscription to control cost</td>
    </tr>
    <tr>
      <td>Video that works on your office Wi-Fi</td>
      <td>STUN plus TURN relay for the ~10–20% that can't connect directly</td>
    </tr>
    <tr>
      <td>A "record" button</td>
      <td>A server-side egress/compositing service and storage with known residency</td>
    </tr>
    <tr>
      <td>Join</td>
      <td>Clean teardown, reconnection, and token refresh on long sessions</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p><em>Everything on the right is skippable in a demo and non-negotiable in production. We’ll take them in the order you hit them.</em></p><h2 id="rooms-and-tokens-auth-is-the-first-real-decision"><strong>Rooms and Tokens: Auth Is the First Real Decision</strong></h2><h3 id="the-room-model"><strong>The room model</strong></h3><p>A room (some SDKs call it a session or a channel via a <a href="https://samvyo.com/blog/what-is-a-video-room-api-and-how-is-it-different-from-a-video-sdk?ref=samvyo.com" rel="noreferrer">video room API</a>) is the media context participants join to send and receive tracks. Two questions decide how you model it: are rooms ephemeral (created on demand, gone when empty) or persistent (long-lived, addressable by a stable ID), and who is allowed to create one. For most products rooms are ephemeral and created server-side when a call or meeting starts, so the client never decides a room into existence on its own.</p><h3 id="tokens-the-part-you-must-not-get-wrong"><strong>Tokens: the part you must not get wrong</strong></h3><p>Access is granted by a signed token — typically a JWT your backend mints with the provider’s API secret. The token carries an identity, a set of grants (which room, may-publish, may-subscribe, may-record), and a time-to-live. The single most common security mistake in video integrations is putting the API secret in the client to generate tokens there. Never do it: the secret lives only on your server, your server issues short-lived scoped tokens on request, and the client receives a token it cannot forge or widen. Grant least privilege — a viewer’s token shouldn’t carry publish rights — and keep the TTL short enough that a leaked token expires quickly, which is exactly why reconnection later has to handle refresh.</p><p>With auth done, the media itself is two verbs: publish and subscribe. That pair is where your bandwidth bill is decided.</p><h2 id="tracks-publish-and-subscribe-is-where-the-cost-lives"><strong>Tracks: Publish and Subscribe Is Where the Cost Lives</strong></h2><h3 id="publishing"><strong>Publishing</strong></h3><p>A participant publishes local tracks — camera, microphone, screen share — to the SFU (the Selective Forwarding Unit that forwards each track to other participants without re-encoding it). The important lever at publish time is simulcast: the client encodes the camera in two or three resolution layers at once, so the server can hand each viewer the layer their screen and bandwidth can actually use. Publishing a single high-resolution layer to a large room forces everyone to receive more than they can use; <a href="https://samvyo.com/blog/what-is-simulcast-and-when-does-it-save-or-waste-bandwidth?ref=samvyo.com">simulcast is what keeps a big room affordable</a> — though the extra ladder layers add uplink of their own, so it is not free in every room shape.</p><h3 id="subscribing-%E2%80%94-the-cost-lever-most-people-miss"><strong>Subscribing — the cost lever most people miss</strong></h3><p>The naive integration auto-subscribes every participant to every other participant’s tracks. In a 4-person call that’s invisible; in a 50-person room it’s a bandwidth and CPU disaster on every client. Production code subscribes selectively — only to the tracks actually on screen, at the layer actually visible — and unsubscribes the rest. Pair selective subscription with simulcast and adaptive stream (let the server drop to a lower layer when a client’s bandwidth sags) and you have the three controls that decide whether a large room is cheap or ruinous. This is the same on-demand principle the business version costs out; here it’s implemented as subscription state.</p><p>Layer in the meeting logic — active-speaker and dominant-speaker events, mute state, track-ended handling — and the media plane is complete. Except it only works if the packets can actually reach the other side.</p><h2 id="nat-traversal-stun-turn-and-why-your-demo-lied"><strong>NAT Traversal: STUN, TURN, and Why Your Demo Lied</strong></h2><p>Your demo worked because both machines were on friendly networks. In the wild, most participants sit behind NAT, and some behind NAT so restrictive that a direct peer path is impossible. WebRTC handles this with ICE: STUN lets a client discover its own public-facing address so two endpoints can try to connect directly, and TURN is a relay server that carries the media when a direct path can’t be established — symmetric NAT, corporate firewalls, locked-down mobile networks. As a rule of thumb, something like 10–20% of real-world connections end up needing TURN.</p><p>Two consequences for your integration. First, you cannot skip TURN and expect a reliable product; the connections that need it are exactly the enterprise networks your buyers sit behind. Second, TURN relays real media, so it costs real bandwidth — a line item a cloud SDK bundles into its per-minute rate and <a href="https://samvyo.com/blog/the-turn-bill-the-self-hosted-video-cost-nobody-forecasts?ref=samvyo.com">a self-hosted stack makes you provision and forecast yourself</a>. Either way, budget for it. Once media flows reliably, the service everyone forgets is recording.</p><h2 id="recording-the-service-you-forgot-to-budget"><strong>Recording: The Service You Forgot to Budget</strong></h2><p>A record button implies a whole subsystem. Recording is usually server-side egress: a process subscribes to the room’s tracks and either stores them individually or composites them into a single mixed file — often via a headless browser or a dedicated egress pipeline, one per session. That is compute-heavy and storage-heavy, and it runs for the full duration of every recorded session, not as an afterthought. Where the file lands is also where the business version’s residency question becomes concrete: with a cloud SDK, recordings sit in the vendor’s cloud and region; with a self-hosted or managed deployment, they land in storage you control, with your encryption and retention. For regulated records the latter is usually mandatory. And whatever you record, every session eventually has to end cleanly — the part quickstarts almost never show.</p><h2 id="teardown-reconnection-and-the-lifecycle-quickstarts-skip"><strong>Teardown, Reconnection, and the Lifecycle Quickstarts Skip</strong></h2><p><strong>Clean teardown.</strong> Leaving a room isn’t just closing the tab. Unpublish tracks, release the camera and microphone, close the peer connection, and signal departure so the server frees resources and other participants get a clean “left” event rather than a frozen tile.</p><p><strong>Reconnection.</strong> Networks drop. Production clients detect the disconnect, run an ICE restart to re-establish the media path, and re-subscribe to the tracks they had — without the user rejoining manually. On mobile especially, network changes (Wi-Fi to cellular) are routine, not exceptional.</p><p><strong>Token refresh.</strong> Because tokens are short-lived by design, a long session will outlive its token. The client has to fetch a fresh token from your server and hand it to the SDK before the old one expires, or the reconnection above fails at the worst moment. These three are the difference between a demo and something people trust in production — and they set up the decisions that determine how stuck you are with your choice.</p><h2 id="the-scaling-decisions-that-lock-you-in"><strong>The Scaling Decisions That Lock You In</strong></h2><p>Three implementation choices, made early, decide both how well you scale and how hard you are to move later. Your subscription strategy (selective, simulcast-aware, adaptive) is what keeps large rooms viable — retrofitting it into a codebase that assumed auto-subscribe is a rewrite. Your region and residency posture — where the SFU runs and where recordings land — is cheap to set now and expensive to change once you have regulated customers. And the shape of your own code against the SDK’s room, token, and track abstractions is the lock-in the business version priced: wrap the SDK behind a thin interface of your own so “join,” “publish,” and “record” are your verbs, and a future migration becomes an adapter swap instead of a teardown. The SFU-versus-alternatives background, if you want it, is in our enterprise video architecture piece <a href="https://samvyo.com/blog/enterprise-video-conferencing-architecture-what-actually-runs-behind-the-six-enterprise-checks?ref=samvyo.com" rel="noreferrer">[link].</a> Put it together and the build-versus-buy question is concrete.</p><h2 id="build-buy-or-deploy"><strong>Build, Buy, or Deploy</strong></h2><p><strong>Build on open source.</strong> A general-purpose SFU — mediasoup, LiveKit, or Janus are the usual open-source ones — with your own token service, TURN, recording egress, and reconnection logic around it. Maximum control over subscription and cost economics; you operate a distributed real-time system. Right when the media path is core to the product and you have the specialists.</p><p><strong>Buy a cloud SDK.</strong> A client SDK in front of the vendor’s SFU, with tokens, TURN, and recording provided, billed per participant-minute. Fastest to production, least to operate, least control over media path and residency. Right when speed outweighs ownership.</p><p><strong>Deploy a commercial platform.</strong> The whole stack — SFU, signaling, TURN, recording — as a unit you run on-premise or as a managed deployment on infrastructure you choose, flat-licensed. Samvyo is one such option: based on SFU architecture, deployed on-prem or managed, which gives you the owned media path and residency without assembling the components yourself. Where it doesn’t fit: an early product at low or spiky volume with no residency pressure — a cloud SDK is less to run and cheaper to start.</p><p>Three approaches, one axis — how much of the media path you operate yourself.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Integrating a video SDK past the demo comes down to a handful of subsystems the quickstart omits: mint scoped tokens server-side and never ship the secret, subscribe selectively with simulcast so large rooms stay affordable, run TURN for the connections that can’t go direct, treat recording as the compute-and-storage service it is, and handle teardown, reconnection, and token refresh. Get those right, wrap the SDK behind your own thin interface, and you have something that survives both production traffic and a future change of provider.</p><h2 id="what%E2%80%99s-next"><strong>What’s Next?</strong></h2><p><strong><em>Want the decision-maker’s version — what this commits you to, without the wiring? </em></strong>The companion business piece frames the same integration as four commitments: pricing, residency, lock-in, and white-label: link to <a href="https://www.samvyo.com/adding-video-to-your-product-what-integrate-a-video-sdk-actually-costs-and-commits-you-to?ref=samvyo.com" rel="noreferrer">business version</a>.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><h3 id="how-do-you-integrate-a-video-sdk-the-right-way-beyond-the-quickstart"><strong>How do you integrate a video SDK the right way, beyond the quickstart?</strong></h3><p>Mint access tokens on your server (never expose the API secret in the client), model rooms server-side, subscribe selectively to tracks rather than auto-subscribing everyone, run STUN and TURN for NAT traversal, treat recording as a server-side egress service, and handle teardown, reconnection, and token refresh. The quickstart covers joining a room; production is those five subsystems.</p><h3 id="where-should-video-sdk-tokens-be-generated"><strong>Where should video SDK tokens be generated?</strong></h3><p>Always on your backend. The provider’s API secret signs a short-lived JWT that carries the participant’s identity and scoped grants (room, publish, subscribe, record). Generating tokens in the client means shipping the secret, which lets anyone forge access. The client should only ever receive a ready-made, least-privilege token with a short TTL.</p><h3 id="do-i-really-need-a-turn-server"><strong>Do I really need a TURN server?</strong></h3><p>Yes. STUN lets endpoints attempt a direct connection, but roughly 10–20% of real-world connections — symmetric NAT, corporate firewalls, restrictive mobile networks — can only connect through a TURN relay. Skipping TURN means those users, often your enterprise buyers, simply can’t connect. TURN relays media, so it also carries a real bandwidth cost to budget for.</p><h3 id="why-does-my-video-sdk-integration-work-in-testing-but-fail-for-some-users"><strong>Why does my video SDK integration work in testing but fail for some users?</strong></h3><p>Almost always NAT traversal. Testing usually happens on cooperative networks where a direct peer path exists; some production users sit behind restrictive NAT or firewalls that require a TURN relay. If TURN isn’t configured or provisioned, exactly those users fail while your tests pass.</p><h3 id="how-do-you-control-cost-when-integrating-a-video-sdk-at-scale"><strong>How do you control cost when integrating a video SDK at scale?</strong></h3><p>Subscribe selectively — only to the tracks on screen — instead of auto-subscribing all participants, publish with simulcast so viewers receive a layer they can use, and enable adaptive stream so the server drops quality when bandwidth sags. Those three controls decide whether a large room is affordable. Flat-licensed SFU platforms such as Samvyo remove the per-minute variable entirely for high, steady volume.</p><h3 id="what%E2%80%99s-the-hardest-part-of-a-production-video-sdk-integration"><strong>What’s the hardest part of a production video SDK integration?</strong></h3><p>Not the media — the lifecycle around it: safe server-side token issuance, selective subscription at scale, reliable TURN, a real recording pipeline, and clean teardown with reconnection and token refresh. Wrapping the SDK behind your own thin interface also matters, because it’s what makes a future provider switch an adapter change rather than a rewrite.</p>]]></content:encoded></item><item><title><![CDATA[Adding Video to Your Product: What “Integrate a Video SDK” Actually Costs and Commits You To]]></title><description><![CDATA[Integrating a video SDK takes an afternoon — which is exactly the trap. The real decisions are the four commitments the quickstart never mentions: the pricing model that compounds with success, where your video data routes, how locked in you become, and whose brand it looks like.]]></description><link>https://www.samvyo.com/blog/adding-video-to-your-product-what-integrate-a-video-sdk-actually-costs-and-commits-you-to</link><guid isPermaLink="false">6a89254a8b45c3f0cd63a3cd</guid><category><![CDATA[Video SDK]]></category><category><![CDATA[Proprietary video SDKs]]></category><category><![CDATA[video SDK architecture]]></category><category><![CDATA[Integration Effort]]></category><category><![CDATA[video conferencing integration]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Sat, 22 Aug 2026 05:53:25 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/08/ChatGPT-Image-Aug-22--2026--11_04_14-AM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/08/ChatGPT-Image-Aug-22--2026--11_04_14-AM.png" alt="Adding Video to Your Product: What “Integrate a Video SDK” Actually Costs and Commits You To"/><p>Here is the good news, stated plainly: it has never been easier to <strong>integrate video SDK</strong>. Modern providers hand you a client library, a few API calls, and a working two-person video session the same afternoon you start. The demo is genuinely that fast. And that speed is exactly what makes this decision dangerous — because the integration is the cheap part. What you actually sign up for isn’t the afternoon of coding; it’s the pricing model, the data path, and the lock-in you inherit the moment that SDK goes to production. Those you live with for years.</p><p>This piece is for the product owner or founder about to pick a provider. It skips the quickstart — there are plenty of those — and walks the four commitments the quickstart never mentions, then frames the one real decision underneath them.</p><h2 id="the-integration-is-the-easy-part"><strong>The Integration Is the Easy Part</strong></h2><p>Give a competent engineer a modern video SDK and a weekend, and you’ll have camera, microphone, and a joinable room working in your app. The vendors have spent years making the first hour delightful, because the first hour is what wins the evaluation. None of that is a lie — it really is a few calls to get two people on video.</p><p>But “it runs” and “it’s in production at scale, on budget, and you could leave if you had to” are different sentences. The gap between them is where the money and the risk live, and it’s invisible during the demo. So let’s make it visible — starting with the one that compounds fastest.</p><h2 id="commitment-1-the-pricing-model-you%E2%80%99re-signing-into"><strong>Commitment #1: The Pricing Model You’re Signing Into</strong></h2><p>Most cloud video SDKs bill per participant-minute. At demo scale the rate looks like a rounding error — fractions of a cent per minute. The problem is that video usage is a product of people and time, so it compounds the moment you have real traffic. Here’s the same worked example we use in our <a href="https://samvyo.com/blog/per-minute-video-pricing-at-scale-what-enterprise-teams-actually-pay?ref=samvyo.com" rel="noreferrer">pricing breakdown</a>, so the numbers line up:</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    border: 1px solid rgba(128, 128, 128, 0.4);
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 10px 16px;
    color: inherit;
    background: transparent;
    vertical-align: top;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18);
    font-weight: 700;
  }
</style>
<table class="rate-table">
  <colgroup><col width="364"><col width="260"/></col></colgroup>
  <thead>
    <tr>
      <th>Cost driver</th>
      <th>Figure</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="font-weight:700;">Rate — HD video</td>
      <td>~$0.004 per participant-minute</td>
    </tr>
    <tr>
      <td style="font-weight:700;">Scenario</td>
      <td>500 concurrent HD sessions, running all day</td>
    </tr>
    <tr>
      <td style="font-weight:700;">Participant-minutes / month</td>
      <td>~6.2 million</td>
    </tr>
    <tr>
      <td style="font-weight:700;">Base monthly cost</td>
      <td>~$25,000</td>
    </tr>
    <tr>
      <td style="font-weight:700;">With recording + storage (1.5–2.5×)</td>
      <td>~$37,000–62,000</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p><em>Per-minute HD video at roughly $0.004/participant-minute; 500 concurrent HD sessions running all day is about 6.2 million participant-minutes a month. Recording and storage typically multiply the bill by 1.5–2.5×.</em></p><p>The honest read on per-minute: it’s the cheaper, lower-risk model when your volume is low or spiky, because you pay only for what you use and carry no fixed cost when usage dips. It flips to more expensive than a flat license once usage is high and steady — typically somewhere around 100–200 concurrent users, sustained. The mistake isn’t choosing per-minute; it’s choosing it without knowing where your usage will sit in twelve months, and being surprised when the invoice scales linearly with your success. That leads directly to a second commitment the pricing page never shows: where the video itself goes.</p><h2 id="commitment-2-where-your-video-actually-goes"><strong>Commitment #2: Where Your Video Actually Goes</strong></h2><p>When you integrate a cloud video SDK, your users’ audio and video route through the vendor’s media infrastructure — frequently in US regions, whether or not your users or your business are. For a consumer app that may be fine. For banking, healthcare, government, or any regulated buyer, it’s a data-residency question you’ve just inherited without choosing it: where does the media physically live, under whose jurisdiction, and can you prove it to an auditor?</p><p>One caveat we’ll keep making because vendors blur it: choosing a region, or self-hosting, controls where the data lives — it does not by itself make you HIPAA- or GDPR-compliant. Compliance is a controls program (access, encryption, audit, retention) that applies regardless of where the media servers run. What the deployment choice changes is whether you can answer the residency question at all. If your roadmap includes regulated customers, this commitment can override the pricing one entirely — and it’s far cheaper to weigh now than to re-platform for later. Which raises the commitment nobody prices in until they try to leave.</p><h2 id="commitment-3-lock-in-%E2%80%94-what-it-takes-to-leave"><strong>Commitment #3: Lock-In — What It Takes to Leave</strong></h2><p>Every video SDK gives you its own abstractions — its notion of a room, its token and authentication scheme, its track and participant model, its recording format and webhooks. Your client code and your backend get written against those specifics. That’s not a scandal; it’s how SDKs work. But it means the switching cost isn’t the media stack — it’s all the product code you wrapped around one vendor’s primitives, plus any stored recordings in their format.</p><p>The practical mitigation is unglamorous and worth it: put a thin abstraction layer of your own between your product and the SDK, so “join a room” and “start a recording” are your interfaces, not theirs. It won’t make switching free, but it turns a re-platform from a rewrite into a swap of one adapter. Decide up front how much lock-in you’re comfortable with, because the cheapest time to reduce it is before you’ve written a hundred files against someone else’s room object. Lock-in also has a visible cousin: how much of what your customers see is your brand versus the vendor’s.</p><h2 id="commitment-4-white-label-depth"><strong>Commitment #4: White-Label Depth</strong></h2><p>“White-label” means two different things that buyers routinely merge. Interface branding — your UI, your colours, your domain on the video experience — is something a video SDK gives you, because you build the front end. Infrastructure ownership — the media path and data under your control with no upstream vendor in the trace — is something only self-hosted or managed-dedicated deployment gives you. A cloud SDK can make the product look entirely yours while the media still travels through the vendor. For most products, interface branding is enough; for OEM and regulated buyers who are reselling or who must prove there’s no third party in the path, it isn’t. The full layer-by-layer breakdown is in our enterprise video architecture piece <a href="https://samvyo.com/blog/enterprise-video-conferencing-architecture-what-actually-runs-behind-the-six-enterprise-checks?ref=samvyo.com" rel="noreferrer">[link]</a>. These four commitments collapse into a single decision.</p><h2 id="the-real-decision-rent-the-path-or-own-it"><strong>The Real Decision: Rent the Path or Own It</strong></h2><p>Strip away the detail and every option is a position on one axis — how much of the media path you rent versus own.</p><p><strong>Rent it (cloud video SDK).</strong> Fastest to production, least to operate, per-minute billing, media through the vendor’s cloud. The right call when you’re early, your volume is low or unpredictable, you have no residency pressure, and speed matters more than ownership.</p><p><strong>Own it (self-hosted or managed deployment).</strong> You control the media path, the data, and a flat, predictable cost — at the price of more to run, or a vendor deploying their stack into infrastructure you control. The right call when volume is high and steady, residency or white-label depth is a hard requirement, or per-minute has stopped making sense.</p><p>Samvyo sits on the “own it” side: it’s real-time video infrastructure based on SFU architecture, deployed on-premise or as a managed cloud deployment, under a flat license rather than per-minute — which is the model that fits high, steady volume and regulated residency. The honest boundary: if you’re early and small, or your volume is spiky, or you have no residency requirement, a cloud SDK is genuinely the better first move, and adopting owned infrastructure would be solving a problem you don’t have yet. Own the path when the commitments above start to bite — not before.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>The afternoon it takes to integrate a video SDK is the least important thing about the decision. The pricing model decides whether success makes your margins better or worse; the data path decides whether you can serve regulated customers; the lock-in decides whether you’re free to leave; white-label depth decides whose product it looks like. Choose those four deliberately, before the easy integration quietly makes them for you.</p><h2 id="what%E2%80%99s-next"><strong>What’s Next?</strong></h2><p><strong><em>Ready to build rather than budget? </em></strong>The technical companion walks the real integration path — rooms, tokens, tracks, TURN, recording, and the parts the quickstart skips: link to <a href="https://www.samvyo.com/how-to-integrate-a-video-sdk-rooms-tokens-tracks-and-the-parts-the-quickstart-skips?ref=samvyo.com" rel="noreferrer">technical version</a>. </p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><h3 id="how-hard-is-it-to-integrate-a-video-sdk"><strong>How hard is it to integrate a video SDK?</strong></h3><p>The basic integration is easy — a modern SDK gets a two-person video session working in an afternoon. The difficulty isn’t the code; it’s the commitments that come with it: the pricing model, where your video data routes, and how locked in you become. Plan those before the integration, not after.</p><h3 id="how-much-does-a-video-sdk-cost-at-scale"><strong>How much does a video SDK cost at scale?</strong></h3><p>Per-minute pricing looks tiny — around $0.004 per participant-minute for HD video — but compounds with usage. Roughly 500 concurrent HD sessions running all day is about 6.2 million participant-minutes, or near $25,000 a month base, rising to $37,000–62,000 with recording and storage. The rate is small; the volume isn’t.</p><h3 id="should-i-choose-per-minute-or-flat-pricing-for-video"><strong>Should I choose per-minute or flat pricing for video?</strong></h3><p>Per-minute is cheaper and lower-risk at low or spiky volume, because you pay only for what you use. It becomes more expensive than a flat license once usage is high and steady — typically around 100–200 sustained concurrent users. Flat-licensed infrastructure such as Samvyo fits the high-and-steady case; a per-minute cloud SDK fits the early or unpredictable one.</p><h3 id="where-is-my-video-data-stored-with-a-cloud-video-sdk"><strong>Where is my video data stored with a cloud video SDK?</strong></h3><p>With a cloud SDK, media routes through the vendor’s infrastructure, often in US regions, regardless of where you or your users are. That’s a data-residency commitment you inherit. Choosing a region or self-hosting controls where the data lives, but doesn’t by itself make you compliant — compliance is a separate controls program.</p><h3 id="how-hard-is-it-to-switch-video-sdk-providers-later"><strong>How hard is it to switch video SDK providers later?</strong></h3><p>Harder than the original integration, because your product code is written against one vendor’s room, token, track, and recording abstractions. The cost is the wrapping code, not the media itself. A thin abstraction layer of your own between your product and the SDK turns a future re-platform from a rewrite into an adapter swap.</p><h3 id="cloud-video-sdk-or-self-hosted-%E2%80%94-which-is-right-for-my-product"><strong>Cloud video SDK or self-hosted — which is right for my product?</strong></h3><p>Rent a cloud SDK when you’re early, low or spiky volume, and have no residency pressure — speed wins. Own the path with self-hosted or managed infrastructure when volume is high and steady, or residency and white-label depth are hard requirements. Platforms like Samvyo cover the “own it” side with on-prem or managed deployment under a flat license.</p>]]></content:encoded></item><item><title><![CDATA[Video Call SDK vs Video Conferencing SDK vs Video Chat SDK: What’s the Difference, and Which One Do You Actually Need?]]></title><description><![CDATA[People search “video call SDK,” “video conferencing SDK,” and “video chat SDK” as if they’re the same product. They’re not — each maps to a different media architecture. Here’s what runs under each term, and a one-question test for which one your use case actually needs.]]></description><link>https://www.samvyo.com/blog/video-call-sdk-vs-video-conferencing-sdk-vs-video-chat-sdk-whats-the-difference-and-which-one-do-you-actually-need</link><guid isPermaLink="false">6a891daa8b45c3f0cd63a3c5</guid><category><![CDATA[Proprietary video SDKs]]></category><category><![CDATA[video SDK architecture]]></category><category><![CDATA[video API integration]]></category><category><![CDATA[SDK differences]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Sat, 22 Aug 2026 05:52:01 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/08/ChatGPT-Image-Aug-22--2026--11_19_54-AM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/08/ChatGPT-Image-Aug-22--2026--11_19_54-AM.png" alt="Video Call SDK vs Video Conferencing SDK vs Video Chat SDK: What’s the Difference, and Which One Do You Actually Need?"/><p>Search for a way to put video in your product and you’ll type one of four things almost at random: video call SDK, <strong>video conferencing SDK</strong>, video chat SDK, video calling SDK. The vendors use them interchangeably too, so it feels like they’re all the same box with a different sticker. They aren’t. Underneath the labels sit genuinely different media architectures — who sends video, who receives it, and how many people the system has to fan a stream out to. Pick by the word instead of the architecture and you’ll either overbuild a mesh you didn’t need or hit a wall the day your “calls” become a hundred-person broadcast.</p><p>This post untangles the four terms, maps each to what actually runs underneath, and gives you a one-question test for which one your use case needs. No vendor list — just the distinctions the labels hide.</p><h2 id="why-these-terms-get-used-interchangeably-and-why-that-costs-you"><strong>Why These Terms Get Used Interchangeably (and Why That Costs You)</strong></h2><p>“Call,” “conferencing,” “chat,” and “meeting” are marketing words, not technical categories. A vendor selling a general-purpose media stack will happily rank for all of them, because any of them could describe a customer. That’s fine for them and confusing for you, because the words do carry a real technical signal once you look past the SEO: they hint at the shape of the media flow — one-to-one, many-to-many, or one-to-many — and those shapes are different systems with different costs and failure points.</p><p>The trap is choosing infrastructure by the noun in your search bar. If you build a “video chat” feature on a peer-to-peer mesh because “chat” sounded lightweight, then grow into group rooms, the mesh collapses past a handful of participants and you re-architect. Match the term to the architecture up front and that whole detour disappears. So let’s define each term by the one thing that matters — who sends and who receives.</p><h2 id="video-call-sdk-one-to-one-and-small-group"><strong>Video Call SDK: One-to-One and Small Group</strong></h2><p>A “call” implies two sides talking, occasionally a small group. Both parties send and receive video, symmetrically. The lightest version can run peer-to-peer — the two endpoints connect more or less directly, with a media server only stepping in for NAT traversal or to keep quality stable. Add a few more participants and you graduate to a light <a href="https://samvyo.com/blog/what-is-an-sfu-and-why-does-every-video-platform-use-one?ref=samvyo.com" rel="noreferrer">SFU (Selective Forwarding Unit</a> — a media server that forwards each person’s stream to the others without re-mixing), but the defining trait stays: a handful of symmetric participants, all sending and receiving.</p><p>This is the right fit for a telehealth consultation, a customer-support video session, a one-to-one sales or advisory call, or a dating app’s first video date. Where it breaks: the moment “a call” quietly becomes “a webinar,” because peer-to-peer and small-group assumptions don’t survive a large audience. If there’s any chance your calls scale into a crowd, don’t start here. That larger, symmetric case has its own name.</p><h2 id="video-conferencing-sdk-many-to-many-everyone-participates"><strong>Video Conferencing SDK: Many-to-Many, Everyone Participates</strong></h2><p>A <strong>video conferencing SDK</strong> is built for the group room where everyone is a participant — all sending and all receiving, symmetrically, at the same time. That “everyone sends” property is what forces a real architecture. Peer-to-peer mesh has each person send a copy to every other person, so it collapses past four or five. A conferencing SDK therefore sits on an SFU: each participant uploads their stream once, and the server selectively forwards it to everyone else, plus the logic that a meeting needs — active-speaker detection, layout and grid management, mute state, dominant-speaker switching, and simulcast so each viewer gets a resolution their screen and bandwidth can handle.</p><p>This is the fit for team meetings, virtual classrooms where students participate, collaborative design or trading rooms, and any product where the value is people interacting, not just watching. It’s heavier than a call SDK because it has to be — the many-to-many pattern is genuinely more work. Where it’s overkill: if only one or two people ever actually send video and everyone else just watches, you’re paying for a symmetric architecture to do an asymmetric job. That job has its own term too.</p><h2 id="video-chat-sdk-lightweight-often-embedded-and-social"><strong>Video Chat SDK: Lightweight, Often Embedded and Social</strong></h2><p>“Video chat” is the fuzziest of the four, and the fuzziness is the point: it usually signals casual, consumer, embedded — a video layer dropped into a social app, a dating product, a community platform, a game. Architecturally it often looks like a video call SDK (one-to-one or small group, P2P or light SFU), but the word carries two extra hints. First, “chat” frequently means video plus text, presence, and messaging bundled together, so the SDK is as much about the surrounding social primitives as the media. Second, it implies embedded — video inside someone else’s app flow, not a standalone meeting product.</p><p>The distinction that saves you: “chat” is not “conferencing.” If a vendor’s video chat SDK is tuned for one-to-one social moments and you try to run a fifty-person all-hands on it, you’re back to the mesh wall. The word is lighter; make sure the architecture underneath is heavy enough for where you’re going. And there’s a fourth pattern people mean but rarely search cleanly — the true crowd case.</p><h2 id="webinar-broadcast-sdk-one-to-many"><strong>Webinar / Broadcast SDK: One-to-Many</strong></h2><p>When a few presenters broadcast to a large, mostly passive audience, the shape flips from symmetric to asymmetric — one-to-many rather than many-to-many. That’s a different architecture again: the system fans a small number of source streams out to hundreds or thousands of receivers, none of whom are sending video back most of the time. It looks like conferencing at the front (the presenters form a small group) and like broadcast at the back (everyone else receives). Interaction still exists — Q&amp;A, polls, chat, the occasional attendee pulled “on stage” — but the media flow is dominated by fan-out, not mesh.</p><p>Trying to run a 5,000-person webinar on a conferencing SDK sized for symmetric rooms is a classic scaling mistake; trying to run an interactive 8-person meeting on a broadcast-only stack is the opposite one. Same word “video,” four different jobs. Time to pick yours.</p><h2 id="the-decision-match-the-term-to-your-real-use-case"><strong>The Decision: Match the Term to Your Real Use Case</strong></h2><p>Skip the marketing words and ask one question: how many people send video, and how many only receive? That single answer picks the architecture, and the architecture picks the term.</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    border: 1px solid rgba(128, 128, 128, 0.4);
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 10px 16px;
    color: inherit;
    background: transparent;
    vertical-align: top;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18);
    font-weight: 700;
  }
</style>
<table class="rate-table">
  <colgroup><col width="127"><col width="100"><col width="100"><col width="144"><col width="153"/></col></col></col></col></colgroup>
  <thead>
    <tr>
      <th>SDK term</th>
      <th>Who sends video</th>
      <th>Who receives</th>
      <th>Architecture</th>
      <th>Typical use</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="font-weight:700;">Video call SDK</td>
      <td>1–2 (both sides)</td>
      <td>The other side</td>
      <td>P2P or light SFU</td>
      <td>Telehealth consult, support call</td>
    </tr>
    <tr>
      <td style="font-weight:700;">Video conferencing SDK</td>
      <td>Everyone in the room</td>
      <td>Everyone</td>
      <td>SFU, active-speaker logic</td>
      <td>Team meetings, virtual classroom</td>
    </tr>
    <tr>
      <td style="font-weight:700;">Video chat SDK</td>
      <td>1–few, casual</td>
      <td>Each other</td>
      <td>P2P / light SFU, often + text</td>
      <td>Social, dating, community apps</td>
    </tr>
    <tr>
      <td style="font-weight:700;">Webinar / broadcast SDK</td>
      <td>A few presenters</td>
      <td>A large passive audience</td>
      <td>SFU fan-out / broadcast</td>
      <td>Webinars, town halls, launches</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p><em>Read the middle two columns first — “who sends” and “who receives” decide everything to their right.</em></p><p>One practical note, since the terms blur in real products: a single general-purpose media platform built on SFU architecture can serve several of these patterns — one-to-one calls, symmetric conferencing, and one-to-many broadcast — from the same stack, because they’re all variations on “receive streams, forward them selectively.” Samvyo is one such SFU-based platform; the reason to consolidate on one is fewer moving parts when your product spans calls and rooms and webinars. The honest counter-point: if you only ever need one pattern — say, strictly one-to-one telehealth calls — a focused single-purpose SDK is simpler and cheaper than a platform that can do everything. Consolidate when you span patterns; specialise when you don’t.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>The term in your search bar is a label; the architecture underneath is the commitment. A video call SDK and a video chat SDK are usually small-group and symmetric; a video conferencing SDK is many-to-many and SFU-based; a webinar SDK is one-to-many fan-out. Choose by “who sends and who receives,” not by which noun a vendor happened to rank for — and you’ll never re-architect because a word was lighter than your use case turned out to be.</p><h2 id="what%E2%80%99s-next"><strong>What’s Next?</strong></h2><p><strong><em>Already know you need to build or integrate? </em></strong>The companion pieces go deeper: what it costs and commits you to when you integrate a video SDK: - Guide on <a href="https://www.samvyo.com/how-to-integrate-a-video-sdk-rooms-tokens-tracks-and-the-parts-the-quickstart-skips?ref=samvyo.com" rel="noreferrer">Integrating Video SDK</a> and the server-side layer that creates and controls those rooms is covered in <a href="https://samvyo.com/blog/what-is-a-video-room-api-and-how-is-it-different-from-a-video-sdk?ref=samvyo.com">what a video room API is</a>.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><h3 id="is-a-video-call-sdk-the-same-as-a-video-conferencing-sdk"><strong>Is a video call SDK the same as a video conferencing SDK?</strong></h3><p>No. A video call SDK targets one-to-one or small symmetric groups and can run peer-to-peer; a video conferencing SDK targets many-to-many rooms where everyone sends and receives, which forces an SFU-based architecture with active-speaker and layout logic. They overlap at small sizes but diverge sharply as participant count grows.</p><h3 id="what%E2%80%99s-the-difference-between-video-chat-and-video-conferencing"><strong>What’s the difference between video chat and video conferencing?</strong></h3><p>“Video chat” usually means lightweight, casual, often embedded in a social or community app, and frequently bundled with text and presence. “Video conferencing” means structured many-to-many rooms where all participants interact. The architectures can look similar at small scale, but conferencing is built to hold up as the room grows and chat generally isn’t.</p><h3 id="which-sdk-do-i-need-for-a-telehealth-app"><strong>Which SDK do I need for a telehealth app?</strong></h3><p>For one-to-one clinician–patient consultations, a video call SDK is the right fit — symmetric, small, low-latency. If you also run group sessions or classes, you’ll want a video conferencing SDK. A general-purpose SFU-based platform such as Samvyo can cover both patterns from one stack if you need the range.</p><h3 id="which-sdk-do-i-need-for-a-virtual-classroom"><strong>Which SDK do I need for a virtual classroom?</strong></h3><p>If students actively participate — camera on, talking, collaborating — that’s a video conferencing SDK (many-to-many, SFU-based). If one teacher broadcasts to a large passive audience, that’s closer to a webinar/broadcast SDK. Many education products need both modes, which is why platforms that support conferencing and broadcast from one stack are common here.</p><h3 id="do-i-need-a-different-sdk-for-webinars"><strong>Do I need a different SDK for webinars?</strong></h3><p>Often yes. Webinars are one-to-many fan-out — a few presenters, a large passive audience — which is architecturally different from symmetric conferencing. Running a large webinar on a conferencing SDK sized for group rooms is a common scaling mistake. Look for explicit broadcast/fan-out support rather than assuming a conferencing SDK covers it.</p><h3 id="can-one-sdk-do-calls-conferencing-and-webinars"><strong>Can one SDK do calls, conferencing, and webinars?</strong></h3><p>Yes, if it’s built on SFU architecture, because all three are variations on receiving streams and forwarding them selectively — the difference is how many senders and receivers. SFU-based platforms like Samvyo can serve calls, conferencing, and broadcast from one stack. The trade-off is that a single-pattern product may be simpler and cheaper if you truly only need one of the three.</p>]]></content:encoded></item><item><title><![CDATA[Multi-Site WebRTC Surveillance: Building the Site-Edge Relay and Central SFU That Scales to 50 Sites]]></title><description><![CDATA[From RTSP at 50 sites to WebRTC on one SOC wall. The edge relay that pulls on demand and repackages H.264, the central SFU that forwards only subscribed streams, WAN tuning for long-haul links, and failover that survives a dropped site — the design behind multi-site WebRTC surveillance.]]></description><link>https://www.samvyo.com/blog/multi-site-webrtc-surveillance-building-the-site-edge-relay-and-central-sfu-that-scales-to-50-sites</link><guid isPermaLink="false">6a8438b08b45c3f0cd63a37d</guid><category><![CDATA[video surveillance]]></category><category><![CDATA[surveillance architecture]]></category><category><![CDATA[WebRTC]]></category><category><![CDATA[NVR]]></category><category><![CDATA[Multi-site]]></category><category><![CDATA[multi-site webrtc]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Tue, 18 Aug 2026 11:49:13 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/08/ChatGPT-Image-Aug-18--2026--05_16_56-PM.png" medium="image"/><content:encoded><![CDATA[<blockquote>If you arrived from the <a href="https://www.samvyo.com/multi-site-video-surveillance-architecture-why-connecting-50-sites-to-one-soc-isnt-a-bandwidth-problem?ref=samvyo.com" rel="noreferrer">business version</a>, that piece made the cost case — always-on push versus on-demand pull, central fan-out, and failover. This is the companion “how,” for the architect who has to build or evaluate it. No re-running the cost math; we go straight to the wiring. Getting one RTSP camera into a browser is a solved problem, and we’ve documented the codec mechanics of it already.</blockquote><img src="https://www.samvyo.com/blog-admin1/content/images/2026/08/ChatGPT-Image-Aug-18--2026--05_16_56-PM.png" alt="Multi-Site WebRTC Surveillance: Building the Site-Edge Relay and Central SFU That Scales to 50 Sites"/><p><strong>Multi-site WebRTC surveillance</strong> is a different animal: the hard part isn’t any single camera-to-browser hop — it’s coordinating fifty of them into one Security Operations Centre (SOC) without transporting everything, all the time, across links you don’t control.</p><p>The mistake is to think of it as one big pipe. It’s three separate planes, each with its own engineering problem and its own failure mode.</p><h2 id="the-topology-of-multi-site-webrtc-surveillance-three-planes-not-one-pipe"><strong>The Topology of Multi-Site WebRTC Surveillance: Three Planes, Not One Pipe</strong></h2><p>Sort the system by where the work happens and it resolves into site edge, central aggregation, and SOC client. Each plane is tuned independently, and conflating them is how designs that demo fine fall over at forty sites.</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    border: 1px solid rgba(128, 128, 128, 0.4);
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 10px 16px;
    color: inherit;
    background: transparent;
    vertical-align: top;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18);
    font-weight: 700;
  }
</style>
<table class="rate-table">
  <colgroup><col width="117"><col width="197"><col width="157"><col width="152"/></col></col></col></colgroup>
  <thead>
    <tr>
      <th>Plane</th>
      <th>What runs</th>
      <th>Key tuning knob</th>
      <th>Primary failure mode</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="font-weight:700;">Site edge</td>
      <td>RTSP ingest, repackage or transcode, WebRTC egress</td>
      <td>Codec path, pull-on-subscribe</td>
      <td>Site goes dark</td>
    </tr>
    <tr>
      <td style="font-weight:700;">Central</td>
      <td>SFU: one ingest per site-stream, N forwards</td>
      <td>On-demand subscription</td>
      <td>Over-subscription / relay saturation</td>
    </tr>
    <tr>
      <td style="font-weight:700;">SOC client</td>
      <td>WebRTC subscriber, wall mosaic, focus view</td>
      <td>Sub-stream vs main-stream</td>
      <td>Workstation decode ceiling</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p><em>Read left to right, this is the whole path: a camera’s RTSP stream at a site becomes a WebRTC track a SOC operator subscribes to — but only when they subscribe.</em></p><p>Start at the edge, because that’s where the codec economics and the pull-on-demand behaviour are actually implemented.</p><h2 id="at-the-site-the-edge-relay"><strong>At the Site: The Edge Relay</strong></h2><p>Every site runs one small relay: a single point of contact between the local cameras and the outside world. It ingests RTSP locally, records locally, and speaks WebRTC to the center. Three decisions define it.</p><h3 id="rtsp-ingest-where-to-tap"><strong>RTSP ingest: where to tap</strong></h3><p>The relay can pull from the camera’s RTSP endpoint directly or from the NVR’s restream. Camera-direct gives you both the main-stream and the sub-stream the camera already encodes; tapping the NVR avoids a second connection to the camera but couples you to the NVR’s restreaming behaviour. Which tap you choose, and how you avoid adding load the NVR wasn’t sized for, is its own topic — we cover it in depth in the NVR-coexistence piece <a href="https://samvyo.com/blog/where-to-tap-the-stream-adding-live-browser-video-without-fighting-the-nvr?ref=samvyo.com" rel="noreferrer">[link]</a>. For multi-site, the rule of thumb is: pull the sub-stream for the wall mosaic, reserve the main-stream for the focus view, and take both from the camera where the camera can serve two concurrent pulls.</p><h3 id="the-codec-decision-at-the-edge"><strong>The codec decision at the edge</strong></h3><p>This is where per-site CPU sizing is won or lost. If a camera sends H.264, the relay repackages it — RTP-from-RTSP re-wrapped into WebRTC’s RTP — with no re-encode: near-zero CPU, low-hundreds-of-milliseconds latency. If a camera sends H.265, which the 4K cameras bought to save storage almost certainly do, the browser can’t be relied on to decode it (Chrome and Safari have added H.265 over WebRTC recently; Firefox hasn’t), so the relay must transcode to H.264 — a full decode-and-re-encode of every frame. The codec deep-dive covers why this split exists <a href="https://samvyo.com/blog/live-video-in-surveillance-why-rtsp-cameras-still-cant-talk-to-web-browsers-in-2026?ref=samvyo.com">[link]</a>; what matters here is the multiplication: transcoding is per-stream, so an edge box that shrugs at one transcode becomes a server the moment all eight cameras at a site are being watched in H.265. The mitigation is architectural — transcode only the streams a human has actually subscribed to, never the whole site — which is exactly what pull-on-demand buys you.</p><h3 id="push-vs-pull-implemented"><strong>Push vs pull, implemented</strong></h3><p>The relay keeps a lightweight control-plane connection to the center open at all times — a signaling channel (typically a WebSocket) over which it registers, heartbeats, and receives subscribe/unsubscribe commands. Media is different: the relay opens a WebRTC media path for a given camera only when the center tells it an operator has subscribed, and tears it down when the last subscriber leaves. Control plane always on; media plane on demand. That single implementation detail is what turns the business version’s “on-demand pull” from a slogan into the mechanism that keeps both bandwidth and transcode cost proportional to what’s being watched. It also has a happy side effect for NAT, which we’ll get to.</p><h2 id="in-the-middle-the-central-sfu-and-fan-out"><strong>In the Middle: The Central SFU and Fan-Out</strong></h2><h3 id="why-an-sfu-and-not-an-mcu-or-mesh"><strong>Why an SFU, and not an MCU or mesh</strong></h3><p>A mesh has every source send to every viewer and collapses past a handful; an MCU decodes and re-mixes everything into one stream, which is CPU-heavy and adds latency. A Selective Forwarding Unit (SFU) receives one upstream copy of each stream and selectively forwards packets to subscribers without re-encoding — low latency, light on CPU, and the standard for real-time video. The full SFU-versus-alternatives explainer lives in our enterprise video architecture piece <a href="https://samvyo.com/blog/what-is-an-sfu-and-why-does-every-video-platform-use-one?ref=samvyo.com">[link]</a>; here it’s enough that the center is an SFU.</p><h3 id="fan-out-mechanics"><strong>Fan-out mechanics</strong></h3><p>The site relay pushes a camera’s stream to the SFU once. The SFU forwards it to every subscriber — three operators plus the video wall — as independent downstream tracks, without the site ever uploading more than that single copy. This is the fix for the per-viewer duplication the business version described: per-site upload stays flat regardless of how many people open the same feed. It’s also the layer where a wall showing dozens of tiles pulls sub-streams while a single focused operator pulls the main-stream — the SFU forwards whichever the client subscribed to.</p><h3 id="on-demand-subscription-%E2%80%94-the-mechanism-behind-the-cost-gap"><strong>On-demand subscription — the mechanism behind the cost gap</strong></h3><p>The SFU only asks a site for a stream when at least one client subscribes to it. No subscription, no media leaves the site. Across 400 cameras with 30–40 watched at peak, that’s the difference between forwarding everything and forwarding a tenth of it — the 10× swing, expressed as subscription state rather than a bandwidth bill.</p><p>One note for managed service providers running several client estates from one platform: because subscriptions and streams are keyed per session, the same SFU can isolate tenants into separate namespaces with per-tenant authentication, so estate A’s operators can never subscribe to estate B’s cameras. That’s the whole of what multi-tenancy needs to be for this architecture — namespace and auth isolation at the subscription layer, not a separate system. The harder problems are on the WAN.</p><h2 id="across-the-wan-making-long-haul-links-behave"><strong>Across the WAN: Making Long-Haul Links Behave</strong></h2><h3 id="use-the-camera%E2%80%99s-dual-stream-instead-of-simulcast"><strong>Use the camera’s dual-stream instead of simulcast</strong></h3><p>WebRTC's usual answer to “different viewers need different resolutions” is <a href="https://samvyo.com/blog/what-is-simulcast-and-when-does-it-save-or-waste-bandwidth?ref=samvyo.com">simulcast — encoding several layers at the source, at a real uplink cost</a>. In surveillance you rarely need it, because the camera already encodes a main-stream and a sub-stream natively. The wall mosaic subscribes to sub-streams; the focus view subscribes to the main-stream; nothing at the edge has to generate extra layers. This is the same decode-ceiling logic as the video-wall piece <a href="https://samvyo.com/blog/why-watching-500-cameras-is-a-decode-problem-not-a-bandwidth-problem?ref=samvyo.com">[link]</a>, applied across the WAN: sub-streams keep both the link and the operator workstation inside budget, and the main-stream is spent only where someone is actually looking.</p><h3 id="jitter-buffer-and-congestion-control-for-high-rtt-links"><strong>Jitter buffer and congestion control for high-RTT links</strong></h3><p>Long-haul links have higher round-trip time and more variable jitter than a LAN, and WebRTC’s defaults are tuned for shorter hops. The levers: widen the receiver jitter buffer / playout delay to trade a little latency for smoothness, size the NACK retransmission window to the actual RTT so retransmits still arrive useful, and let the bandwidth estimator settle rather than oscillate on a link that’s bursty by nature. For a live view an operator acts on, keep the target latency tight; for a low-priority wall tile, a slightly deeper buffer is the right trade.</p><h3 id="nat-traversal-across-many-remote-sites"><strong>NAT traversal across many remote sites</strong></h3><p>Remote sites are usually behind NAT, often carrier-grade NAT with no inbound reachability at all. Here the pull-on-demand design pays off again: because the edge relay dials home to the center over its outbound control channel and originates the media connection outward, the center never needs to reach into the site. That sidesteps inbound NAT for the site side entirely. You still run STUN/TURN for the general WebRTC handshake and for SOC clients on awkward networks, and you <a href="https://samvyo.com/blog/the-turn-bill-the-self-hosted-video-cost-nobody-forecasts?ref=samvyo.com">budget TURN relay capacity</a> for the fraction of paths that can’t go direct — but you are not port-forwarding fifty sites. Which leaves the failure case every multi-site system has to answer for: a site going offline.</p><h2 id="when-a-site-drops-failover-and-reconnection"><strong>When a Site Drops: Failover and Reconnection</strong></h2><p><strong>Local recording continuity.</strong> The edge relay records the main-stream to local storage continuously, independent of WAN state — H.265 for storage efficiency, retained per your policy. A WAN outage never creates a recording gap; the footage is on-site and indexes to the center when the link returns.</p><p><strong>Health signaling.</strong> The control-plane heartbeat is what stops a frozen tile from masquerading as a live one. When heartbeats stop, the center marks the site unreachable and the SOC surfaces an explicit “site offline” state rather than the last decoded frame. Detecting the outage is the point; a green wall that silently froze is worse than an obviously red one.</p><p><strong>Reconnection logic.</strong> On recovery the relay re-registers automatically, with exponential backoff so a flapping link doesn’t hammer the center, and resumes subscriptions the SOC still has open. No operator should have to manually re-establish eight feeds because a branch’s ISP blinked.</p><p>Put the three planes together and the build-versus-buy question stops being philosophical.</p><h2 id="build-buy-or-deploy-multi-site-webrtc-surveillance"><strong>Build, Buy, or Deploy Multi-Site WebRTC Surveillance</strong></h2><p><strong>Build on open source.</strong> MediaMTX or go2rtc at each site for RTSP ingest, H.264 repackaging, and transcode-when-forced, in front of a general-purpose SFU at the center — mediasoup, LiveKit, or Janus are the usual open-source SFUs — with your own signaling, TURN, recording, and reconnection logic around them. Maximum control, and you own the transcode and subscription economics directly. Right when the media path is core to the product and you have the team to operate a distributed real-time system.</p><p><strong>Use a managed cloud relay.</strong> Fastest to a working SOC view, nothing to run — but your camera feeds route through a third party and you pay per stream as sites multiply. Right when speed outweighs owning the path.</p><p><strong>Deploy a commercial platform.</strong> The whole stack — RTSP ingest, repackage/transcode, SFU fan-out, on-demand subscription, recording — delivered as a unit you run on-premise or as a managed deployment on infrastructure you choose. Samvyo is one such option: it’s based on SFU architecture and deploys on-prem or as a managed cloud deployment under a flat license, which is the model that fits always-on surveillance rather than per-minute. Where it doesn’t fit: a single site or a handful of cameras, where open source or a relay is more than enough.</p><p>Three approaches, one axis — how much of the media path you want to own.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Multi-site WebRTC surveillance reduces to four implementation choices: an edge relay that pulls on subscribe and repackages H.264 rather than transcoding when it can, a central SFU that forwards only subscribed streams, WAN tuning that respects RTT and leans on the camera’s own dual-stream instead of simulcast, and edge-local recording that survives the link. Name the three planes and their failure modes, and the architecture writes itself — bandwidth, CPU, and cost all scale with what’s watched, not with what exists.</p><h2 id="what%E2%80%99s-next"><strong>What’s Next?</strong></h2><p><strong><em>Need the decision-maker’s version — what breaks and what it costs, without the wiring? </em></strong>The companion business piece frames the same three planes as a cost and operations decision: link to <a href="https://www.samvyo.com/multi-site-video-surveillance-architecture-why-connecting-50-sites-to-one-soc-isnt-a-bandwidth-problem?ref=samvyo.com" rel="noreferrer">business version</a>. </p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><h3 id="how-do-you-get-50-remote-sites-into-one-webrtc-soc"><strong>How do you get 50 remote sites into one WebRTC SOC?</strong></h3><p>Run a relay at each site that ingests RTSP locally and speaks WebRTC to a central SFU, and have the SFU pull a site’s stream only when an operator subscribes. That keeps bandwidth and transcode proportional to what’s being watched instead of streaming all cameras always-on. SFU-based platforms such as Samvyo implement this fan-out-on-subscribe pattern natively.</p><h3 id="should-the-site-edge-relay-transcode-or-pass-through"><strong>Should the site-edge relay transcode or pass through?</strong></h3><p>Repackage (pass through) H.264 whenever possible — it’s near-zero CPU and low latency. Transcode only H.265 streams that must reach browsers which can’t decode HEVC over WebRTC, and only the ones actually subscribed, because transcoding is a per-stream decode-and-re-encode cost that multiplies fast across a full site.</p><h3 id="push-or-pull-for-multi-site-surveillance"><strong>Push or pull for multi-site surveillance?</strong></h3><p>Keep the control plane always connected but pull media on demand: the relay registers and heartbeats continuously, and opens a media path for a camera only when someone subscribes. This is the mechanism behind the roughly 10× cost difference versus always-on push, and it also lets the site originate connections outward, sidestepping inbound NAT.</p><h3 id="how-do-you-tune-webrtc-for-a-high-latency-wan"><strong>How do you tune WebRTC for a high-latency WAN?</strong></h3><p>Widen the jitter buffer and playout delay to trade a little latency for smoothness, size the NACK retransmission window to the real round-trip time, and let the bandwidth estimator settle on bursty links. Use the camera’s native sub-stream for wall tiles and the main-stream only for the focused view, rather than generating simulcast layers at the edge.</p><h3 id="what-happens-to-recording-when-a-site-loses-its-wan-link"><strong>What happens to recording when a site loses its WAN link?</strong></h3><p>In a correct design the edge relay records to local storage continuously, independent of the WAN, so an outage never creates a recording gap; footage indexes to the center on reconnect. The control-plane heartbeat also marks the site unreachable so the SOC shows an explicit offline state rather than a frozen tile.</p><h3 id="how-do-you-isolate-tenants-for-an-msp-running-multiple-estates"><strong>How do you isolate tenants for an MSP running multiple estates?</strong></h3><p>Key streams and subscriptions per tenant and enforce per-tenant authentication at the SFU, so one estate’s operators can never subscribe to another’s cameras. For this architecture that namespace-and-auth isolation at the subscription layer is the whole of what multi-tenancy requires — which is why an SFU-based platform like Samvyo can serve several white-label estates from one deployment.</p>]]></content:encoded></item><item><title><![CDATA[Multi-Site Video Surveillance Architecture: Why Connecting 50 Sites to One SOC Isn’t a Bandwidth Problem]]></title><description><![CDATA[Cameras at 50 sites, one control room, and feeds that stutter — so you buy a bigger pipe. That fixes the wrong thing. Here's why multi-site surveillance is an architecture problem, what always-on streaming really costs versus on-demand pull, and what the right design looks like.]]></description><link>https://www.samvyo.com/blog/multi-site-video-surveillance-architecture-why-connecting-50-sites-to-one-soc-isnt-a-bandwidth-problem</link><guid isPermaLink="false">6a8438768b45c3f0cd63a377</guid><category><![CDATA[video surveillance]]></category><category><![CDATA[surveillance architecture]]></category><category><![CDATA[Multi-site]]></category><category><![CDATA[SOC]]></category><category><![CDATA[WebRTC]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Tue, 18 Aug 2026 11:47:58 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/08/ChatGPT-Image-Aug-18--2026--05_04_40-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/08/ChatGPT-Image-Aug-18--2026--05_04_40-PM.png" alt="Multi-Site Video Surveillance Architecture: Why Connecting 50 Sites to One SOC Isn’t a Bandwidth Problem"/><p>Ask an operations manager running a 50-site estate what’s wrong with their central monitoring, and the answer is almost always “bandwidth.” The video wall lags. Feeds drop. The SOC pulls up a site and waits three seconds for it to paint. So the request goes to IT: more bandwidth. It’s a reasonable instinct, and up to a point it’s even correct — a starved link will absolutely choke video. But past a certain size, <strong>multi-site video surveillance architecture</strong> stops being a bandwidth question and becomes a design question. The estates that run 200 sites into one Security Operations Centre (SOC) smoothly aren’t the ones that bought the biggest pipe. They’re the ones that stopped moving footage nobody is watching.</p><p>This is the difference between throwing money at symptoms and fixing the system. Let’s walk through where the money actually goes.</p><h2 id="the-50-site-soc-problem-concretely"><strong>The 50-Site SOC Problem, Concretely</strong></h2><p>Picture a retail chain: 50 stores, eight cameras each — entrances, tills, stockroom, loading bay. 400 cameras total. Head office has a SOC with four operators and a video wall, and the mandate is simple to say and hard to build: see everything, from anywhere, right now.</p><p>“See everything” hides a lot. It means any operator can pull up any camera at any of the 50 sites on demand. It means the video wall cycles through a live mosaic of priority feeds. It means when a loading-bay alarm fires at store 37, the operator gets a clean, low-latency live view in under a couple of seconds — not a frozen frame, not a spinner — because <a href="https://samvyo.com/blog/talk-down-at-ten-seconds-is-theater-the-surveillance-intervention-latency-budget?ref=samvyo.com">the seconds an operator spends waiting come out of the window in which anything can still be done</a>. And it means all of this keeps working when a store’s internet has a bad afternoon.</p><p>The same shape shows up everywhere: bank branch networks, warehouse complexes, hospital campuses, quick-service restaurant chains. Many remote sites, one central room, and an expectation that the room is omniscient. The naive way to deliver that is to have every site stream every camera to the center, all the time, so it’s always there when someone wants it. That single decision — always-on push — is where the cost story begins.</p><h2 id="why-%E2%80%9Cjust-add-bandwidth%E2%80%9D-runs-out-of-road"><strong>Why “Just Add Bandwidth” Runs Out of Road</strong></h2><p>Bandwidth is a real constraint, so let’s be fair to it before we move past it.</p><h3 id="where-more-bandwidth-genuinely-helps"><strong>Where more bandwidth genuinely helps</strong></h3><p>If your remote sites are on thin, contended links — a single ADSL line at a rural branch, a saturated 4G failover — then yes, more capacity directly buys you smoother live views and fewer drops. If the SOC’s own uplink is the choke point, upgrading it helps every feed at once. For small estates, five or ten sites, “buy a bigger pipe” is often the right answer because it’s cheaper than re-architecting anything. Don’t over-engineer a problem you don’t have yet.</p><h3 id="where-it-stops-helping"><strong>Where it stops helping</strong></h3><p>The trouble is that bandwidth scales linearly with a design that scales badly. If every one of your 400 cameras pushes its live stream to the center 24/7, you are paying to move 400 streams whether or not a human is looking at any of them. At 2 Mbps per live sub-stream — a conservative figure; the high-detail main-stream is heavier — that’s 800 Mbps of sustained ingest at the SOC before a single operator does anything. Double the estate to 100 sites and you need 1.6 Gbps. You are not buying visibility. You are buying the privilege of transporting footage into a room where nobody is watching most of it. No pipe is big enough to make that math stop hurting, because the math is the problem, not the pipe.</p><p>That leads straight to the first real cost driver.</p><h2 id="cost-driver-1-always-on-push-vs-on-demand-pull"><strong>Cost Driver #1: Always-On Push vs On-Demand Pull</strong></h2><h3 id="what-streaming-every-camera-all-the-time-actually-costs"><strong>What streaming every camera, all the time, actually costs</strong></h3><p>Let’s put real numbers on the retail example. 400 cameras, live sub-stream at 2 Mbps, running around the clock.</p><p><strong>Per camera: </strong>2 Mbps × 86,400 seconds ≈ 21.6 GB per day.</p><p><strong>Whole estate: </strong>400 × 21.6 GB ≈ 8.6 TB per day, or roughly 259 TB per month.</p><p>If that traffic lives entirely inside your own network — site-to-SOC over private links you already pay a flat fee for — the meter isn’t running per gigabyte, but the capacity still has to exist, and you’re sizing every link and every SOC uplink for peak-everything-at-once.</p><p>Now put it in a cloud-hosted setup where video crosses a metered boundary. At a representative egress rate of $0.09 per GB, moving 259 TB works out to roughly $23,300 per month — call it $280,000 a year — to relay footage that is, for the overwhelming majority of those camera-hours, watched by no one. That’s the number that makes finance sit up, and it’s entirely self-inflicted by the always-on assumption.</p><h3 id="on-demand-pull-only-move-what-someone-is-watching"><strong>On-demand pull: only move what someone is watching</strong></h3><p>Here’s the lever. At any given moment, how many of your 400 cameras is a human actually viewing? Four operators, a handful of tiles each, plus a video wall cycling a couple of dozen priority feeds — realistically you're looking at 30 to 40 live streams at peak, not 400, which is <a href="https://samvyo.com/blog/the-operator-to-camera-ratio-that-decides-whether-proactive-monitoring-pays?ref=samvyo.com">what the arithmetic of operators per camera actually allows</a>. Everything else is recording locally at the site (where it belongs) and sitting quiet until someone calls for it.</p><p>If the architecture only transports streams that are being viewed, your center-bound live traffic drops from 800 Mbps to under 100, and that $23,300 cloud egress line falls to roughly $2,300 — about a tenth. Same coverage. Same “see everything on demand.” You simply stopped paying to move the 90% that no one had open.</p><p>The whole cost gap in one view:</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    border: 1px solid rgba(128, 128, 128, 0.4);
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 10px 16px;
    color: inherit;
    background: transparent;
    vertical-align: top;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18);
    font-weight: 700;
  }
</style>
<table class="rate-table">
  <colgroup><col width="224"><col width="200"><col width="200"/></col></col></colgroup>
  <thead>
    <tr>
      <th>Dimension</th>
      <th>Always-on push</th>
      <th>On-demand pull</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="font-weight:700;">Live streams transported</td>
      <td>All 400 cameras, 24/7</td>
      <td>~30–40 (only those on screen)</td>
    </tr>
    <tr>
      <td style="font-weight:700;">Sustained bandwidth at the SOC</td>
      <td>~800 Mbps</td>
      <td>Under 100 Mbps</td>
    </tr>
    <tr>
      <td style="font-weight:700;">Monthly data moved to centre</td>
      <td>~259 TB</td>
      <td>~26 TB</td>
    </tr>
    <tr>
      <td style="font-weight:700;">Cloud egress @ $0.09/GB</td>
      <td>~$23,300 / month</td>
      <td>~$2,300 / month</td>
    </tr>
    <tr>
      <td style="font-weight:700;">On-premise (flat-licensed)</td>
      <td>Capacity sized for peak-everything</td>
      <td>No per-GB meter at all</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p><em>Assumptions: 50 sites × 8 cameras = 400 cameras; live sub-stream at 2 Mbps (main-stream is higher); egress at $0.09/GB where video crosses a metered cloud boundary. On-premise deployment removes the egress line entirely.</em></p><p>That 10× gap is the single biggest cost decision in the whole system, and it’s an architecture decision, not a bandwidth purchase. On-demand fixes the volume problem. The next one is subtler: even the streams you are watching can get duplicated.</p><h2 id="cost-driver-2-one-camera-many-operators"><strong>Cost Driver #2: One Camera, Many Operators</strong></h2><p>Say store 37’s loading bay is interesting this afternoon. Operator A pulls it up. So does Operator B. It’s also on the video wall. That’s the same physical camera being watched three ways at once.</p><p>In a naive setup, the site uploads that one feed three separate times — once per viewer — because each viewer opened its own independent connection back to the source. Three viewers, three times the upload from a site that may only have a modest connection to begin with. Add the wall and it’s four. The camera hasn’t changed; the cost and the strain have tripled, and the site’s link is now the bottleneck for exactly the feed everyone cares about.</p><p>The fix is to send the stream out of the site once and let a central layer copy it to as many operators as need it — the site’s upload cost stays flat no matter how many people watch. This “one stream in, many streams out” fan-out is the quiet workhorse of every large monitoring operation, and getting it wrong is how a system that tested fine with two operators falls over the day a real incident draws a crowd to the same feed.</p><p>So far we’ve assumed the sites stay up. They won’t.</p><h2 id="what-breaks-when-a-site-drops-offline"><strong>What Breaks When a Site Drops Offline</strong></h2><p>Remote sites lose connectivity. A store’s ISP has an outage, a digger cuts a line, the 4G failover is flaky. The question isn’t whether it happens — it’s what your SOC does in the ninety seconds after.</p><p>Three things determine whether an outage is a shrug or an incident. <strong>Detection:</strong> does the SOC actually notice store 37 went dark, or does the operator just assume it’s quiet? A wall of green tiles that silently freezes is worse than useless — it’s false confidence. <strong>The blind-spot window:</strong> while the site is offline, is it still recording locally so you have the footage later, or is that time simply gone? <strong>Reconnection:</strong> when the link comes back, does the site rejoin the SOC automatically and cleanly, or does someone have to notice and manually re-establish eight camera feeds?</p><p>The operational cost here isn’t bandwidth — it’s the coverage gap you didn’t know you had. A well-designed multi-site system treats every site as independently resilient: recording continues locally through the outage, the SOC is told clearly when a site is unreachable, and reconnection is automatic. A poorly designed one presents a frozen tile as a live one, and you find out during the incident review that the camera you needed was dark for an hour.</p><p>Detection, local resilience, clean reconnect — none of that comes from a bigger pipe either. It comes from the same architectural choices as everything above. So let’s put the whole picture together.</p><h2 id="what-a-multi-site-video-surveillance-architecture-should-actually-look-like"><strong>What a Multi-Site Video Surveillance Architecture Should Actually Look Like</strong></h2><p>Strip away the jargon and the design is three layers.</p><p><strong>At each site — a local relay.</strong> Every site keeps its own cameras, its own local recording, and a small piece of software that acts as the site’s single point of contact with the outside world. Cameras talk to it locally over the network they already use; it talks to the center. Recording stays on-site and survives outages. Only one controlled connection leaves the building.</p><p><strong>In the middle — an aggregation layer that fans out.</strong> The center receives streams from all sites and is responsible for the “one in, many out” copying — so three operators and a wall watching store 37 cost the site one upload, not four. Critically, it only pulls a site’s live stream when someone actually requests it, which is what keeps the 10× cost gap on the right side.</p><p><strong>At the SOC — operators and walls that pull on demand.</strong> Any operator opens any camera at any site and the stream is routed to them in near real time. Nothing is being transported that isn’t being watched.</p><p>Get those three layers right and the outcomes follow: bandwidth sized for what’s watched rather than what exists, per-site upload that doesn’t balloon with viewer count, and sites that fail gracefully instead of silently. Whether you build this, buy a cloud VMS that does it, or embed an existing platform is its own decision — we walk through that trade-off in the build, buy, or embed guide <a href="https://samvyo.com/blog/build-buy-or-embed-the-technical-decision-guide-for-video-infrastructure?ref=samvyo.com" rel="noreferrer">[link]</a> — but the shape above is what you’re evaluating any option against.</p><p>This fan-out-on-demand pattern is, mechanically, what a Selective Forwarding Unit does: receive from many sources, forward to many viewers, copy nothing you don’t have to. Samvyo is real-time video infrastructure based on SFU architecture, which is why the multi-site → central-SOC problem is its native shape rather than a bolt-on. A few things that matter specifically for estates like the one above: it deploys on-premise, so if your video never has to cross a metered cloud boundary, that $23,300 egress line simply doesn’t exist. Its licensing is flat, not per-minute, which matters when you’re running live monitoring around the clock — per-minute pricing and always-on surveillance are a bad marriage. And it’s white-label / OEM, which is the relevant bit if you’re a managed service provider running many client estates from one platform and need tenant isolation between them.</p><p>Where it doesn’t fit: if you have a handful of sites and a cloud VMS you’re happy with, none of this is worth re-architecting for — the bigger-pipe answer is genuinely cheaper for you. Samvyo is infrastructure for teams that have outgrown the off-the-shelf ceiling, not a replacement for a working small setup. The concession is the point: match the architecture to the estate, not to the vendor.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>At multi-site scale, bandwidth is a symptom and architecture is the cure. The three decisions that actually move cost and reliability are: pull streams on demand instead of pushing everything always-on (roughly a 10× swing on the traffic that dominates the bill), fan a watched feed out centrally instead of re-uploading it per viewer, and make every site independently resilient so an outage is a logged event rather than a silent blind spot. Buy a bigger pipe only after you’ve made those three choices — not instead of them.</p><h2 id="what%E2%80%99s-next"><strong>What’s Next?</strong></h2><p><strong><em>Own the architecture rather than the budget? </em></strong>The technical companion to this post covers the implementation: site-edge relay design, WAN tuning for long-haul links, failover and reconnection logic, and multi-tenant isolation: <a href="https://www.samvyo.com/multi-site-webrtc-surveillance-building-the-site-edge-relay-and-central-sfu-that-scales-to-50-sites?ref=samvyo.com" rel="noreferrer">link to technical version.</a> </p><p>It also pairs naturally with the earlier pieces on tapping the stream without fighting the NVR and the real cost of adding browser video to an existing CCTV estate [<a href="https://www.samvyo.com/youre-never-greenfield-what-it-really-costs-to-put-existing-cctv-in-a-browser?ref=samvyo.com" rel="noreferrer">link</a>].</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><h3 id="how-much-bandwidth-do-i-need-to-connect-50-sites-to-one-soc"><strong>How much bandwidth do I need to connect 50 sites to one SOC?</strong></h3><p>It depends entirely on whether you push all cameras always-on or pull streams on demand. Always-on for 50 sites × 8 cameras at 2 Mbps is about 800 Mbps sustained at the SOC. On demand — transporting only the 30–40 streams actually being watched at peak — it’s under 100 Mbps for the same estate. The design choice matters far more than the pipe size, which is why infrastructure built on SFU architecture, such as Samvyo, forwards only what’s being viewed.</p><h3 id="is-always-on-streaming-or-on-demand-pull-cheaper-for-multi-site-surveillance"><strong>Is always-on streaming or on-demand pull cheaper for multi-site surveillance?</strong></h3><p>On-demand is typically an order of magnitude cheaper because you stop transporting footage no one is watching. For a 400-camera estate, the difference on metered cloud egress can be roughly $23,000 versus $2,300 a month. On-premise deployment removes the per-gigabyte meter entirely, which is why platforms like Samvyo that run on-prem with flat licensing suit around-the-clock monitoring.</p><h3 id="can-one-central-soc-realistically-monitor-200-remote-sites"><strong>Can one central SOC realistically monitor 200 remote sites?</strong></h3><p>Yes, provided the multi-site video surveillance architecture pulls on demand and fans watched streams out centrally rather than having every site push everything continuously. The limit isn’t the number of sites; it’s whether you’re moving all cameras all the time or only the ones in view. Get the on-demand and fan-out design right and the site count becomes almost incidental.</p><h3 id="what-happens-when-a-remote-site-loses-its-internet-connection"><strong>What happens when a remote site loses its internet connection?</strong></h3><p>In a well-designed system the site keeps recording locally through the outage, the SOC is clearly notified that the site is unreachable rather than shown a frozen tile, and the site reconnects automatically when the link returns. The risk to avoid is a monitoring wall that presents a dead feed as a live one. Local resilience plus explicit outage signalling is an architecture property, not a bandwidth one.</p><h3 id="why-does-watching-the-same-camera-from-multiple-operators-strain-the-system"><strong>Why does watching the same camera from multiple operators strain the system?</strong></h3><p>If each viewer opens an independent connection back to the source, the site uploads that one feed once per viewer — three operators and a video wall can mean the same camera is sent four times. Central fan-out solves this: the stream leaves the site once and is copied at the center to every viewer. This “one in, many out” behaviour is exactly what an SFU-based platform like Samvyo provides, keeping per-site upload flat regardless of viewer count.</p><h3 id="should-a-multi-site-retailer-or-bank-use-cloud-vms-or-self-hosted-infrastructure"><strong>Should a multi-site retailer or bank use cloud VMS or self-hosted infrastructure?</strong></h3><p>Small estates with a few sites are often best served by an off-the-shelf cloud VMS — it’s cheaper than re-architecting. Larger estates hit two walls: metered cloud egress on always-on video, and data-residency requirements (footage is personal data under regimes like DPDP). At that point on-premise or self-managed infrastructure with flat licensing — the model Samvyo is built for — usually wins on both cost and compliance.</p>]]></content:encoded></item><item><title><![CDATA[PTZ Over the Web: Why Steering a Camera Is Harder Than Streaming It]]></title><description><![CDATA[Streaming a camera is one-way; steering one is a closed control loop through a human watching delayed video. This piece explains why PTZ over WebRTC is bounded by video latency — and how the data channel, ONVIF commands, control arbitration, and a dead-man's switch make it usable.]]></description><link>https://www.samvyo.com/blog/ptz-over-the-web-why-steering-a-camera-is-harder-than-streaming-it</link><guid isPermaLink="false">6a7c1a4f8b45c3f0cd63a2a7</guid><category><![CDATA[PTZ]]></category><category><![CDATA[WebRTC]]></category><category><![CDATA[ONVIF]]></category><category><![CDATA[video surveillance]]></category><category><![CDATA[Remote Camera Control]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 12 Aug 2026 10:37:03 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/08/ptz.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/08/ptz.png" alt="PTZ Over the Web: Why Steering a Camera Is Harder Than Streaming It"/><p>Everything about web-based surveillance so far has been about moving video in one direction: down, from the camera to the browser, as fast and cheaply as possible. That is the hard-won part, and once you have low-latency live view, adding pan-tilt-zoom (PTZ) looks like a small feature on top — a joystick widget, a few buttons, some commands sent back to the camera. Then an operator tries to follow a person walking across a car park. The camera lurches past them, corrects, overshoots the other way, and oscillates around the target like a drunk driver. Every command arrived. The feature "works." And it is unusable. Because PTZ over WebRTC is not a media problem bolted onto live view — it is a control-loop problem, and the loop runs through a human steering a physical motor they can only see through a delayed feed.</p><h2 id="ptz-is-a-control-plane-not-a-media-plane"><strong>PTZ is a control plane, not a media plane</strong></h2><p>Start by noticing that the vector flips. Streaming is a one-way, downstream, buffered problem: bytes flow from camera to viewer, a jitter buffer smooths them, and a few hundred milliseconds of delay is tolerable because nobody is reacting to the video in a tight loop. PTZ is the opposite on every axis. It is interactive, it flows upstream, and it is a closed loop — the operator issues intent, the camera physically moves, the scene changes, and that change comes back only through the video feed, which the operator uses to decide the next input.</p><p>The camera has also stopped being a data source and become a physical actuator. A pan command doesn't flip a bit; it drives a motor that accelerates, travels, and decelerates a real mass. That mechanical reality is inside the loop now, alongside the network. And the moment you draw the whole loop, you find the latency that actually breaks PTZ sitting somewhere most teams never think to look.</p><blockquote><em>It isn't in the command path. It's in the video.</em></blockquote><h2 id="the-latency-that-kills-ptz-is-your-video-latency"><strong>The latency that kills PTZ is your video latency</strong></h2><p>Walk the loop the operator is actually closing. They nudge the joystick; the input is sampled and serialized; the command travels up to the camera; the camera's controller interprets it and drives the motor; the scene changes; that new scene is captured, encoded, sent down the streaming pipeline, buffered, decoded, and painted; and only then does the operator see the result and decide their next move. The effective control latency they feel is the sum of the whole trip — command uplink, plus mechanical response, plus the entire video downlink.</p><p>That last term dominates, and it is the one nobody budgets for. Suppose your command reaches the camera in twenty milliseconds — excellent. If the operator doesn't see the consequence of that command for three hundred milliseconds because that's what your video pipeline adds, they are steering blind for three hundred milliseconds. So they over-correct, because the target hasn't visibly moved yet; then the delayed motion arrives all at once; then they correct back. The human is a feedback controller, and you have put a long delay in their feedback signal — the classic recipe for oscillation. The practical consequence is blunt: PTZ usability is bounded by video latency, not command latency. It is also exactly why HLS-based surveillance, sitting five to ten seconds behind reality because of <a href="https://samvyo.com/blog/the-blind-five-seconds-what-live-view-latency-costs-you-on-a-video-wall?ref=samvyo.com">segment holdback and the wait for the next keyframe</a>, cannot offer usable PTZ at all — closed-loop steering through a multi-second delay is impossible. Sub-second WebRTC transport isn't a nice-to-have for PTZ; it is the thing that makes PTZ possible.</p><blockquote><em>Given the loop is latency-bound, the command model you choose decides whether that latency merely annoys the operator or actively endangers the shot.</em></blockquote><h2 id="continuous-vs-discrete-the-command-model-is-your-failure-mode"><strong>Continuous vs discrete: the command model is your failure mode</strong></h2><p>ONVIF — the standard almost every PTZ camera speaks — offers a few distinct ways to move a camera, and they are not interchangeable once a network is in the middle. The tempting one is ContinuousMove: pan left at a given velocity and keep going until a Stop arrives. It gives the nicest joystick feel, and it is the most dangerous choice over a link that can delay or drop a packet. Because if the Stop is late or lost, the camera does not stop. It sails past the target, or in the worst case keeps sweeping — an outstanding "keep moving" instruction with no one left to cancel it.</p><p>The discrete operations don't carry that risk. RelativeMove nudges by an offset and completes. AbsoluteMove drives to exact pan/tilt/zoom coordinates and completes. GotoPreset recalls a saved position in one shot. Each is self-contained: there is no held state that a lost packet can strand, so latency and loss cost you a missed nudge, not a runaway camera. A robust web PTZ design leans on relative moves and presets for the bulk of interaction and treats continuous move as the sharp tool it is — reserved for deliberate joystick control, and never without the safety net we'll come to.</p><p/>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="90"><col width="130"><col width="163"><col width="137"><col width="107"/></col></col></col></col></colgroup><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#0b1521;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#ffffff;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Model</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#0b1521;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#ffffff;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">ONVIF operation</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#0b1521;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#ffffff;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Behaviour</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#0b1521;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#ffffff;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Robustness to latency / loss</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#0b1521;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#ffffff;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Best for</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Continuous</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">ContinuousMove + Stop</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Move at a velocity until told to stop</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Fragile — a lost Stop overshoots or runs away</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Joystick feel, short bursts + dead-man's switch</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Relative</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">RelativeMove</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Nudge by an offset from here</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Robust — self-contained, no held state</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Fine adjustments, click-to-nudge</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Absolute</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">AbsoluteMove</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Go to exact pan/tilt/zoom coordinates</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Robust — idempotent</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Repeatable positions, automation</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Preset</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">GotoPreset</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Recall a saved position</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Most robust — a single shot</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Fast recall, patrols, common views</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><blockquote><em>Which raises the obvious question: how do any of these commands even reach a camera behind a customer's NAT, when the browser can't speak the camera's language in the first place?</em></blockquote><h2 id="the-bridge-a-webrtc-data-channel-meets-onvif-ptz"><strong>The bridge: a WebRTC data channel meets ONVIF PTZ</strong></h2><p>The browser speaks WebRTC. The camera speaks ONVIF PTZ — SOAP and XML over HTTP — and sits behind NAT on the site's private network, unreachable directly. The elegant answer is to reuse the connection you already built for video. Alongside the media, open a WebRTC data channel on the same peer connection: it is already NAT-traversed through the same ICE and DTLS path, already low-latency, already secured, and it sits right beside the feed the operator is watching. PTZ intents ride that data channel to the media server or gateway, which translates each one into the matching ONVIF call — ContinuousMove, RelativeMove, AbsoluteMove, GotoPreset, Stop — and issues it to the camera on the local network.</p><p>The data channel also lets you match transport semantics to the command, which matters more than it sounds. A stream of continuous-velocity updates should be sent unreliable and unordered: only the latest joystick value has any worth, so a dropped intermediate frame should never be retransmitted — the same reasoning game netcode uses for player input. Discrete commands, and above all Stop, should be sent reliable and ordered: those must not be lost and must not arrive out of sequence. One data channel, configured per message type, gives you both. The upshot is that the control channel comes essentially free with the media connection — you are not standing up a second transport or punching another hole through NAT; you are adding a lane to the road you already paved.</p><blockquote><em>With commands flowing reliably to one camera, the last problem is the one every command centre hits: the camera can only point one way, and more than one operator wants it.</em></blockquote><h2 id="who-holds-the-joystick-control-arbitration"><strong>Who holds the joystick: control arbitration</strong></h2><p>A PTZ camera has one physical orientation, so however many operators can watch it, only one can steer it at a time. That makes control a resource to be arbitrated, and the arbitration has to live in your gateway rather than the camera — ONVIF does define session and priority notions, but they are implemented inconsistently across vendors, so you cannot rely on the camera to referee. The gateway grants a control lock to one operator, and everyone else stays a viewer until it's released.</p><p>A workable model has three parts. A lock, so one operator holds control at a time. A priority tier, so a supervisor or an alarm-driven action can preempt a lower-priority operator rather than being stuck behind them. And an idle timeout, so a lock is released automatically when the holder stops steering — otherwise someone who grabbed control and walked away leaves the camera frozen to everyone else, the zombie-lock failure. Without arbitration you get the other failure mode: two operators issuing competing commands, the camera jittering between their inputs, oscillating for a reason that has nothing to do with the network. Explicit locking with preemption and idle-release turns "who has the camera" from a fight into a protocol.</p><blockquote><em>Arbitration decides who steers. One last mechanism decides whether a single lost packet wrecks the shot.</em></blockquote><h2 id="the-dead-mans-switch-surviving-the-lost-stop"><strong>The dead-man's switch: surviving the lost Stop</strong></h2><p>Return to the dangerous case: an operator holds the joystick, the gateway has issued ContinuousMove, and the connection hiccups at the exact moment they let go — so the Stop never lands. The camera keeps moving. The robust defence borrows from industrial control: a dead-man's switch. While the operator holds the joystick, the browser re-sends the move intent as a periodic heartbeat — every couple of hundred milliseconds — and the gateway only keeps the camera moving as long as those heartbeats keep arriving. The instant they stop, whether because the operator released or the connection dropped, the gateway issues Stop on its own after a short timeout. A lost Stop is no longer catastrophic, because the absence of the heartbeat is itself the stop signal.</p><p>The alternative is to design the risk away: prefer RelativeMove increments over continuous velocity, so there is never an outstanding "keep moving" state to leak in the first place. Most good web PTZ systems do both — relative nudges for precision, continuous move for feel, and a dead-man's heartbeat wrapping the continuous case. This is simply graceful degradation applied to the control plane: assume the network will fail mid-command, and make the safe state the default when it does. Put the loop, the command model, the data-channel bridge, arbitration, and the dead-man's switch together, and PTZ stops being a few buttons and becomes a small control system.</p><h2 id="build-buy-or-deploy"><strong>Build, buy, or deploy</strong></h2><p>Adding a joystick to a demo is an afternoon. Making PTZ usable, safe, and multi-operator over the open web is a control-system decision — build, buy, or deploy.</p><p><strong>Build on open source. </strong>Media servers that already give you a WebRTC peer connection also give you the data channel to carry control. What you build on top is the ONVIF PTZ translation, the reliable/unreliable message handling, the arbitration model, and the dead-man's switch. Right when live camera control is core to your product and you have the engineers to own a control loop.</p><p><strong>Use a managed relay. </strong>Some hosted services offer PTZ passthrough alongside their streaming — fastest to a working joystick. You inherit their control latency and their command model, and the control path routes through their cloud with the video. Right when speed matters more than owning the loop.</p><p><strong>Deploy a platform you run. </strong>The media path and the control path delivered as one stack — the same peer connection carrying fanned-out video also carrying the PTZ data channel, with the ONVIF bridge and arbitration included — run on-premise or as a managed cloud deployment under a flat license, so both video and control stay inside infrastructure you own. Samvyo is one such option; it is based on SFU architecture, so the single connection that fans one camera out to many viewers is the same one that carries control to the operator holding the lock. Where it doesn't fit: fixed cameras with no PTZ, where none of this applies and a plain live-view path is all you need.</p><blockquote><em>Three sourcing paths, one axis — how much of the control loop you want to own versus rent.</em></blockquote><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>PTZ over WebRTC is not a media feature; it is a latency-bound control loop closed through a human watching delayed video. The latency that decides whether it's usable lives in the video pipeline, not the command path — which is why sub-second WebRTC transport is the thing that makes web PTZ viable where HLS never could. On top of that, usability is an architecture: prefer self-contained relative and preset moves over fragile continuous velocity, carry commands on the data channel you already have with transport semantics matched per message, arbitrate control so one operator steers at a time, and wrap it all in a dead-man's switch so a lost packet parks the camera instead of running it away. Get those right and steering a camera through a browser feels like holding the joystick in your hand — which, across a delayed network to a motor on a wall, is a genuinely hard thing to earn.</p><h2 id="whats-next"><strong>What's Next?</strong></h2><p><em>PTZ cameras don't live alone — they sit as tiles on a wall of many feeds. </em>The companion piece on video-wall architecture covers how to run hundreds of live cameras at once without drowning the client, and where a controllable PTZ feed fits among them: <strong>link to </strong><a href="https://www.samvyo.com/why-watching-500-cameras-is-a-decode-problem-not-a-bandwidth-problem?ref=samvyo.com" rel="noreferrer"><strong>video wall blog</strong></a></p><p>And the sub-second latency PTZ depends on starts with getting the camera into the browser at all — the RTSP-to-WebRTC pipeline: <strong>link to </strong><a href="https://www.samvyo.com/live-video-in-surveillance-why-rtsp-cameras-still-cant-talk-to-web-browsers-in-2026?ref=samvyo.com" rel="noreferrer"><strong>RTSP-to-WebRTC blog</strong></a></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><h3 id="why-does-my-ptz-camera-overshoot-or-lag-when-controlled-over-the-internet"><strong>Why does my PTZ camera overshoot or lag when controlled over the internet?</strong></h3><p>Almost always because of video latency, not command latency. You steer a PTZ camera by watching the result of your last move, so if the video feed is delayed, you're reacting to stale footage and over-correcting — which produces overshoot and oscillation. Getting control to feel responsive is mostly about getting video latency down (sub-second, via WebRTC), not about sending commands faster.</p><h3 id="can-you-control-a-ptz-camera-through-a-web-browser"><strong>Can you control a PTZ camera through a web browser?</strong></h3><p>Yes. The browser can't speak ONVIF directly, so PTZ commands travel over a WebRTC data channel — opened on the same connection as the video — to a gateway that translates them into ONVIF PTZ operations (ContinuousMove, RelativeMove, AbsoluteMove, GotoPreset, Stop) and issues them to the camera on its local network. The control channel reuses the NAT-traversed path you already have for the feed.</p><h3 id="continuous-move-or-absoluterelative-move-for-web-ptz"><strong>Continuous move or absolute/relative move for web PTZ?</strong></h3><p>Prefer relative, absolute, and preset moves for most interaction — they're self-contained, so a delayed or lost packet can't strand the camera in motion. Continuous (velocity) move gives the best joystick feel but is fragile over the network: if its Stop is lost, the camera keeps moving. If you use continuous move, wrap it in a heartbeat/dead-man's switch that auto-stops when input or connectivity drops.</p><h3 id="how-do-you-stop-two-operators-fighting-over-one-ptz-camera"><strong>How do you stop two operators fighting over one PTZ camera?</strong></h3><p>With control arbitration in your gateway: grant a control lock to one operator at a time, allow higher-priority users to preempt, and release the lock on an idle timeout so a walked-away operator doesn't freeze the camera for everyone. ONVIF's own priority handling is inconsistent across vendors, so the arbitration should live in your platform, not the camera.</p><h3 id="what-happens-if-the-stop-command-is-lost-during-a-ptz-move"><strong>What happens if the Stop command is lost during a PTZ move?</strong></h3><p>Without a safeguard, the camera keeps moving — the core danger of continuous-velocity control over a lossy link. The fix is a dead-man's switch: the browser sends a periodic heartbeat while the operator holds the joystick, and the gateway stops the camera automatically when the heartbeats stop, whether from release or disconnection. Preferring relative moves, which have no held state, avoids the situation entirely.</p><h3 id="can-a-platform-like-samvyo-carry-ptz-control-as-well-as-the-video"><strong>Can a platform like Samvyo carry PTZ control as well as the video?</strong></h3><p>Yes — that's a natural fit for the model. Based on SFU architecture, a platform like Samvyo already maintains the WebRTC connection that fans one camera out to many viewers; the same connection carries a data channel for PTZ intent to the operator who holds control, bridged to ONVIF at the gateway. Deployed on-premise or as a managed cloud deployment, both the video and the control loop stay inside infrastructure you own.</p>]]></content:encoded></item><item><title><![CDATA[Where to Tap the Stream: Adding Live Browser Video Without Fighting the NVR]]></title><description><![CDATA[A camera has only a handful of connections, and the recorder already holds one. This technical companion walks NVR live streaming as a stream-source decision — camera main-stream, sub-stream, or NVR re-stream — plus single-pull fan-out and recording-priority reconnection.]]></description><link>https://www.samvyo.com/blog/where-to-tap-the-stream-adding-live-browser-video-without-fighting-the-nvr</link><guid isPermaLink="false">6a7c1a228b45c3f0cd63a2a3</guid><category><![CDATA[NVR]]></category><category><![CDATA[live streaming]]></category><category><![CDATA[RTSP]]></category><category><![CDATA[ONVIF]]></category><category><![CDATA[video surveillance]]></category><category><![CDATA[WebRTC]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 12 Aug 2026 10:20:28 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/08/NVRtechnical.png" medium="image"/><content:encoded><![CDATA[<blockquote>If you are here from the <a href="https://www.samvyo.com/youre-never-greenfield-what-it-really-costs-to-put-existing-cctv-in-a-browser?ref=samvyo.com" rel="noreferrer">business version</a>, you are in the right place.</blockquote><img src="https://www.samvyo.com/blog-admin1/content/images/2026/08/NVRtechnical.png" alt="Where to Tap the Stream: Adding Live Browser Video Without Fighting the NVR"/><p>The business version made the case for augmenting an existing estate instead of ripping it out. From the architecture chair, augmenting sounds like the easy half: the camera already exposes an RTSP URL, so point a media server at it, convert to WebRTC, done. It works in the demo. Then you scale past a couple of viewers and something starts dropping — sometimes the live view, sometimes, alarmingly, the recording. The reason is that an IP camera is not a media server, and the NVR already holds a connection to it around the clock. So the first real decision in NVR live streaming is not which media server or which browser API. It is where you tap the stream — because that one choice sets your connection budget, your CPU cost, and whether recording and live view can coexist at all.</p><h2 id="the-camera-is-not-a-media-server"><strong>The camera is not a media server</strong></h2><p>Open up what you are actually pulling from. An IP camera is a small embedded system: an image sensor, a hardware encoder ASIC that turns raw frames into H.264 or H.265, a modest SoC, and a lightweight network stack running an RTSP server. That RTSP server answers DESCRIBE, SETUP, PLAY — but it was built to serve a recorder and maybe an operator, not a fan-out audience. Each concurrent session costs it encoder access, packetization, and socket state it has very little of to spare, so the main stream typically supports only a handful of simultaneous connections — often single digits, and model-dependent — before frames start stuttering or new sessions are refused.</p><p>Now remember who is already sitting in one of those seats: the NVR, holding a session continuously to record every frame. That connection is not optional and not interruptible — it is the compliance-critical job of the whole system. So every consumer your live layer adds is competing for the few seats left beside the recorder. Point ten browsers at the camera directly and you don't get ten viewers; you get a starved encoder and, in the worst case, a recorder that loses its stream.</p><blockquote><em>So before you point anything at the camera, you have to count seats — and decide which one you're taking.</em></blockquote><h2 id="three-places-to-tap-three-trade-offs"><strong>Three places to tap, three trade-offs</strong></h2><p>There are exactly three points you can pull a live feed from in a recording deployment, and choosing among them is the core of the architecture.</p><p><strong>The camera main-stream </strong>is the full-resolution feed the recorder archives. Tapping it directly gives you the best image and the lowest latency, but it spends the camera's scarcest resource and puts you in direct contention with recording. Viable only at small viewer counts — or behind a single pull that fans out, which we'll get to.</p><p><strong>The camera sub-stream </strong>is the second, lower-resolution feed most IP cameras encode in parallel (D1 or CIF, low bitrate) — and it is frequently already H.264 even when the main stream is H.265. It is purpose-built for live preview, it costs the camera far less, and pulling it leaves the main stream entirely to the recorder. For most live browser and mobile use, this is the cleanest coexistence you can get off the camera itself.</p><p><strong>The NVR or VMS re-stream </strong>flips the topology: many recorders expose an RTSP or ONVIF re-stream of what they are already ingesting, so your live layer pulls from the recorder instead of the camera. The camera then sees a single consumer — the NVR — no matter how many people watch. The cost is an extra hop of latency — <a href="https://samvyo.com/blog/the-blind-five-seconds-what-live-view-latency-costs-you-on-a-video-wall?ref=samvyo.com">stacked on top of the delay a live view is already carrying before anyone measures it</a> — and a dependency on the NVR's re-stream capacity and licensing, which varies widely by vendor.</p><p/>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="117"><col width="137"><col width="137"><col width="100"><col width="113"/></col></col></col></col></colgroup><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#0b1521;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#ffffff;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Tap point</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#0b1521;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#ffffff;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Resolution / codec</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#0b1521;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#ffffff;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Connection cost on camera</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#0b1521;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#ffffff;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Latency</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#0b1521;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#ffffff;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Coexistence</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Camera main-stream</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Full res, H.264/H.265</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">High — competes with the recorder for scarce seats</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Lowest</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Poor — the stream the recorder needs</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Camera sub-stream</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Low res (D1/CIF), often H.264</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Low — a separate encoded stream</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Low</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Good — leaves main-stream to the recorder</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">NVR / VMS re-stream</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Whatever the NVR serves</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">None on the camera — NVR is sole consumer</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Higher (extra hop)</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.3pt 5pt 3.3pt 5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Best — the camera sees one consumer</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><blockquote><em>Whichever tap point you choose, the golden rule underneath all three is the same: the source — camera or NVR — should be pulled once, not once per viewer.</em></blockquote><h2 id="pull-once-fan-out-%E2%80%94-the-core-of-nvr-live-streaming"><strong>Pull once, fan out — the core of NVR live streaming</strong></h2><p>The move that makes any of the three tap points scale is to put a media server between the source and the audience and pull exactly one session from the source. That server ingests the single stream and forwards it to every browser watching, selectively — the selective-forwarding model — without opening a new pull on the camera for each viewer. One of the camera's scarce seats is spent, and one only, regardless of whether two operators are watching or two hundred.</p><p>This is the difference between a design that respects the camera's limits and one that fights them. Without a fan-out layer, ten viewers means ten pulls, and you blow the connection cap and starve the recorder — exactly the failure the previous section warned about. With it, viewer count is decoupled from source load entirely: the camera feels one consumer, the media server absorbs the multiplication, and scaling the audience becomes a problem on your infrastructure rather than on a $150 embedded device bolted to a wall. This single-pull, many-viewer property is precisely what <a href="https://samvyo.com/blog/what-is-an-sfu-and-why-does-every-video-platform-use-one?ref=samvyo.com" rel="noreferrer">SFU-based infrastructure</a> exists to provide.</p><blockquote><em>Fan-out solves the count. But live view and recording still want two different things from the same bytes — and where you split them decides your CPU bill.</em></blockquote><h2 id="coexisting-with-247-recording-two-paths-one-source"><strong>Coexisting with 24/7 recording: two paths, one source</strong></h2><p>Recording and live view have opposite priorities. The recorder wants the original, highest-fidelity stream — full-resolution H.265, untouched — archived continuously, because detail is evidence and efficiency is storage. Live view wants the opposite: a low-latency, browser-renderable H.264 feed it can show right now, where a slightly softer image is completely acceptable. Try to serve both from the same main-stream tap and you are forced into one of two bad places: double-pulling the main stream (two scarce seats), or transcoding the archive-grade H.265 down to browser H.264 in real time — the exact transcode tax that turns one camera into a server farm at scale.</p><p>The clean topology separates the two paths at the source rather than downstream. Let the recorder keep the main-stream, untouched, doing the passthrough archival it does cheaply. Give the live layer the sub-stream — already low-bitrate and often already H.264, so it frequently sidesteps the transcode entirely — or the NVR re-stream. You end up with two independent paths off one device: a high-fidelity recording path the browser never touches, and a lightweight live path the recorder never notices. Split at the source, and the CPU-heavy conflict simply never arises.</p><blockquote><em>With the source chosen and the two paths separated, the last coexistence question is the one that actually bites in production: what happens when something drops.</em></blockquote><h2 id="failure-reconnection-and-a-shared-source"><strong>Failure, reconnection, and a shared source</strong></h2><p>Cameras reboot. PoE switches cycle. Wireless links flap. When a camera drops, both the recorder and the live layer lose it at once, and both will try to reconnect — and that is where a naïve live layer becomes dangerous. If your reconnection logic hammers the camera the instant it reappears, racing to re-establish live sessions, it can occupy the very connection seats the recorder needs to resume recording. You end up with a live-view feature that starves compliance-critical recording during exactly the window when something worth recording may be happening.</p><p>The discipline is a stated priority: recording is sacred, live view yields. Reconnection should use exponential backoff rather than a tight retry loop, so a returning camera is not stampeded. And the live layer should treat the recorder's session as reserved — reclaiming its own seats only after the recorder has re-secured its own. On a shared, connection-limited source, coexistence is not just about who taps where; it is about who gets the seat back first when the source returns.</p><blockquote><em>Put the tap decision, the single-pull fan-out, the split paths, and the reconnection priority together, and coexistence stops being luck and becomes a topology you can draw.</em></blockquote><h2 id="build-buy-or-deploy"><strong>Build, buy, or deploy</strong></h2><p>Getting one existing camera into a browser is a weekend. Making a live layer coexist cleanly with a recording estate — across the right tap points, single-pull fan-out, split paths, and recording-priority reconnection — is an infrastructure decision.</p><p><strong>Build on open source. </strong>Media servers like go2rtc and MediaMTX ingest RTSP from a camera or an NVR, handle sub-streams, pass H.264 through untouched, and convert to WebRTC for the browser. What you build and operate on top is the coexistence logic: tap-point selection, fan-out orchestration, and the recording-priority reconnection. Right when the live layer is core to your product and you have the media engineers.</p><p><strong>Use a managed relay. </strong>A hosted service pulls from your site and serves the browser — fastest to live, least to run. You still choose the tap point on your side; they own the cloud path and the per-stream cost. Right when speed matters more than owning the media path.</p><p><strong>Deploy a platform you run. </strong>The full media stack — RTSP ingest from camera or NVR, sub-stream handling, single-pull fan-out, WebRTC delivery — delivered as something you run on-premise or as a managed cloud deployment, under a flat license, so feeds stay inside infrastructure you control. Samvyo is one such option; it is based on SFU architecture, which is what supplies the single-pull, many-viewer property this whole design leans on. Where it does not fit: a handful of cameras with a couple of viewers, where a media server alone already covers it and a full platform is over-engineering.</p><blockquote><em>Three sourcing paths, one axis — how much of the coexistence layer you want to own versus rent.</em></blockquote><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>The NVR already took the good seat, and that reframes the whole problem. Live browser video on an existing estate is not a media-server question, it is a stream-source topology question: tap the sub-stream or the NVR re-stream rather than fighting the recorder for the main-stream, pull the source exactly once and fan out to every viewer, split the recording and live paths at the source so the transcode conflict never arises, and make reconnection yield to recording when the camera returns. Get the tap right, and NVR live streaming stops being a fight with the recorder and becomes a clean layer beside it.</p><h2 id="whats-next"><strong>What's Next?</strong></h2><p><em>Want the decision-and-cost framing to forward to a non-engineer stakeholder? </em>The companion business piece covers rip-and-replace versus augment, the sunk-CapEx math, and the egress cost of getting video out of the site: <a href="https://www.samvyo.com/youre-never-greenfield-what-it-really-costs-to-put-existing-cctv-in-a-browser?ref=samvyo.com" rel="noreferrer"><strong>link to business version</strong></a></p><p>And on the codec half of coexistence — why the sub-stream so often saves you a transcode, and what happens when it doesn't — see the RTSP-to-WebRTC piece: <strong>link to </strong><a href="https://www.samvyo.com/live-video-in-surveillance-why-rtsp-cameras-still-cant-talk-to-web-browsers-in-2026?ref=samvyo.com" rel="noreferrer"><strong>RTSP-to-WebRTC blog</strong></a></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><h3 id="how-many-simultaneous-connections-can-an-ip-camera-handle"><strong>How many simultaneous connections can an IP camera handle?</strong></h3><p>Fewer than you'd expect. The main stream on many cameras supports only a handful of concurrent RTSP sessions — often single digits, and it varies by model — because each session costs the camera's encoder and network stack real resources. The recorder already holds one continuously, so the practical answer is to pull the camera once through a media server and fan out to viewers, rather than connecting each viewer directly.</p><h3 id="should-i-pull-the-live-stream-from-the-camera-or-the-nvr"><strong>Should I pull the live stream from the camera or the NVR?</strong></h3><p>It depends on your seat budget. Pulling the camera's sub-stream is the cleanest option off the camera itself — low cost, leaves the main stream to the recorder. When the camera's connections are exhausted or you want to offload it entirely, pull the NVR's RTSP/ONVIF re-stream instead, so the camera sees only the recorder as a consumer. Tapping the main stream directly is a last resort, viable only behind single-pull fan-out.</p><h3 id="what-is-an-nvr-or-onvif-re-stream"><strong>What is an NVR or ONVIF re-stream?</strong></h3><p>Many NVRs and VMS platforms can re-expose a stream they are already ingesting from a camera, over RTSP or ONVIF, so other systems pull from the recorder instead of the camera. It offloads the camera — which now serves a single consumer — at the cost of an extra latency hop and a dependency on the recorder's re-stream capacity and licensing.</p><h3 id="how-do-i-add-live-browser-view-without-disrupting-recording"><strong>How do I add live browser view without disrupting recording?</strong></h3><p>Separate the two paths at the source. Leave the recorder on the full-resolution main stream, and give live view the sub-stream or the NVR re-stream, so they don't compete for the same scarce connection. Then make reconnection yield to recording — use backoff, and let the recorder reclaim its session first when a camera returns — so live view can never starve the compliance-critical recording.</p><h3 id="does-using-the-sub-stream-avoid-the-h265-transcode-problem"><strong>Does using the sub-stream avoid the H.265 transcode problem?</strong></h3><p>Often, yes. Many cameras encode the main stream in H.265 but the sub-stream in H.264, which browsers accept over WebRTC without re-encoding. Pulling the sub-stream for live view therefore sidesteps the transcode in a lot of deployments — though it's worth confirming per camera model, since the codec split isn't universal. The RTSP-to-WebRTC piece covers what happens when the browser can't take the codec directly.</p><h3 id="can-a-platform-like-samvyo-pull-from-an-existing-camera-sub-stream-or-nvr"><strong>Can a platform like Samvyo pull from an existing camera sub-stream or NVR?</strong></h3><p>Yes — that is the coexistence case. Based on SFU architecture, a platform like Samvyo ingests RTSP from a camera's sub-stream or an NVR re-stream, pulls the source once, and fans it out to many browser and mobile viewers without adding load per viewer. Deployed on-premise or as a managed cloud deployment, it keeps the live layer inside infrastructure you control while the existing recorder keeps doing the recording.</p>]]></content:encoded></item><item><title><![CDATA[You're Never Greenfield: What It Really Costs to Put Existing CCTV in a Browser]]></title><description><![CDATA[“Add cloud video” sounds like a fresh build, but every real deployment already has an NVR recording. This piece breaks down the real cost of cloud video surveillance on an existing estate — sunk CapEx, camera connection limits, and the egress bill nobody puts on the quote.]]></description><link>https://www.samvyo.com/blog/youre-never-greenfield-what-it-really-costs-to-put-existing-cctv-in-a-browser</link><guid isPermaLink="false">6a7c19ef8b45c3f0cd63a29f</guid><category><![CDATA[Cloud Video Surveillance]]></category><category><![CDATA[video surveillance]]></category><category><![CDATA[NVR]]></category><category><![CDATA[VSaaS]]></category><category><![CDATA[CCTV]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 12 Aug 2026 10:20:17 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/08/NVRbusiness.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/08/NVRbusiness.png" alt="You're Never Greenfield: What It Really Costs to Put Existing CCTV in a Browser"/><p>The demo is always greenfield. Clean cameras, a clean cloud account, a live feed in a browser tab inside five minutes. And the demo is honest about the destination — that is genuinely where surveillance is going: live view on any device, from anywhere, nothing installed. But no customer you will ever sell into is greenfield. Every real deployment already has a recorder in a closet, cameras mounted years ago, an operations team trained on a particular VMS, and retention rules configured to satisfy a regulator. So adding cloud video surveillance is never a build. It is an integration on top of an incumbent that already owns the camera streams — and that single fact quietly reshapes the cost of the whole project.</p><h2 id="the-incumbent-in-the-closet"><strong>The incumbent in the closet</strong></h2><p>Walk into any existing site and inventory what is already there. Cameras — often dozens to hundreds, bought over several years, each representing real capital. A network video recorder (NVR), or an older DVR, sitting on the local network, recording every camera around the clock. A video management system (VMS) the operators know by muscle memory. Retention configured to a mandate — 30, 90, sometimes 180 days. And an operational routine built around all of it.</p><p>None of that is free to discard. A mid-size estate of 200 cameras is tens of thousands of dollars in sunk hardware before you count the NVRs, the switches, and the labour that installed them. More importantly, the recorder already holds the camera streams and the compliance posture is already signed off. When a vendor's pitch quietly assumes you will throw that out to "go cloud," they are asking you to write off working capital and reset a regulator-approved process — and they rarely put that on the quote. So the real question is not "cloud or not." It is what you do with the recorder that is already there.</p><blockquote><em>There are only three honest answers, and they have three very different cost shapes.</em></blockquote><h2 id="three-ways-to-add-live-video-%E2%80%94-three-cost-shapes"><strong>Three ways to add live video — three cost shapes</strong></h2><p>Every approach to putting existing CCTV in a browser reduces to one of three, and the difference between them is measured in disruption, not features.</p>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="113"><col width="163"><col width="163"><col width="163"/></col></col></col></colgroup><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#0b1521;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8.5pt;font-family:Arial,sans-serif;color:#ffffff;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Approach</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#0b1521;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8.5pt;font-family:Arial,sans-serif;color:#ffffff;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What you do</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#0b1521;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8.5pt;font-family:Arial,sans-serif;color:#ffffff;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cost &amp; disruption</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#0b1521;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8.5pt;font-family:Arial,sans-serif;color:#ffffff;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Right when</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8.5pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Rip &amp; replace</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8.5pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Retire NVRs, move to full cloud VSaaS</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8.5pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Highest — writes off sunk hardware, retrains ops, resets retention</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8.5pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">The estate is end-of-life, or the incumbent vendor is a dead end</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8.5pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Augment</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8.5pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Keep NVRs recording; add a live layer that taps existing streams</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8.5pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Lowest — preserves CapEx and workflows; adds an integration + egress line</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8.5pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">You need live/browser/mobile view without disrupting recording</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8.5pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Hybrid / phased</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8.5pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Augment now; migrate cameras to cloud-native as they age out</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8.5pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Spread over time — pay migration only as hardware retires</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:8.5pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">A large estate you want to modernise without a forklift</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><p>Rip-and-replace is clean on the whiteboard and brutal on the balance sheet: it writes off sunk hardware, retrains an ops team, and resets a compliance configuration that was working. It is the right call in exactly one situation — when the estate is genuinely end-of-life, or the incumbent NVR/VMS vendor has become a dead end you cannot integrate with. Augmenting keeps the recorder doing what it already does well and adds a thin live-video layer beside it — <a href="https://samvyo.com/blog/proactive-vs-reactive-surveillance-what-proactive-actually-means-and-whos-really-doing-it?ref=samvyo.com">the difference between reviewing an incident after the fact and seeing it while it is still happening</a>. Hybrid is augmenting with a migration plan attached. Most sane deployments land on augment, then hybrid — and that is where a hidden constraint sets the real cost.</p><blockquote><em>Because "just also pull the stream" sounds free, and it isn't.</em></blockquote><h2 id="why-just-also-pull-the-stream-isnt-free"><strong>Why "just also pull the stream" isn't free</strong></h2><p>The instinct when augmenting is simple: the camera is already producing a stream, so point the live-video layer at the same camera and pull it too. The problem is that a camera is not an unlimited source. Its main stream typically supports only a handful of simultaneous connections — often single digits — before the encoder or the camera's little onboard CPU runs out of headroom. And one of those connections is already spoken for: the NVR is holding it, continuously, to record.</p><p>So a second pull straight off the camera competes with the recorder for a scarce resource, and at any real viewer count you run out. The practical fixes — pulling the live feed from the NVR's re-stream instead of the camera, or using the camera's low-resolution sub-stream for live view while the main stream keeps recording — are exactly the kind of decision that looks like a technical detail but lands as a business one. It determines whether you need extra recorder licensing, whether you can serve the viewer counts you promised, and what the per-site build actually costs. (The companion technical piece walks <a href="https://samvyo.com/blog/where-to-tap-the-stream-adding-live-browser-video-without-fighting-the-nvr?ref=samvyo.com">where to tap the stream</a> and why; the business point is only that the tap is a constraint with a price, not a given.)</p><blockquote><em>And wherever you tap it, the stream still has to leave the building — which is the cost line nobody puts on a cloud quote.</em></blockquote><h2 id="the-cost-cloud-hides-getting-video-out-of-the-site"><strong>The cost cloud hides: getting video out of the site</strong></h2><p>"Cloud means no hardware" is the most expensive half-truth in surveillance. The NVR sits behind the site's firewall on a private network; the cloud cannot simply reach in and pull from it. So every cloud surveillance deployment installs something on-site to push the video out — a bridge or connector appliance — and every camera-hour you actually watch remotely burns egress bandwidth. You did not remove hardware; you swapped a recorder you own for a connector box you rent, plus a monthly data bill.</p><p>The size of that bill turns entirely on one decision: do you stream continuously to the cloud, or only on demand? The math is unforgiving. A single 1080p camera at roughly 2 Mbps, streamed continuously, moves about 648 GB per month; at commodity cloud egress near $0.09 per GB, that is around $58 per camera every month — before storage, before viewing. Multiply by 200 cameras and continuous cloud streaming is a five-figure monthly line by itself. This is precisely why serious designs record locally and stream live only when a human is actually watching: the same camera viewed for an hour a day, on its low-bitrate sub-stream, costs a small fraction of that. On-demand viewing is not a feature; it is the difference between a viable unit economic and an absurd one.</p><blockquote><em>Put the sunk stack, the tap constraint, and the egress reality together, and the decision stops being a religious "cloud versus on-prem" argument and becomes a portfolio call.</em></blockquote><h2 id="making-the-call-augment-first-migrate-deliberately"><strong>Making the call: augment first, migrate deliberately</strong></h2><p>For the large majority of real estates, the rational path is to augment first: leave the NVRs recording, add a live-video layer that taps the existing streams sensibly, keep viewing on-demand to control egress, and preserve the CapEx and the compliance posture you already paid for. Then migrate deliberately — as cameras age out and are replaced, buy cloud-native or standardise them, so the estate modernises over years without a forklift and without a write-off.</p><p>Rip-and-replace earns its cost in the narrow cases where the estate is truly end-of-life, where a regulator's residency demand cannot be met by the current setup, or where the incumbent vendor's lock-in has become more expensive than the replacement. Outside those, replacing a working recorder to add a browser tab is solving a small problem with a large invoice. Name which situation you are actually in, and the spend picks itself.</p><h2 id="how-you-source-the-cloud-video-surveillance-layer"><strong>How you source the cloud video surveillance layer</strong></h2><p>Once you have decided to augment, the live layer itself is build, buy, or deploy — and the choice mirrors the same ownership question.</p><p><strong>Build on open source. </strong>Media servers that ingest RTSP and convert it for the browser get you a working live view for no license fee. You own the operational reality: NAT traversal out of each site, scaling, the recorder-coexistence logic, and the on-call. Right when live video is core to your product and you have the engineers.</p><p><strong>Buy a cloud VSaaS. </strong>Fastest to live, least to operate — but your feeds route through a third party's cloud, you inherit their egress and per-stream pricing, and residency is theirs to define. Right when speed outweighs owning the path.</p><p><strong>Deploy a platform you run. </strong>The live-video stack delivered as something you run on your own infrastructure or a managed cloud deployment, under a flat license, so the feeds and the egress stay inside infrastructure you control. Samvyo is one such option — based on SFU architecture, deployed on-premise or on your chosen cloud, embeddable under your own brand. It fits when data residency or flat, predictable cost at scale matters. Where it does not: a handful of cameras with no residency pressure, where a media server or a hosted relay is simpler and cheaper.</p><blockquote><em>Three sourcing paths, one axis — how much of the live-video layer you want to own versus rent.</em></blockquote><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>You are never greenfield. The recorder in the closet, the sunk camera CapEx, the regulator-approved retention, the trained operators — all of it is already there, and the cost that decides your project is not the cloud subscription. It is the integration on top of the incumbent and the egress of getting video out of the site. Augmenting an existing NVR estate almost always beats replacing it, because it preserves the capital and the compliance you already own and adds only the thin live layer you were missing. Cloud video surveillance done well is not a rip-out. It is a layer — priced honestly, tapped carefully, and viewed on demand.</p><h2 id="whats-next"><strong>What's Next?</strong></h2><p><em>Want the engineering-level version — exactly where to tap the stream, how to coexist with a recorder that already holds the camera, and the connection limits that shape it? </em>The companion technical deep-dive walks the coexistence architecture for the team that has to build it: <a href="https://www.samvyo.com/where-to-tap-the-stream-adding-live-browser-video-without-fighting-the-nvr?ref=samvyo.com" rel="noreferrer"><strong>link to technical companion</strong></a></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><h3 id="do-i-have-to-replace-my-nvr-to-get-cloud-or-browser-based-live-view"><strong>Do I have to replace my NVR to get cloud or browser-based live view?</strong></h3><p>No. In most deployments the right move is to augment — leave the NVR recording and add a live-video layer that taps the existing camera or NVR streams. Replacing the recorder writes off working hardware and resets a compliance setup that was already signed off; it is justified only when the estate is end-of-life or the incumbent vendor can't be integrated with.</p><h3 id="what-does-it-actually-cost-to-add-cloud-video-to-existing-cctv"><strong>What does it actually cost to add cloud video to existing CCTV?</strong></h3><p>The subscription is rarely the main cost. The real lines are the on-site bridge or connector hardware per location, the egress bandwidth of streaming video out of each site, and the integration work of coexisting with the recorder that already holds the camera. Priced honestly, those three — not the cloud licence — decide the project.</p><h3 id="is-cloud-cctv-cheaper-than-an-on-premise-nvr"><strong>Is cloud CCTV cheaper than an on-premise NVR?</strong></h3><p>It depends on how you view. Streamed continuously to the cloud, a single 1080p camera can run tens of dollars a month in egress alone, so at scale continuous cloud streaming is more expensive than local recording. Recording locally and streaming live only on demand — the sensible pattern — keeps cloud costs low. The cost model, not the word "cloud," decides which is cheaper.</p><h3 id="can-i-keep-my-existing-cameras-when-moving-to-cloud-video"><strong>Can I keep my existing cameras when moving to cloud video?</strong></h3><p>Almost always, yes. A well-designed live-video layer works on top of the ONVIF/RTSP cameras and recorders you already run, so you rarely need to replace hardware to add live browser or mobile view. Replacing cameras is a gradual, age-out decision — not a prerequisite for going live.</p><h3 id="whats-the-difference-between-rip-and-replace-and-augmenting-a-surveillance-system"><strong>What's the difference between rip-and-replace and augmenting a surveillance system?</strong></h3><p>Rip-and-replace retires the NVRs and moves everything to a new (usually cloud) platform — clean architecture, high cost and disruption. Augmenting keeps the recorders doing their job and adds a live-video layer beside them — lower cost, preserves CapEx and compliance. Augmenting is the default; replacement is for end-of-life estates or dead-end vendors.</p><h3 id="can-a-platform-like-samvyo-coexist-with-an-existing-nvr-estate"><strong>Can a platform like Samvyo coexist with an existing NVR estate?</strong></h3><p>That is the augment case it is built for. Based on SFU architecture and deployed on-premise or as a managed cloud deployment, a platform like Samvyo can add the live browser/mobile layer on top of existing ONVIF/RTSP cameras and recorders, keeping feeds and egress inside infrastructure you control under a flat license. For a small, residency-free deployment it may be more than you need; for a large estate where control and predictable cost matter, it fits the coexistence model rather than forcing a rip-out.</p>]]></content:encoded></item><item><title><![CDATA[Why Watching 500 Cameras Is a Decode Problem, Not a Bandwidth Problem]]></title><description><![CDATA[Your network can carry 500 camera streams — but one workstation can't decode 50. This piece breaks down why the video wall is a decode problem, not a bandwidth one: dual-stream cameras, server-side mosaics, and full resolution only where an operator is actually looking.]]></description><link>https://www.samvyo.com/blog/why-watching-500-cameras-is-a-decode-problem-not-a-bandwidth-problem</link><guid isPermaLink="false">6a7c199f8b45c3f0cd63a29b</guid><category><![CDATA[video surveillance]]></category><category><![CDATA[video wall architecture]]></category><category><![CDATA[VSaaS]]></category><category><![CDATA[live streaming]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Wed, 12 Aug 2026 10:10:00 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/08/video-wall.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/08/video-wall.png" alt="Why Watching 500 Cameras Is a Decode Problem, Not a Bandwidth Problem"/><p>Two hundred cameras. A dozen operators. One video wall of live tiles that has to stay fluid while somebody watches a loading bay at 2 a.m. Build it naïvely and it stutters — tiles freeze, the grid goes soft — and the first reflex, every time, is to blame the network and buy a fatter pipe. Bandwidth is a real constraint, and at a true fleet-of-cameras scale you will provision for it. But the wall rarely dies of bandwidth. It dies because the machine drawing it ran out of a resource nobody put on the quote: decode. Getting a live video wall architecture to hold at 50, 200, 500 cameras is, first and last, a decode-budgeting problem — and once you see it that way, the design writes itself.</p><h2 id="what-actually-happens-between-the-wire-and-the-screen"><strong>What actually happens between the wire and the screen</strong></h2><p>Before you can call bandwidth the villain, follow one tile from packet to pixel. A live feed arrives as compressed video — H.264 or H.265 off the camera — and <a href="https://samvyo.com/blog/h-264-vs-h-265-over-webrtc-why-the-storage-codec-breaks-the-live-path?ref=samvyo.com">which of the two it is decides whether a browser can decode it at all</a>. To show it, the client demuxes the stream, hands it to a decoder that reconstructs every frame, composites the result into its tile, and paints it. Bandwidth governs only the first step: getting the bytes there. Everything after is decode and draw, and that is the expensive part.</p><p>Here is the asymmetry that matters. Bandwidth scales roughly linearly and it is cheap to add — more megabits is a line item. Decode does not scale like that. Hardware decoders — the dedicated GPU block (NVDEC on NVIDIA, Quick Sync on Intel) that makes HD video cheap to play — expose a fixed number of concurrent decode sessions. Cross that number and you do not degrade gracefully; you fall off a cliff into CPU software decode, an order of magnitude heavier, or you simply start dropping frames. A workstation that plays four 1080p feeds without noticing will not play forty by adding RAM. The ceiling is the decoder, and it is a wall, not a slope.</p><blockquote><em>So if decode is the ceiling, the fix is not a fatter pipe. It is sending the client less to decode — and surveillance solved that specific problem years before WebRTC existed.</em></blockquote><h2 id="dual-stream-the-surveillance-native-trick-the-web-forgot"><strong>Dual-stream: the surveillance-native trick the web forgot</strong></h2><p>Nearly every IP camera made in the last decade emits two streams at once. A main-stream at full resolution — 4K or 1080p, high bitrate — meant for recording, where detail is evidence. And a sub-stream at low resolution — often D1 (720×576) or CIF, low bitrate — meant for exactly this: live preview, thumbnails, a wall of tiles nobody is yet scrutinising pixel by pixel. This is dual-streaming, and it is native surveillance vocabulary; a webcam has no such concept.</p><p>The mistake web-first teams make is pulling the main-stream for every tile because it is the "real" stream. On a wall, that is decode suicide. A tile 300 pixels wide does not need a 4K decode behind it. Pull sub-streams for the grid and the decode cost per tile collapses — you hold far more tiles inside the same fixed decoder budget, because each one is a fraction of the work. The main-stream is for the recorder and for the one feed a human zooms into. The wall runs on sub-streams.</p><blockquote><em>Sub-streaming buys you an order of magnitude. But an order of magnitude is not infinity — at a couple hundred tiles you still cannot decode a couple hundred of anything on one client. That is where the work has to move off the client entirely.</em></blockquote><h2 id="server-side-mosaic-composite-before-it-reaches-the-client"><strong>Server-side mosaic: composite before it reaches the client</strong></h2><p>When tile count outruns even the sub-stream budget, the move is to stop shipping the client many streams and ship it one. A server composites — decodes many camera feeds, lays them into a single grid frame, re-encodes that grid as one stream — and the client decodes exactly one video to show sixteen, twenty-five, sixty-four cameras. This is server-side mosaic, or tiling, and it turns an impossible client decode into a trivial one.</p><p>Nothing is free, and the trade is worth naming honestly: the decode-and-compose work did not vanish, it moved to the server, which now pays a real-time encode cost per mosaic — the same encode tax that makes recording expensive, in a new place. But that cost is shared and controllable. One server-side mosaic serves every operator looking at that grid, instead of every operator's workstation decoding the grid independently. You spend server CPU — ideally GPU-accelerated encode — to buy back client decode you do not have. The rule of thumb: forward individual sub-streams while the client can still decode them; mosaic when the tile count would blow the client's budget.</p><blockquote><em>Mosaic makes the overview cheap. But an overview is not why the operator is there — the moment something moves, they click one tile to full-screen, and now they need a real stream, at full resolution, right now.</em></blockquote><h2 id="focus-and-spot-full-resolution-only-where-a-human-is-looking"><strong>Focus and spot: full resolution only where a human is looking</strong></h2><p>A good wall is mostly low-cost overview with one high-cost point of attention, and the architecture should mirror that. The grid runs on sub-streams or a mosaic; the instant an operator promotes a tile to full-screen — the spot monitor, in surveillance terms — you switch that one feed to the main-stream and give it the full-resolution decode it now deserves. Twenty-four tiles at preview quality plus one at full quality is a decode budget any workstation can hold. Twenty-five at full quality is not.</p><p>The catch is the switch itself. Surveillance cameras run long GOPs — a keyframe, the complete frame a decoder needs to start, only every one to four seconds, to save bandwidth and storage — so a naïve switch to the main-stream shows the operator a black tile until the next keyframe arrives. On the feed they clicked precisely because something is happening, a two-second black screen is the worst possible moment to stall. The fix lives on the media server: keep a rolling cache of the last keyframe, and the frames since, per stream, and replay from it the moment a viewer joins so decode starts immediately. Done right, click-to-full-res feels instant instead of laggy.</p><blockquote><em>So the wall is a budget — a decode budget, allocated deliberately across many cheap tiles and one expensive focus. The last question is whether that budget survives contact with reality: many operators, and cameras whose networks flap.</em></blockquote><h2 id="one-pull-per-camera-a-video-wall-that-degrades-gracefully"><strong>One pull per camera: a video wall that degrades gracefully</strong></h2><p>Two failure modes separate a demo wall from a deployed one. The first is duplication. If ten operators watch the same camera and the system opens ten pulls on it, you have multiplied load on the constrained end — the camera and its uplink — for nothing. The fix is fan-out: pull each camera once, into a media server, and forward that single ingest to every operator watching it. A camera should never feel the viewer count. This <a href="https://samvyo.com/blog/what-is-an-sfu-and-why-does-every-video-platform-use-one?ref=samvyo.com">selective-forwarding model</a> is the whole reason a media server sits in the middle at all.</p><p>The second is fragility under loss. On a wall of two hundred feeds, at any moment some camera's network is flapping — a PoE switch reboots, a wireless link drops. The question is whether that one bad feed stalls its tile and leaves the other 199 fluid, or drags the whole grid. Per-tile isolation — each feed decoded and recovered independently, a frozen tile showing a last frame or a reconnecting state rather than blocking the compositor — is the difference. It is also why you cannot lean on the camera to smooth things for you: an IP camera's hardware encoder emits one fixed bitrate and cannot do the per-viewer quality laddering a webcam does — <a href="https://samvyo.com/blog/what-is-simulcast-and-when-does-it-save-or-waste-bandwidth?ref=samvyo.com">what simulcast provides, and what it costs</a> — so the adaptation has to happen in the infrastructure — sub-stream selection, mosaic, graceful per-tile recovery — not at the source.</p><blockquote><em>Put the pieces together — decode budget, dual-stream, mosaic, focus-switch, single-pull fan-out — and "can it handle 500 cameras?" stops being a bandwidth quote and becomes an architecture you either own or rent.</em></blockquote>
<!--kg-card-begin: html-->
<table style="border:none;border-collapse:collapse;"><colgroup><col width="147"><col width="167"><col width="160"><col width="127"/></col></col></col></colgroup><tbody><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#0b1521;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9pt;font-family:Arial,sans-serif;color:#ffffff;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Layer</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#0b1521;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9pt;font-family:Arial,sans-serif;color:#ffffff;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What it carries</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#0b1521;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9pt;font-family:Arial,sans-serif;color:#ffffff;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Where decoding happens</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#0b1521;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9pt;font-family:Arial,sans-serif;color:#ffffff;background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Cost driver</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Overview grid</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Sub-streams (D1/CIF)</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Client — one decode per tile</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Client decoder sessions</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Dense mosaic</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Many feeds composited into one grid stream</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Server composites; client decodes 1</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Server real-time encode</span></p></td></tr><tr style="height:0pt"><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Focus / spot</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Main-stream, full resolution</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Client — one high-res decode</span></p></td><td style="border-left:solid #000000 0.5pt;border-right:solid #000000 0.5pt;border-bottom:solid #000000 0.5pt;border-top:solid #000000 0.5pt;vertical-align:top;background-color:#f2f6fb;padding:3.5pt 5.5pt 3.5pt 5.5pt;overflow:hidden;overflow-wrap:break-word;"><p dir="ltr" style="line-height:1.2;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:9pt;font-family:Arial,sans-serif;color:#1a1a1a;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Keyframe latency on switch</span></p></td></tr></tbody></table>
<!--kg-card-end: html-->
<p/><h2 id="build-buy-or-deploy"><strong>Build, buy, or deploy</strong></h2><p>Getting one grid on screen is a weekend. Getting a 200-camera wall fluid across a dozen operators, 24/7, is an infrastructure decision — build, buy, or deploy.</p><p><strong>Build on open source. </strong>Media servers like go2rtc and MediaMTX already do the hard per-stream parts — RTSP ingest, H.264 passthrough, sub-stream handling, RTSP-to-WebRTC conversion for low-latency tiles. What they do not hand you is the wall: mosaic composition, the focus-switch logic, keyframe caching, per-tile recovery, and fan-out orchestration are yours to build and operate. Right when the wall is core to your product and you have the media engineers to run it.</p><p><strong>Use a managed cloud relay. </strong>Fastest to a working browser wall with no infrastructure to run — but your camera feeds route through a third party, you pay per stream as the wall grows, and mosaic or compose at their pricing gets expensive at density. Right when speed matters more than owning the path or the unit economics.</p><p><strong>Deploy a commercial platform. </strong>A full media stack — ingest, sub-stream selection, server-side mosaic, WebRTC fan-out, keyframe-aware switching — delivered as something you run on your own infrastructure or as a managed cloud deployment, under a flat license. Samvyo is one such option; it is based on SFU architecture and deploys on-premise or on your chosen cloud, which keeps the feeds inside infrastructure you control and the cost flat as the wall scales. Where it does not fit: a handful of cameras, or a wall a single workstation already decodes — a media server or a relay is more than enough, and a full platform is over-engineering.</p><blockquote><em>Three paths, one underlying question: who operates the decode budget — you, a vendor's cloud, or a stack you deploy.</em></blockquote><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>The video wall's bottleneck was never the pipe. Bandwidth is linear and cheap; the client's decoder is fixed and unforgiving, and the whole discipline of a live video wall architecture is spending that decode budget deliberately — sub-streams for the overview, a server-side mosaic when the tiles outrun the client, and the full-resolution main-stream only where an operator is actually looking. Name decode as the ceiling, and 500 cameras stops being a bandwidth question and becomes a budget you architect.</p><h2 id="whats-next"><strong>What's Next?</strong></h2><p><em>The wall assumes the stream already made it into a browser — but that handshake is its own problem. </em>The companion piece on RTSP-to-WebRTC walks why cameras can't talk to browsers directly, and the H.265 transcode trap that decides whether one camera or two hundred is affordable: <strong>link to </strong><a href="https://www.samvyo.com/live-video-in-surveillance-why-rtsp-cameras-still-cant-talk-to-web-browsers-in-2026?ref=samvyo.com" rel="noreferrer"><strong>RTSP-to-WebRTC blog</strong></a></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><h3 id="why-cant-a-workstation-show-50-live-camera-feeds-at-once"><strong>Why can't a workstation show 50 live camera feeds at once?</strong></h3><p>Because the limit is decode, not bandwidth. A GPU's hardware decoder exposes a fixed number of concurrent sessions; past it, playback falls back to CPU software decode or drops frames. The network can deliver 50 streams long before one machine can decode 50 — which is why walls run on low-resolution sub-streams and server-side mosaics instead of 50 full decodes.</p><h3 id="what-is-a-sub-stream-in-cctv"><strong>What is a sub-stream in CCTV?</strong></h3><p>Most IP cameras emit two streams at once: a full-resolution main-stream for recording, and a low-resolution sub-stream (often D1 or CIF) for live preview and thumbnails. A video wall should pull sub-streams for its tiles — a 300-pixel tile does not need a 4K decode — and reserve the main-stream for the one feed an operator zooms into.</p><h3 id="what-is-a-server-side-mosaic-and-when-should-i-use-it"><strong>What is a server-side mosaic, and when should I use it?</strong></h3><p>A mosaic composites many camera feeds into one grid stream on the server, so the client decodes a single video to see 16 or 25 cameras. Use it when the tile count would exceed the client's decoder budget even on sub-streams. The trade is a real-time encode cost on the server — shared across every operator viewing that grid — in exchange for client decode you do not have.</p><h3 id="how-do-you-show-a-camera-full-screen-instantly-when-an-operator-clicks-it"><strong>How do you show a camera full-screen instantly when an operator clicks it?</strong></h3><p>Cache the last keyframe per stream on the media server and replay from it on viewer join. Surveillance cameras send keyframes only every one to four seconds (long GOP), so a naïve switch to the full-resolution stream shows black until the next one arrives. A server-side keyframe cache lets decode start immediately, making the switch feel instant.</p><h3 id="webrtc-or-hls-for-a-video-wall"><strong>WebRTC or HLS for a video wall?</strong></h3><p>WebRTC for anything an operator watches and acts on live — sub-second latency for the focused feed and interactive tiles. HLS is acceptable for low-priority overview tiles or poor networks where a few seconds of delay is tolerable. Many walls mix both: WebRTC for focus, higher-latency playback for the long tail.</p><h3 id="can-a-platform-like-samvyo-handle-a-large-multi-camera-wall"><strong>Can a platform like Samvyo handle a large multi-camera wall?</strong></h3><p>That is the class of problem SFU-based, self-hosted infrastructure is built for: single-pull ingest, fan-out to many operators, and forwarding streams without re-decoding each one. Samvyo is based on SFU architecture and deploys on-premise or as a managed cloud deployment, so the feeds and the decode budget stay inside infrastructure you control, flat-licensed rather than per-stream. For a handful of cameras it is more than you need; for a dense wall at scale it is the tier that fits.</p>]]></content:encoded></item><item><title><![CDATA[Live Video in Surveillance: Why RTSP Cameras Still Can’t Talk to Web Browsers in 2026]]></title><description><![CDATA[Every IP camera speaks RTSP; no browser does. This piece walks the whole story — codecs, RTSP, the browser gap, and the RTSP-to-WebRTC bridge that finally gets live cameras into a tab — plus the H.265 transcode trap that separates a one-camera demo from a 200-camera deployment.]]></description><link>https://www.samvyo.com/blog/live-video-in-surveillance-why-rtsp-cameras-still-cant-talk-to-web-browsers-in-2026</link><guid isPermaLink="false">6a7176f78b45c3f0cd63a1ee</guid><category><![CDATA[VSaaS]]></category><category><![CDATA[video surveillance]]></category><category><![CDATA[rtsp to webrtc]]></category><category><![CDATA[live streaming]]></category><category><![CDATA[video streaming]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Tue, 04 Aug 2026 09:55:28 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/08/blog3.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/08/blog3.png" alt="Live Video in Surveillance: Why RTSP Cameras Still Can’t Talk to Web Browsers in 2026"/><p>Picture a modern surveillance deployment: two hundred cameras, a clean web dashboard, operators who want to pull up any feed from a laptop or a phone. Simple, in 2026 — except it isn’t. Getting a single live camera into a browser tab still tends to involve a plugin, a relay server, or a transcoding hack held together with tape. The reason is a language barrier that was never fixed: your cameras speak RTSP, and no browser on earth speaks it back. Closing that gap — the <strong>RTSP to WebRTC</strong> problem — is the last mile of web-based surveillance, and it’s worth understanding exactly how we got here.</p><h2 id="from-a-wire-in-the-wall-to-data-on-a-network"><strong>From a Wire in the Wall to Data on a Network</strong></h2><p>CCTV meant exactly what it says: closed-circuit television. A camera, a coax cable, a monitor in a back room. The picture was an analog signal on copper, and to see it you stood at the end of the wire. Add a recorder and you had a tape. Bulletproof — and completely chained to the building. The circuit was closed by design.</p><p>Then cameras grew a network port and became small computers. The picture stopped being a signal on a wire and became data on a network — in principle, viewable from anywhere. One problem stood in the way, and it still shapes everything: raw video is enormous. An uncompressed HD stream runs into gigabits per second. Nobody could store or ship that. The entire IP-video era depended on compression.</p><p>So the first thing worth understanding isn’t a protocol. It’s the squeeze.</p><h2 id="codecs-the-compression-that-made-ip-video-possible"><strong>Codecs: The Compression That Made IP Video Possible</strong></h2><p>A codec throws away what the eye won’t miss and sends mostly what changed between frames. H.264, standardised in 2003, is the one that made IP surveillance practical — it shrank video by orders of magnitude and got baked into camera chips everywhere, so encoding and decoding it is cheap and universal. It is still the common tongue of video.</p><p>H.265 (HEVC), from 2013, does the same job roughly twice as efficiently. Surveillance seized on it for two reasons that dominate this industry: 4K sensors and 24/7 recording. When you store hundreds of cameras around the clock, halving the bitrate halves the storage bill. H.265 was made for that trade. Keep it in mind — it comes back as the villain of this story.</p><p>Compression solved storage and transport. But a viewer still needs a way to say “play.” That’s where RTSP comes in.</p><h2 id="rtsp-the-remote-control-built-for-a-world-without-browsers"><strong>RTSP: The Remote Control Built for a World Without Browsers</strong></h2><p>RTSP — Real-Time Streaming Protocol, from 1998 — is essentially the remote control for a live stream: play, pause, teardown. The compressed video rides alongside it, over TCP or UDP. The detail that matters is who RTSP was built for: dedicated players and recorders — VLC, an NVR — machines on the same network, fluent in the camera’s language. It assumes a serious, persistent client. For that world it is excellent, and it became the universal standard: virtually every IP camera exposes an RTSP stream.</p><p>That produced the setup the industry has run on for two decades. Camera speaks RTSP and H.264. It feeds an NVR or a VMS — the dedicated recorder-and-management systems the surveillance world is built around — which stores everything and paints it onto a wall of monitors in a control room. A closed loop of machines that grew up together, all fluent in the same protocol. It just worked.</p><p>And then the people who watch the cameras stopped wanting to sit in the control room.</p><h2 id="the-browser-gap-why-the-web-was-never-invited"><strong>The Browser Gap: Why the Web Was Never Invited</strong></h2><p>Operators wanted feeds on a laptop, a phone, a dashboard — from anywhere, with nothing to install. And the web stack hit a wall, because the browser never learned to speak RTSP. Not by accident: browsers deliberately dismantled the plugin era — Flash, ActiveX, all of it — for security, and RTSP was never a web protocol to begin with. So the moment you drag surveillance out of the control room onto the open web, the camera is shouting in RTSP and the browser doesn’t understand a word.</p><p>For years the industry papered over this. Vendor-specific desktop apps. Browser plugins, until those died. Transcoding the whole feed to HLS — which works and plays anywhere, but lags five to ten seconds behind reality: fine for reviewing footage, useless when you’re watching a door right now. Relay servers. Every option was a workaround for the same missing handshake.</p><p>What finally changed isn’t a better workaround. It’s that the browser learned to speak live video on its own.</p><h2 id="rtsp-to-webrtc-closing-the-gap"><strong>RTSP to WebRTC: Closing the Gap</strong></h2><p>WebRTC is the browser’s native real-time video engine — the same technology behind every video call you take. It ships in every major browser, needs no plugin, and is built for sub-second latency. For the first time, the web can carry genuinely live video by itself.</p><p>So the fix is a translator in the middle: a media server that pulls the camera’s RTSP stream and re-wraps it as WebRTC the browser can play. When it works cleanly, the result is a camera live in a browser tab in well under a second, from any device, with nothing installed. That is the shift — surveillance walking out of the locked control room onto the open web.</p><p>But “when it works cleanly” is carrying a lot of weight in that sentence. Because the codec you chose to save on storage is about to send you a bill.</p><h2 id="the-codec-trap-where-the-real-cost-hides"><strong>The Codec Trap: Where the Real Cost Hides</strong></h2><p>Here is the catch that separates a demo from a deployment. Camera chips only ever encode H.264 or H.265 — never the codecs the web grew up on, like VP8, VP9, or AV1. And <a href="https://samvyo.com/blog/h-264-vs-h-265-over-webrtc-why-the-storage-codec-breaks-the-live-path?ref=samvyo.com">browser support for H.265 over WebRTC</a> is uneven: H.264 is universal, but H.265 is accepted only by some browsers, on some hardware — Chrome and Safari have added it recently, Firefox hasn’t, and it depends on the device underneath. That splits every stream into two very different paths.</p><p><strong>If the camera sends H.264, </strong>the translator can pass it through untouched — no re-encoding. Latency stays in the low hundreds of milliseconds, and the CPU cost is trivial. This is the clean case.</p><p><strong>If the camera sends H.265 </strong>— which the modern 4K cameras you bought to save storage almost certainly do — the translator has to transcode it to H.264 for the browser to accept it. Transcoding means fully decoding and re-encoding every frame of every stream. On one camera, unnoticeable. On two hundred cameras, it is a server farm — real CPU, real money, and added latency on every feed.</p><p>That is the whole game. The codec that halved your storage bill can quietly multiply your live-streaming bill. An architecture that ignores this looks fine in a one-camera demo and falls over at deployment scale.</p><p>Which means a clean design isn’t about getting one camera on screen. It’s about getting all of them there without a transcode bill that eats the product.</p><h2 id="what-a-clean-rtsp-to-webrtc-architecture-looks-like"><strong>What a Clean RTSP-to-WebRTC Architecture Looks Like</strong></h2><p>Five principles separate a real pipeline from a duct-taped one.</p><p><strong>Pass through by default. </strong>If a camera speaks H.264, never re-encode it. Passthrough is cheap and near-instant; transcoding is the expensive exception, not the default.</p><p><strong>Transcode only when forced, and budget for it. </strong>H.265 streams that must reach non-supporting browsers get transcoded — but treat that as a known cost per stream, not a hidden surprise, and push cameras to a browser-friendly profile where you can.</p><p><strong>Separate the live path from the recording path. </strong>Store the original high-efficiency H.265 for archive and storage savings; transcode only the live view a human is actually watching. You rarely need every camera transcoded at once — only the ones on screen.</p><p><strong>Fan out, don’t duplicate. </strong>One pull from the camera, forwarded to many viewers, so ten operators watching one feed don't mean ten pulls on the camera — though <a href="https://samvyo.com/blog/why-your-sfu-bandwidth-cost-scales-with-viewers-not-publishers?ref=samvyo.com">the forwarding side's bandwidth bill still scales with viewers, not cameras</a>.</p><p><strong>Offer HLS as the fallback, not the default. </strong>For a mobile viewer on a bad network, or a wall of dozens of low-priority feeds, higher-latency HLS is a reasonable trade. Keep WebRTC for the live, interactive views.</p><p>Open-source media servers like go2rtc and MediaMTX implement much of this — H.264 passthrough, RTSP-to-WebRTC conversion, HLS output, and automatic transcoding when a codec won’t cross. They’re the fastest way to see the architecture working.</p><p>Getting one camera live is a weekend project. Getting a whole site live, 24/7, at a cost that doesn’t sink the product, is an infrastructure decision — which comes down to build, buy, or deploy.</p><h2 id="build-buy-or-deploy"><strong>Build, Buy, or Deploy</strong></h2><p><strong>Build on open source. </strong>go2rtc or MediaMTX, run and scaled by you. Maximum control, and you own the transcode economics directly. Right when live video is core to your product and you have the team to operate a media pipeline.</p><p><strong>Use a managed cloud relay. </strong>Fastest to a working browser view, no infrastructure to run — but your camera feeds route through a third party, and you pay per stream as you grow. Right when speed matters more than owning the path.</p><p><strong>Deploy a commercial platform. </strong>A full media stack — RTSP ingest, passthrough, transcode, WebRTC fan-out, recording — delivered as something you run on your own infrastructure or as a managed cloud deployment, under a flat license. Samvyo is one such option; it’s SFU-based and deploys on-premise or on your chosen cloud. Right when the media path has to live inside your own product and infrastructure. Where it doesn’t fit: a handful of cameras or a hobby project — open source or a relay is more than enough.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>The gap between an RTSP camera and a web browser is permanent — the browser is never going to speak the camera’s language. What changed is that WebRTC finally lets the browser speak live video, so the whole problem reduces to a good translator in the middle. And a good translator has one defining trait: it passes H.264 through untouched and transcodes only when the codec forces it, because that single decision is what separates a system that works on one camera from one that works on two hundred. Name the codec reality, and the architecture writes itself.</p><h2 id="what%E2%80%99s-next"><strong>What’s Next?</strong></h2><p><strong><em>Same live-video problem, different world? </em></strong>Solving this for moving vehicles instead of fixed cameras — dashcams, cellular uplinks, and a command centre — is a related but distinct architecture. The companion piece on fleet video streaming walks that version, packet by packet: <a href="https://www.samvyo.com/how-fleet-video-streaming-actually-works-the-architecture-between-vehicle-and-command-centre?ref=samvyo.com" rel="noreferrer">How Fleet Video Streaming Actually Works — The Architecture Between Vehicle and Command Centre</a>.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><h3 id="can-a-web-browser-play-an-rtsp-stream-directly"><strong>Can a web browser play an RTSP stream directly?</strong></h3><p>No. Browsers don’t implement RTSP and never will — it was built for dedicated players, not the web. You need a media server to convert RTSP to WebRTC (for live, low-latency viewing) or to HLS (for higher-latency, universal playback) before it reaches the browser.</p><h3 id="what%E2%80%99s-the-lowest-latency-way-to-view-an-ip-camera-in-a-browser"><strong>What’s the lowest-latency way to view an IP camera in a browser?</strong></h3><p>RTSP to WebRTC with H.264 passthrough. When the camera already sends H.264, no re-encoding is needed and latency stays in the low hundreds of milliseconds — effectively real time.</p><h3 id="does-webrtc-support-h265hevc"><strong>Does WebRTC support H.265/HEVC?</strong></h3><p>Only partially. H.264 is universally supported over WebRTC; H.265 is accepted by some browsers on capable hardware (recent Chrome and Safari) but not others (Firefox). For reliable cross-browser live view, H.265 camera streams usually have to be transcoded to H.264.</p><h3 id="why-is-transcoding-a-problem-at-scale"><strong>Why is transcoding a problem at scale?</strong></h3><p>Transcoding fully decodes and re-encodes every frame of every stream, which is CPU-intensive. One camera is nothing; hundreds of simultaneous transcodes become a serious server cost — the hidden expense in browser-based surveillance, and the reason passthrough matters.</p><h3 id="go2rtc-vs-mediamtx-%E2%80%94-which-should-i-use"><strong>go2rtc vs MediaMTX — which should I use?</strong></h3><p>Both are open-source media servers that convert RTSP to WebRTC with H.264 passthrough and low latency. go2rtc is lightweight and popular in camera and home-automation setups; MediaMTX supports more protocols (RTSP, RTMP, HLS, SRT, WebRTC) on a single stream. Either is a solid starting point.</p><h3 id="webrtc-or-hls-for-live-surveillance"><strong>WebRTC or HLS for live surveillance?</strong></h3><p>WebRTC for anything a human watches live and acts on — sub-second latency. HLS only when a multi-second delay is acceptable in exchange for simpler, universal playback, such as low-priority feeds or poor mobile networks.</p>]]></content:encoded></item><item><title><![CDATA[Build, Buy, or Embed: The Technical Decision Guide for Video Infrastructure]]></title><description><![CDATA[Every real-time video product runs the same six components — build, buy, and embed only change who operates each. This technical guide walks the stack, maps each path to the layers you own versus inherit, and covers the portability question that decides how hard it is to leave.]]></description><link>https://www.samvyo.com/blog/build-buy-or-embed-the-technical-decision-guide-for-video-infrastructure</link><guid isPermaLink="false">6a7170218b45c3f0cd63a1c9</guid><category><![CDATA[Open-Source Video Infrastructure]]></category><category><![CDATA[build, buy or embed]]></category><category><![CDATA[decision guide]]></category><category><![CDATA[enterprise video solutions]]></category><category><![CDATA[On-prem Video Conferencing]]></category><category><![CDATA[Proprietary video SDKs]]></category><category><![CDATA[real-time communication SDKs]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Tue, 04 Aug 2026 09:54:59 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/08/blog5Technical.png" medium="image"/><content:encoded><![CDATA[<blockquote>If you arrived here from the <a href="https://www.samvyo.com/white-label-video-infrastructure-build-buy-or-embed-a-decision-guide?ref=samvyo.com" rel="noreferrer"><strong>business version</strong></a>, you're in the right place. That piece mapped the three paths — build, buy, embed — and how to tell which one your product needs. This is the companion "how": what each path actually is at the architecture level, for the engineer who has to build or evaluate it. No re-run of the business case — we go straight to the wiring.</blockquote><img src="https://www.samvyo.com/blog-admin1/content/images/2026/08/blog5Technical.png" alt="Build, Buy, or Embed: The Technical Decision Guide for Video Infrastructure"/><p>Every real-time video product, whoever built it, runs the same handful of components. Build, buy, or embed does not change that architecture — it changes who operates each layer. Understanding the layers is how you predict where each path breaks before you commit to it.</p><p>This is the technical companion to the business decision guide. Where that piece weighed speed, economics, and control, this one goes under them: the stack every path has to cover, what you assemble or inherit on each, and the coupling that decides how hard it is to leave. Start with the components themselves.</p><h2 id="the-stack-every-path-has-to-cover"><strong>The stack every path has to cover</strong></h2><p>Real-time video is not one system; it is six, and every path has to account for each one:</p><ul><li><strong>Signaling</strong> — session setup, SDP negotiation, and presence, usually over WebSocket.</li><li><a href="https://samvyo.com/blog/what-is-an-sfu-and-why-does-every-video-platform-use-one?ref=samvyo.com"><strong>SFU / media server</strong></a> — the core that routes RTP between participants without re-encoding (mediasoup, LiveKit, Janus, ion-sfu).</li><li><strong>STUN / TURN</strong> — NAT traversal, with TURN relaying media when peer-to-peer fails (coturn); bandwidth-heavy at scale.</li><li><strong>Recording</strong> — composited or raw capture, with its own concurrency and storage profile.</li><li><strong>Scaling and orchestration</strong> — load balancing, SFU cascading across instances and regions, autoscaling, health checks.</li><li><strong>Client SDKs</strong> — the app-facing layer across web, iOS, and Android.</li></ul><p>Build, buy, and embed are three answers to one question: who operates each of these rows? Start with the path where you operate all of them.</p><h2 id="build-from-open-source"><strong>Build from open source</strong></h2><p>Building means you assemble the stack: an SFU like mediasoup or LiveKit at the core, a signaling service you write, coturn for TURN, a recording pipeline, an orchestration layer for scaling, and client SDKs (some open-source SFUs ship their own).</p><p>The components are available and well-documented, which makes the demo deceptively quick. The hard part is everything between demo and production. <strong>&nbsp;</strong>TURN is bandwidth-heavy and must be geo-distributed, so <a href="https://samvyo.com/blog/the-turn-bill-the-self-hosted-video-cost-nobody-forecasts?ref=samvyo.com">its cost and placement become their own problem</a>. A single SFU caps at a finite participant count, so real concurrency needs <a href="https://samvyo.com/blog/sfu-scaling-clustering-cascading-and-where-the-bottleneck-moves?ref=samvyo.com">cascading and load-balancing across instances and regions</a> — and the bottleneck moves as you do it. Global p95 latency demands edge presence you have to build and operate. And every codec update, security patch, and scaling incident is yours. The last 20% — hardening, scaling, reliability — is 80% of the work, which is precisely the work a cloud API exists to absorb.</p><h2 id="buy-a-cloud-video-api"><strong>Buy a cloud video API</strong></h2><p>Buying means you integrate a vendor’s client SDK and a token service on your backend; they run the SFU, TURN, scaling, and edge. You get event webhooks and a bounded set of server-side controls.</p><p>Architecturally, the appeal is that five of the six layers become someone else’s operational problem. The constraints are the flip side of that convenience. Media transits the vendor’s infrastructure, so residency is theirs to define, not yours. Customization stops at their API surface — you get what they expose. You pay per participant-minute plus egress, metered forever. And your client and signaling couple to their SDK, which makes leaving expensive. That coupling is the real lock-in: Twilio announced end-of-life for Programmable Video and reversed it in October 2024, and Dyte was acquired by Cloudflare in April 2025 and folded into a <a href="https://samvyo.com/blog/what-happens-when-your-video-api-provider-gets-acquired-or-shuts-down?ref=samvyo.com">new platform</a> — in both cases the vendor’s roadmap became a live dependency in the customer’s. Owning the deployment removes those constraints, at the cost of operating what you deploy.</p><h2 id="embed-white-label-infrastructure"><strong>Embed white-label infrastructure</strong></h2><p>Embedding means you deploy a complete platform — SFU, signaling, TURN, recording, and SDKs — as one unit that runs in your environment rather than a vendor’s. This is the category Samvyo occupies.</p><p>Based on SFU architecture, it delivers the media plane, signaling, and client SDKs as an integrated, white-label system, with an on-premise deployment option that places the entire media path inside infrastructure you control. Architecturally, that is what distinguishes it from the cloud path: residency is resolved at the deployment level — the media never leaves your environment — rather than requested as a configuration from a third party, and the economics are a flat licence instead of a per-participant meter. You own the six layers without assembling them.</p><p>The honest cost is integration weight. Deploying and operating a full platform is heavier than dropping in a cloud SDK, even though you are not building the stack from scratch. For a single-product team at low volume with no white-label or residency requirement, that is more operational surface than a cloud API asks for, and the cloud API is the better technical choice. Embedding pays off when you need OEM white-labeling, flat economics at scale, or sovereignty over the media path — requirements that the buy path structurally cannot meet. Which path fits comes down to one more variable that cuts across all three.</p><h2 id="the-portability-question"><strong>The portability question</strong></h2><p>Underneath the decision is a single technical variable: how tightly is your application coupled to the path you chose? A cloud SDK binds your client and signaling to one vendor, so migrating means rewriting the integration end to end. Building or embedding on standard WebRTC keeps that coupling under your control. The cheapest insurance, on any path, is to abstract the video layer behind your own interface, so the provider sits behind a boundary you own — the design decision that turns the CPaaS roadmap risk above from a rewrite into a swap.</p><h2 id="matching-architecture-to-requirement"><strong>Matching architecture to requirement</strong></h2><p>The requirements map to paths with little ambiguity once the stack is in view:</p><ul><li><strong>Sub-second latency, high concurrency, video is the core product, media engineers in-house</strong> → build. Operating all six layers is justified when video <em>is</em> the product.</li><li><strong>Fast integration, standard use case, moderate scale, no residency constraint</strong> → buy. Let the vendor run five layers; revisit at scale.</li><li><strong>White-label / OEM, flat economics at volume, or media that must stay in your jurisdiction</strong> → embed. It is the only path delivering an owned, deployable stack without a build.</li></ul><p>The architecture is identical across all three — the same six components move the same RTP. What differs is which layers you operate, and therefore which constraints you inherit. Choose by the constraint you cannot move.</p><hr><p><em>For the cost, speed, and ROI framing of this decision, see the business companion: </em><a href="https://www.samvyo.com/white-label-video-infrastructure-build-buy-or-embed-a-decision-guide?ref=samvyo.com" rel="noreferrer"><strong><em>link to the business version</em></strong></a><em>.</em></p><hr><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><h3 id="what-components-make-up-video-infrastructure"><strong>What components make up video infrastructure?</strong></h3><p>Six: signaling (session setup over WebSocket), an SFU or media server (routing RTP between participants), STUN/TURN (NAT traversal and media relay), recording, scaling and orchestration (SFU cascading, load balancing, autoscaling), and client SDKs. Build, buy, and embed differ only in who operates each. Self-hosted platforms based on SFU architecture, such as Samvyo, deliver all six as one deployable unit.</p><h3 id="what-is-the-hardest-part-of-building-webrtc-infrastructure"><strong>What is the hardest part of building WebRTC infrastructure?</strong></h3><p>Not the demo — the production hardening. The difficult layers are TURN (bandwidth-heavy, must be geo-distributed) and SFU scaling (a single instance caps out, so real concurrency needs cascading and load-balancing across regions), plus global latency and continuous maintenance. This is the roughly 20% of the problem that consumes 80% of the effort, and why many teams buy or embed instead.</p><h3 id="does-a-cloud-video-api-lock-me-in"><strong>Does a cloud video API lock me in?</strong></h3><p>To a degree, yes — your client and signaling couple to the vendor’s SDK, so migrating means rewriting the integration. The vendor’s roadmap also becomes your dependency, as Twilio’s end-of-life reversal and Dyte’s acquisition both showed. The mitigation is to abstract the video layer behind your own interface so a provider can be swapped rather than rebuilt around.</p><h3 id="how-does-self-hosting-solve-data-residency"><strong>How does self-hosting solve data residency?</strong></h3><p>Residency is decided by where the media path physically runs. A self-hosted deployment places the SFU, signaling, and recording inside infrastructure you control, so media never crosses into a third party’s environment or another jurisdiction. Samvyo, based on SFU architecture, offers on-premise deployment for exactly this reason — common in BFSI, government, and healthcare, where residency is mandated rather than preferred.</p><h3 id="build-versus-embed-%E2%80%94-what-is-the-real-technical-difference"><strong>Build versus embed — what is the real technical difference?</strong></h3><p>Building means you assemble and maintain all six layers yourself from open-source parts — maximum control, maximum ongoing effort. Embedding means you deploy and operate a pre-integrated platform that already includes those layers — you own the stack and its residency without engineering it. Both can be self-hosted; the difference is whether you are constructing the system or running one that is already built.</p></hr></hr>]]></content:encoded></item><item><title><![CDATA[White-Label Video Infrastructure: Build, Buy, or Embed — A Decision Guide]]></title><description><![CDATA[The cheapest way to launch video is often the most expensive way to run it. This guide compares building on open source, buying a cloud API, and embedding white-label infrastructure across speed, unit economics, control, and OEM rights — so you pick the path you won’t have to rip out.]]></description><link>https://www.samvyo.com/blog/white-label-video-infrastructure-build-buy-or-embed-a-decision-guide</link><guid isPermaLink="false">6a716e578b45c3f0cd63a1c3</guid><category><![CDATA[cost-benefit analysis]]></category><category><![CDATA[build vs buy RTC]]></category><category><![CDATA[enterprise video solutions]]></category><category><![CDATA[Proprietary video SDKs]]></category><category><![CDATA[video SDK architecture]]></category><category><![CDATA[decision guide]]></category><category><![CDATA[build, buy or embed]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Tue, 04 Aug 2026 09:54:52 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/08/blog5BUsiness.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/08/blog5BUsiness.png" alt="White-Label Video Infrastructure: Build, Buy, or Embed — A Decision Guide"/><p>The cheapest way to launch real-time video is often the most expensive way to run it — and the choice you make at prototype stage is the hardest one to reverse.</p><p>Once you’ve decided your product needs live video, the real fork is not which vendor to pick. It is whether to build the infrastructure yourself, buy a cloud API by the minute, or embed a white-label platform you license. The three look like price tiers; they are not. They optimize for entirely different things, and picking the wrong one means either overpaying for years or ripping out your foundation the moment you scale. Start with what the decision actually turns on.</p><h2 id="what-you%E2%80%99re-actually-optimizing-for"><strong>What you’re actually optimizing for</strong></h2><p>Before comparing paths, name the levers — because no path wins all four, and which ones matter is what decides the choice:</p><ul><li><strong>Speed to market</strong> — how fast you get a working video feature in front of users.</li><li><strong>Unit economics at scale</strong> — what each session costs once you have real volume, not just a demo.</li><li><strong>Control</strong> — ownership of your data, where it lives, and how far you can customize.</li><li><strong>White-label and OEM rights</strong> — whether you can put your own brand on it and resell it as part of your product.</li></ul><p>A team validating an idea next month weights speed above everything. A team reselling video to enterprise clients weights white-label and economics. Score each of the three paths against these four, and the right answer stops being a matter of opinion. Take them in order of how quickly they get you live: buy is fastest, so start at the other end to see what you’re trading away.</p><h2 id="build-from-open-source"><strong>Build from open source</strong></h2><p>Building means assembling your own stack on open-source components — a media server like mediasoup or LiveKit, signaling, TURN servers, recording, scaling — and running it as your own infrastructure.</p><p>What you get is total control and no per-minute meter: you own the data, decide where it runs, customize anything, and your cost is infrastructure plus engineering rather than a bill that grows with every minute streamed. For a product where video is the core and volume is high, that ownership is decisive.</p><p>What it costs is the part most teams underestimate. Real-time media is a specialized discipline — the engineers who can build and operate a production SFU are scarce and expensive, the path to a hardened, globally reliable deployment is measured in months not weeks, and the maintenance never stops: codec updates, edge cases, scaling incidents, 24/7 reliability. Build is right when video is central to your product, you have or can hire genuine infra depth, and volume is high enough that owning the stack beats renting it. It is the wrong first move for a team without that depth or runway, which is exactly the gap the next path fills.</p><h2 id="buy-a-cloud-video-api"><strong>Buy a cloud video API</strong></h2><p>Buying means calling a CPaaS provider’s API — Agora, Daily, Vonage, LiveKit Cloud — and letting them run the infrastructure while you pay per participant-minute.</p><p>What you get is the fastest route to a working product: a few days of integration, managed global scaling, and no infrastructure to operate. For validating an idea or serving moderate volume, nothing beats it — you ship video this week instead of next quarter.</p><p>What it costs shows up at scale. HD video runs around <a href="https://samvyo.com/blog/per-minute-video-pricing-at-scale-what-enterprise-teams-actually-pay?ref=samvyo.com">$0.004 per participant-minute</a> (the field spans roughly $0.0004 to $0.0041). A four-person, thirty-minute call is 120 participant-minutes — about $0.48. Trivial once; at 10,000 such calls a month it is 1.2 million participant-minutes and roughly $4,800 monthly, climbing linearly with every user you add.</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    border: 1px solid rgba(128, 128, 128, 0.4);
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 10px 16px;
    color: inherit;
    background: transparent;
    vertical-align: top;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18);
    font-weight: 400;
  }
</style>
<table class="rate-table">
  <colgroup><col width="264"><col width="264"/></col></colgroup>
  <thead>
    <tr>
      <th>Cost driver</th>
      <th>Figure</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Rate — HD video</td>
      <td>~$0.004 per participant-minute</td>
    </tr>
    <tr>
      <td>One 4-person, 30-min call</td>
      <td>120 participant-minutes (~$0.48)</td>
    </tr>
    <tr>
      <td>Scenario</td>
      <td>10,000 such calls / month</td>
    </tr>
    <tr>
      <td>Participant-minutes / month</td>
      <td>~1.2 million</td>
    </tr>
    <tr>
      <td>Base monthly cost</td>
      <td>~$4,800 and climbing</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p>The meter never stops, and the economics that felt free at demo scale become your largest variable cost. There is a second cost that is not on the price sheet: dependency. Twilio <a href="https://samvyo.com/blog/what-happens-when-your-video-api-provider-gets-acquired-or-shuts-down?ref=samvyo.com">announced</a> end-of-life for its Video API, then reversed the decision in October 2024 — a year of customer scramble over a product that survived. Dyte, a capable CPaaS vendor, was <a href="https://samvyo.com/blog/what-happens-when-your-video-api-provider-gets-acquired-or-shuts-down?ref=samvyo.com">acquired</a> by Cloudflare in April 2025 and folded into a new platform. Neither was a bad product; both taught their customers that portability has real option value. Buy is right for speed and moderate volume; it strains when unit economics compound, when you need white-label rights the vendor won’t grant, or when data residency is non-negotiable — which is where the third path exists.</p><h2 id="embed-white-label-infrastructure"><strong>Embed white-label infrastructure</strong></h2><p>Embedding means licensing a complete video platform you deploy as your own — your brand, your product, your environment — under a flat licence rather than a per-minute meter. This is the category Samvyo occupies.</p><p>What you get is the ownership of build with far less of the effort: OEM-ready white-labeling so you can resell it as your own, flat economics that don’t scale with usage, control over your data, and — where the model supports on-premise deployment — infrastructure that runs inside your own environment, which answers data-residency and sovereignty requirements outright. For a company embedding video into a product it sells, or operating under compliance pressure, that combination is hard to assemble any other way.</p><p>What it costs is a heavier integration than a cloud API’s few days, and a licence that only pays off above a certain scale. It is genuinely over-engineering for a single-product team at low volume with no white-label or sovereignty need — there, a cloud API is simpler and cheaper, and you should use one. Embedding earns its keep specifically when you are reselling or OEM-ing video, when flat economics beat a meter at your volume, or when residency and control are requirements rather than preferences. Which of the three fits you is usually clear once you match your situation to the pattern.</p><h2 id="the-decision-in-practice"><strong>The decision in practice</strong></h2><p>The paths map cleanly to situations:</p><ul><li><strong>Validating an idea, or moderate volume, video not your core</strong> → buy a cloud API. Speed wins; revisit when the meter hurts.</li><li><strong>Video is your core product, high volume, real infra depth in-house</strong> → build. Ownership beats renting once you’re operating at scale.</li><li><strong>Reselling or embedding video under your own brand, or bound by residency and sovereignty rules</strong> → embed white-label infrastructure. It’s the only path that delivers OEM rights, flat economics, and data control together.</li></ul><p>Most teams start by buying to validate, then hit one of two walls: the per-minute bill at scale, or a white-label or compliance requirement the vendor can’t meet. The value of naming the fork early is that you architect for the wall you can already see coming, instead of rebuilding your foundation under it.</p><hr><p><em>For the architecture behind each path — media servers, signaling, scaling, and what integration actually involves — see the technical companion: </em><a href="https://www.samvyo.com/build-buy-or-embed-the-technical-decision-guide-for-video-infrastructure?ref=samvyo.com" rel="noreferrer"><strong><em>link to technical version.</em></strong></a></p><hr><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><h3 id="is-it-cheaper-to-build-video-infrastructure-than-to-buy-an-api"><strong>Is it cheaper to build video infrastructure than to buy an API?</strong></h3><p>It depends entirely on volume. Buying is cheaper until you scale, because you pay only for what you use with no upfront engineering. Building is cheaper at high, sustained volume, because a flat infrastructure-plus-engineering cost eventually beats a per-minute meter that grows forever — but only if you have the specialized talent to build and operate it. Embedding a flat-licensed white-label platform like Samvyo is a third option that gives build-like economics without the build effort.</p><h3 id="what-is-white-label-video-infrastructure"><strong>What is white-label video infrastructure?</strong></h3><p>It is a complete video platform you license and deploy as your own product — your brand, your UI, often your environment — rather than exposing an underlying vendor. It suits companies that resell or embed video (OEM), because it lets them own the customer experience and economics. Samvyo is built for this model, with white-label and OEM capability and an on-premise deployment option.</p><h3 id="per-minute-pricing-versus-flat-licensing-%E2%80%94-which-is-better"><strong>Per-minute pricing versus flat licensing — which is better?</strong></h3><p>Per-minute is better at low and uncertain volume: you pay nothing until you use it. Flat licensing is better at high, predictable volume, where a metered bill would compound into your largest cost. The crossover depends on your usage — model your real participant-minutes before deciding, since per-minute economics that look negligible in a demo scale linearly with every user.</p><h3 id="can-i-self-host-video-infrastructure"><strong>Can I self-host video infrastructure?</strong></h3><p>Yes — either by building on open source (LiveKit, mediasoup) and operating it yourself, or by licensing a self-hostable platform you deploy in your own environment. Self-hosting is the standard answer when data residency or sovereignty is mandated, because the media never leaves infrastructure you control. Samvyo supports on-premise deployment specifically for BFSI, government, and healthcare buyers with these requirements.</p><h3 id="how-long-does-it-take-to-add-video-to-a-product"><strong>How long does it take to add video to a product?</strong></h3><p>Buying a cloud API is fastest — days to a working prototype. Embedding a white-label platform is longer, since you integrate and deploy a full system, but far shorter than building. Building from open source is the longest by far, typically months to a production-hardened deployment, plus continuous maintenance. Match the path to how much time and control you actually need.</p></hr></hr>]]></content:encoded></item><item><title><![CDATA[Video Recording Architecture: What Runs Behind the Pipeline at Scale]]></title><description><![CDATA[An SFU forwards video without decoding it; a recorder can’t. This deep dive walks the recording pipeline — composited vs raw RTP capture, scaling the recorder tier, storage tiering and egress, and how tamper-evidence, WORM, and residency get built into the pipeline rather than bolted on.]]></description><link>https://www.samvyo.com/blog/video-recording-architecture-what-runs-behind-the-pipeline-at-scale</link><guid isPermaLink="false">6a716e0b8b45c3f0cd63a1bd</guid><category><![CDATA[video recording architecture]]></category><category><![CDATA[recording]]></category><category><![CDATA[data residency]]></category><category><![CDATA[video compliance]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Tue, 04 Aug 2026 09:54:41 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/08/blog4Technical.png" medium="image"/><content:encoded><![CDATA[<blockquote>If you arrived here from the <a href="https://www.samvyo.com/video-recording-at-scale-architecture-storage-and-the-compliance-trap?ref=samvyo.com" rel="noreferrer"><strong>business version</strong></a>, you're in the right place. That piece mapped the three failure modes — concurrency, storage economics, and compliance — and what recording at scale costs a business. This is the companion "how": what each of those looks like at the architecture level, for the engineer who has to build or evaluate the pipeline. No re-run of the cost case — we go straight to the wiring.</blockquote><img src="https://www.samvyo.com/blog-admin1/content/images/2026/08/blog4Technical.png" alt="Video Recording Architecture: What Runs Behind the Pipeline at Scale"/><p>An SFU forwards a stream to a hundred viewers without ever decoding it. A recorder cannot. That single asymmetry makes recording the most expensive workload in your video stack — and the architecture you pick for it sets your ceiling on concurrency, your storage bill, and whether the footage survives a regulator’s scrutiny.</p><p>This is the technical companion to the business overview. We go under the pipeline: the three recording architectures, how the recorder tier scales, how footage moves to and from storage, and how compliance is built into the pipeline rather than bolted on — using real API surfaces, because the trade-offs only surface at that level. Start with why recording is a different kind of work.</p><h2 id="why-recording-is-a-different-workload-than-forwarding"><strong>Why recording is a different workload than forwarding</strong></h2><p>A <a href="https://samvyo.com/blog/what-is-an-sfu-and-why-does-every-video-platform-use-one?ref=samvyo.com">Selective Forwarding Unit</a> is cheap because it never touches the media: it receives RTP from a producer and forwards it unmodified to each consumer — no decode, no composition, no re-encode. Adding a viewer costs bandwidth and almost no CPU.</p><p>Recording breaks that the moment you want one playable file of a multi-party session. A composed output means decoding each stream, laying them into a frame, and encoding the result — in real time, for the session’s duration. Real-time encode is recording’s cost floor, and unlike forwarding it does not amortize across sessions; every concurrent recording is its own decode-compose-encode pipeline. That is the fork, and it splits into three architectures.</p><h2 id="three-recording-architectures"><strong>Three recording architectures</strong></h2><p>Three ways to capture a session, differing in one thing that matters: how much media processing happens, and where.</p><h3 id="composited-recording-%E2%80%94-the-headless-client-model"><strong>Composited recording — the headless-client model</strong></h3><p>This is Jibri. An instance launches a headless Chrome, driven by Selenium, that joins as an ordinary participant, renders the layout a human would see, and encodes that window to one file. The output is excellent — clean, laid out, ready to play. The cost is structural: each recorder is a full browser doing real-time decode, layout, and encode of the whole session, and Jibri is single-use — one session per instance before recycling. Recording N sessions means roughly N instances: a browser-running fleet scaled and paid for apart from your media plane. The lighter path captures earlier in the stack.</p><h3 id="server-side-track-recording-%E2%80%94-raw-rtp-capture"><strong>Server-side track recording — raw RTP capture</strong></h3><p>Capture the media as raw RTP at the SFU, before anything renders it. In mediasoup: create a plain transport with router.createPlainTransport({ comedia: false, rtcpMux: false }), consume(producerId) each producer, and point the RTP at FFmpeg or GStreamer to write to disk. The defining property is that the media is never re-encoded — packets are stored essentially as-is, which is why this is far lighter than compositing. The trade: you get per-track, per-participant files, not a composed session, so composition becomes an offline job on your schedule, or is skipped if per-track playback is fine. There are edges — FFmpeg has no RTCP-mux, so you run explicit RTCP ports, and codecs pair to containers (VP8 to WebM, H.264 to MP4) — but one worker captures many concurrent sessions, because none pay the encode tax. The third option pushes capture all the way to the edge.</p><h3 id="client-side-recording"><strong>Client-side recording</strong></h3><p>Recording in the participant’s browser via MediaRecorder yields a Blob that uploads after the session, removing the server-side recorder — and every guarantee with it. It depends on the user’s device, CPU, and network, so a dropped connection or closed tab loses the footage. Fine for ephemeral use; unusable for anything you must prove happened, where you cannot anchor compliance to whether a device finished uploading. For regulated work the choice is between the two server-side models — and that choice is really about how you scale.</p><h2 id="scaling-the-recorder-tier"><strong>Scaling the recorder tier</strong></h2><p>Server-side recording is its own tier with its own scaling, and it does not scale like the media plane.</p><h3 id="the-single-use-lifecycle-and-the-recorder-pool"><strong>The single-use lifecycle and the recorder pool</strong></h3><p>Composited recording forces a pool: each recorder handles one session then recycles, so you keep a warm pool sized to peak concurrency, with a dispatcher assigning idle recorders. Pool exhaustion is a hard failure — no idle recorder, no recording, exactly when demand spiked. Sizing, warming, and recycling the pool is the operational core. Raw capture changes the shape.</p><h3 id="autoscaling-recording-independently-of-media"><strong>Autoscaling recording independently of media</strong></h3><p>The recorder tier must autoscale on concurrent-recording demand, not call volume — the two diverge. Raw capture softens this: capture is cheap and encode is deferred, so a worker absorbs far more concurrent sessions before you add capacity, and composition runs as a batch queue you scale on backlog rather than in real time. You trade real-time provisioning for schedulable offline compute. Either way, encode is where the cost concentrates.</p><h3 id="encode-as-the-bottleneck"><strong>Encode as the bottleneck</strong></h3><p>For compositing, real-time H.264/VP8 encode of a composed frame is CPU-heavy, and GPU/NVENC acceleration is what separates a recorder holding a handful of sessions from one holding many. For raw capture there is no live encode, so the bottleneck shifts downstream — disk-write throughput during capture, batch encode during composition. Once capture is solved, the footage has to land somewhere durable.</p><h2 id="the-storage-pipeline"><strong>The storage pipeline</strong></h2><p>A recording is done when it is durably stored, correctly tiered, and retrievable — three decisions, each with a cost.</p><h3 id="recorder-to-object-store"><strong>Recorder to object store</strong></h3><p>The write path moves the file from local disk to object storage, usually via multipart upload so large files upload in parallel and resume on failure. Upload in segments during the recording or once on completion — segmenting shrinks the blast radius of a recorder crash but multiplies requests and complicates assembly. It is also the natural seam to compute an integrity hash, before the bytes leave your control.</p><h3 id="lifecycle-tiering"><strong>Lifecycle tiering</strong></h3><p>Access is front-loaded — heavy in the days after capture, then almost never — and lifecycle rules automate the transitions: hot (S3 Standard, about $0.023/GB-month) for recent footage, an infrequent-access tier after weeks, cold archive (Glacier Deep Archive, about $0.00099/GB-month) for footage kept only to meet retention. The catch: cold tiers charge retrieval fees plus minimum-duration commitments, so aggressive archiving bets you will rarely retrieve — a bet compliance can force you to lose when an audit demands bulk footage back.</p><h3 id="the-retrieval-and-egress-path"><strong>The retrieval and egress path</strong></h3><p>Playback and export run through short-lived signed URLs, ideally fronted by a CDN so repeat reads hit the edge, not the origin. Egress is the dominant variable cost — data out runs about $0.09/GB, roughly four times the hot-storage rate — and CDN fronting is the standard lever to cut it. Model retrieval as a first-class cost: a platform letting users pull their own recordings can spend more moving footage than storing it. And write, tier, and retrieve are each where compliance is enforced or lost.</p><h2 id="implementing-compliance-in-the-pipeline"><strong>Implementing compliance in the pipeline</strong></h2><p>Compliance is not a document attached to a recording — it is a set of pipeline properties, each mapping to a mechanism.</p><h3 id="tamper-evidence"><strong>Tamper-evidence</strong></h3><p>Hash each file (SHA-256) at write time and store it separately in an append-only log; any later change alters the hash and is detectable. For a stronger guarantee, chain the hashes or sign the manifest so the log itself cannot be quietly rewritten. Pair with object immutability — WORM via object-lock in compliance mode with a retention period — so even an admin cannot overwrite or delete a locked object before retention expires. Hashing plus WORM is what turns a file into evidence.</p><h3 id="encryption-in-transit-and-at-rest"><strong>Encryption in transit and at rest</strong></h3><p>Media is encrypted on the wire (SRTP to the SFU, TLS on upload and retrieval) and at rest (AES-256), with keys in a managed KMS. For regulated data the deciding question is who controls the keys — which sharpens when the storage is someone else’s infrastructure.</p><h3 id="access-logging-and-retention-automation"><strong>Access logging and retention automation</strong></h3><p>Every read is logged — who, when, which object — for the access trail an inspection expects. Lifecycle policies delete footage when its mandated period expires, with a legal-hold override for objects under investigation. DPDP lives here too: automated end-of-purpose deletion is not just cost hygiene, it is how you avoid holding personal data longer than the law allows.</p><h3 id="data-residency-at-the-architecture-level"><strong>Data residency at the architecture level</strong></h3><p>Residency is decided by where the object store physically sits. In cloud, pin buckets to a permitted region and confirm no replication, CDN edge, or backup crosses the border. On-premise, the question dissolves — storage is infrastructure the operator controls, in-jurisdiction, with no third party in the chain. For RBI-regulated vKYC, where recordings must stay in India, this often decides the architecture. And it is where build, buy, and embed truly diverge.</p><h2 id="build-buy-or-embed-%E2%80%94-at-the-architecture-level"><strong>Build, buy, or embed — at the architecture level</strong></h2><p>The business version framed this strategically. Technically, it is a choice of which mechanisms above you own.</p><p><strong>Buy a cloud recording API:</strong> composited recording as a managed service — no pool, no encode farm. In exchange, storage location, key control, and tamper-evidence are the vendor’s defaults, and egress plus per-minute are metered. Fine when residency is unconstrained and volume moderate; limiting when a regulator asks where footage lives and who could alter it.</p><p><strong>Build on open source:</strong> Jibri gives you a composited single-use fleet; mediasoup’s plain-transport path gives you raw capture with deferred composition. Either way you also own — and implement — hashing, WORM, access logging, retention, and residency. Maximum control, correct when a buyer demands you own every link, but a standing engineering commitment.</p><p><strong>Embed self-hosted infrastructure:</strong> the category Samvyo occupies. Based on SFU architecture, the raw-RTP capture path — cheap concurrent capture, deferred composition — is available at the architecture level, no browser-recorder fleet required. Deployed on-premise, the object store sits inside infrastructure the operator controls, making residency and retention control properties of the deployment and licensing flat rather than metered. The compliance mechanisms above — tamper-evidence, WORM, hash-chained audit logs — are patterns this self-hosted model lets you implement in your own environment; which ship built-in versus are integrated per deployment is worth confirming directly. And the boundary holds: for a low-volume, low-compliance product, self-hosting is over-engineering — a managed API is simpler and cheaper. It earns its complexity when concurrency is high, retention long, and residency non-negotiable.</p><p>Recording is the hardest part of video infrastructure because it is the one workload where media processing, storage economics, and cryptographic compliance are solved in the same pipeline — and the architecture you pick decides which you own and which you inherit.</p><blockquote>This is the recording-specific view of a larger decision. Read the full <a href="https://www.samvyo.com/white-label-video-infrastructure-build-buy-or-embed-a-decision-guide?ref=samvyo.com">build-vs-buy-vs-embed analysis</a> across the whole video stack.</blockquote><hr><p><em>For the cost and compliance overview aimed at decision-makers, see the business companion: </em><a href="https://www.samvyo.com/video-recording-at-scale-architecture-storage-and-the-compliance-trap?ref=samvyo.com" rel="noreferrer"><strong><em>link to the business version</em></strong></a><em>.</em></p><hr><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><h3 id="how-do-you-record-video-without-re-encoding-it"><strong>How do you record video without re-encoding it?</strong></h3><p>Capture the media as raw RTP at the SFU before it is rendered. In mediasoup, a plain transport (createPlainTransport with comedia: false, rtcpMux: false) consumes each producer and forwards RTP to FFmpeg or GStreamer, which writes it essentially as-is. With no real-time encode, this is far lighter than compositing and lets one worker capture many concurrent sessions — the model available in self-hosted, SFU-based infrastructure such as Samvyo.</p><h3 id="why-can%E2%80%99t-a-single-server-record-unlimited-sessions"><strong>Why can’t a single server record unlimited sessions?</strong></h3><p>In the composited model, each recording is a full real-time decode-compose-encode pipeline, and recorders like Jibri are single-use — one session per instance — so concurrency scales linearly with machines. Raw-track capture avoids the live encode and defers composition, raising per-worker concurrency, but the encode cost does not vanish — it moves to an offline farm you schedule.</p><h3 id="how-do-you-make-a-video-recording-tamper-evident"><strong>How do you make a video recording tamper-evident?</strong></h3><p>Hash each file (SHA-256) at write time into an append-only — ideally hash-chained or signed — log, so any later change is detectable. Combine with WORM storage — object-lock in compliance mode with a retention period — so the object cannot be overwritten or deleted before retention expires. Hashing proves integrity; WORM enforces immutability.</p><h3 id="how-do-you-guarantee-data-residency-for-recordings"><strong>How do you guarantee data residency for recordings?</strong></h3><p>In cloud, pin the object store to a permitted region and confirm no replication, CDN, or backup crosses the border. On-premise, the question largely dissolves — storage sits inside infrastructure the operator controls, in-jurisdiction — one reason RBI-regulated workloads, which require vKYC recordings to stay in India, often favor self-hosted infrastructure like Samvyo where residency is a property of the deployment.</p><h3 id="composited-versus-raw-track-recording-%E2%80%94-which-should-i-use"><strong>Composited versus raw-track recording — which should I use?</strong></h3><p>Composited when you need a single laid-out file immediately and concurrency is modest — you pay real-time encode per session for a ready-to-play output. Raw-track when concurrency is high and you can compose offline or accept per-track files — cheap capture now, heavy encode deferred to a batch queue. The decision is where to spend the encode cost: in real time, or later.</p></hr></hr>]]></content:encoded></item><item><title><![CDATA[Video Recording at Scale: Architecture, Storage, and the Compliance Trap]]></title><description><![CDATA[Recording looks like a checkbox but behaves like three separate systems. It covers why recording breaks before live streaming, the storage-and-egress math nobody runs, and the compliance trap — retention, chain of custody, residency — that decides if your archive is an asset or liability.]]></description><link>https://www.samvyo.com/blog/video-recording-at-scale-architecture-storage-and-the-compliance-trap</link><guid isPermaLink="false">6a716d488b45c3f0cd63a1b6</guid><category><![CDATA[video recording infrastructure]]></category><category><![CDATA[recording]]></category><category><![CDATA[video compliance]]></category><category><![CDATA[storage]]></category><category><![CDATA[data residency]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Tue, 04 Aug 2026 09:54:26 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/08/blog4Business.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/08/blog4Business.png" alt="Video Recording at Scale: Architecture, Storage, and the Compliance Trap"/><p>You can record every session your platform runs and still fail the one moment that matters: when a regulator, insurer, or court asks for one specific clip — and proof it was never altered.</p><p>That is the gap in how recording gets scoped. On a feature list it is a checkbox; in production it is three problems that break at different scales, and most teams meet the second and third only after shipping the first. Here is what recording actually costs — in engineering, storage, and compliance — once you move past a handful of sessions, starting with the scoping mistake itself.</p><h2 id="the-recording-problem-nobody-scopes-upfront"><strong>The recording problem nobody scopes upfront</strong></h2><p>Scope “recording” and most teams mean one thing: the video gets saved and plays back. That is the demo, and it works on day one with two people and a laptop.</p><p>But recording is not one capability. It is three, and they fail independently:</p><ul><li><strong>Concurrency</strong> — can you record many sessions at once, or does each tie up a dedicated resource?</li><li><strong>Storage economics</strong> — what does it cost to hold footage as long as you are required to, and to get it back out?</li><li><strong>Compliance</strong> — can you prove where it lives, how long it is kept, who accessed it, and that it was never altered?</li></ul><p>A platform can nail the first, ignore the second, and get destroyed by the third — each breaks at a different point on the growth curve, which is why they are so easy to miss. Take them in the order you will hit them: concurrency first.</p><h2 id="why-recording-breaks-before-live-streaming-does"><strong>Why recording breaks before live streaming does</strong></h2><p>Your live streaming can run flawlessly while recording quietly fails, because they do not scale the same way. An SFU is cheap: it forwards one stream to many viewers without re-processing it, so the hundredth viewer costs almost nothing. Recording is the opposite — producing one clean file means decoding streams, composing a layout, and encoding output, work that does not get cheaper as sessions grow. Every concurrent recording is its own workload on a far heavier curve than live. And on open-source stacks, that curve hits a hard wall.</p><h3 id="the-one-recorder-per-session-wall"><strong>The one-recorder-per-session wall</strong></h3><p>Jibri, the recorder most commonly paired with Jitsi, runs single-use: each instance handles one recording at a time, then recycles. Fine for one meeting; a real problem for a platform. Recording 50 sessions at once means roughly 50 recorder instances standing by, each a full machine running a headless browser. Recording capacity becomes a server fleet you provision and pay for, separate from the calls themselves — a line item, not a feature. Which is why client-side recording looks like the escape hatch.</p><h3 id="server-side-versus-client-side-recording"><strong>Server-side versus client-side recording</strong></h3><p>The tempting shortcut is to record in the participant’s browser and upload afterward, removing the server-side recorder entirely. It also removes your guarantees: client-side recording depends on the user’s device, network, and battery, so a dropped connection loses the footage. Fine for casual use. But for anything you must prove happened — a KYC session, a fleet incident, a monitored site — you cannot stake compliance on whether a phone finished uploading. Which turns the question from architecture into money.</p><h2 id="the-storage-math-nobody-runs"><strong>The storage math nobody runs</strong></h2><p>Recording is the one part of video infrastructure whose cost never stops growing: live sessions end, recordings accumulate, and the bill lands months after the decision that caused it.</p><p>Start with a real number. A ten-minute video KYC session runs roughly 500 MB to 1 GB; call it 1 GB. Record 10,000 of them a month and you add 10 TB monthly. At about $0.023 per GB-month, month one costs roughly $230 to store — trivial. But you are not storing one month; you are storing every prior month you are required to keep. By month twelve you hold 120 TB at about $2,700 a month and climbing, for footage nobody has opened since it was recorded. Storage grows every month because retention forbids deleting the old while you keep adding new.</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    border: 1px solid rgba(128, 128, 128, 0.4);
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 10px 16px;
    color: inherit;
    background: transparent;
    vertical-align: top;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18);
    font-weight: 400;
  }
</style>
<table class="rate-table">
  <colgroup><col width="264"><col width="264"/></col></colgroup>
  <thead>
    <tr>
      <th>Storage driver</th>
      <th>Figure</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Session size (10-min vKYC)</td>
      <td>~1 GB</td>
    </tr>
    <tr>
      <td>Volume</td>
      <td>10,000 sessions / month</td>
    </tr>
    <tr>
      <td>Added per month</td>
      <td>~10 TB</td>
    </tr>
    <tr>
      <td>Month-1 storage cost</td>
      <td>~$230</td>
    </tr>
    <tr>
      <td>Month-12 (cumulative ~120 TB)</td>
      <td>~$2,700 / month and climbing</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p>And storing it is the cheap part.</p><h3 id="the-egress-trap"><strong>The egress trap</strong></h3><p>Getting data back out costs far more than keeping it. Egress to the internet runs about $0.09/GB — nearly four times the storage rate per gigabyte — and teams miss it every time. Every audit pull, investigator handoff, or user download is billed, so a platform that lets users retrieve their own recordings can spend more on egress than on storage. Cold-archive tiers make storage nearly free but add retrieval fees and minimums, so the “cheap” tier turns expensive exactly when compliance forces you to produce footage. Every number here assumes you choose how long to keep it. In regulated markets, you do not.</p><h2 id="the-compliance-trap"><strong>The compliance trap</strong></h2><p>This is the part treated as an afterthought and the part carrying the real risk: recording for compliance is not about having the file, it is about standing behind it. Retention comes first, and it is set by whoever regulates your customer:</p><ul><li><strong>Banking / video KYC (India):</strong> RBI requires vKYC recordings kept a minimum of five years, stored within India.</li><li><strong>Fleet telematics:</strong> AIS-140 mandates 90-day retention of tracking data — not video; fleet video retention is insurer- and investigation-driven, typically 30–90 days.</li><li><strong>Surveillance / CCTV:</strong> commonly 30–90 days, with banks often held to six months or more.</li></ul><p>Retention also has a ceiling: India’s DPDP Act treats recorded video of people as personal data, so you should not keep it longer than the purpose justifies — long enough to satisfy the sector regulator, not so long you breach privacy law. Knowing how long, though, is only half the problem.</p><h3 id="chain-of-custody"><strong>Chain of custody</strong></h3><p>The harder question: when you produce a recording as evidence, can you prove it is the original, untouched? A file in a bucket proves nothing on its own — anyone with access could replace it. To hold up in an inspection, dispute, or court, it needs tamper-evidence: a verifiable creation time, proof it has not changed, and a log of every access. This is what “we save the file” architectures skip, and what decides whether your archive is an asset or an unprovable liability. One question sits underneath it.</p><h3 id="where-the-recording-lives-decides-jurisdiction"><strong>Where the recording lives decides jurisdiction</strong></h3><p>Physically, where does the footage sit? Location determines jurisdiction. RBI’s data-localization rule is explicit — vKYC recordings cannot reside on infrastructure outside permitted borders. Hand footage to a cloud region abroad, or a hosted platform whose storage location you cannot account for, and you may be non-compliant regardless of how good the rest is. For government, defence, and BFSI buyers, “where is the data” is often the first question and the one that ends deals. So before committing to any approach, check the short list.</p><h2 id="what-to-evaluate-before-you-commit"><strong>What to evaluate before you commit</strong></h2><p>Build, buy, or embed, these questions separate a demo from a production system:</p><ul><li><strong>Concurrency ceiling</strong> — how many simultaneous recordings, and what does more cost?</li><li><strong>Storage ownership</strong> — do you own it, and can you point to where footage lives?</li><li><strong>Egress terms</strong> — what does retrieval cost, routinely and in bulk?</li><li><strong>Tamper-evidence</strong> — can it prove originality and log access?</li><li><strong>Data residency</strong> — can footage be guaranteed to stay in-jurisdiction?</li><li><strong>Retention automation</strong> — is deletion enforced automatically or left manual?</li></ul><p>The right answers depend on what you are building — and so does the right approach.</p><h2 id="where-each-approach-fits"><strong>Where each approach fits</strong></h2><p>There is no universally correct way to record. Three paths, each winning for a different company.</p><p><strong>Cloud recording APIs</strong> (<a href="https://samvyo.com/blog/per-minute-video-pricing-at-scale-what-enterprise-teams-actually-pay?ref=samvyo.com">per-minute</a> plus storage) are the fastest route to a working feature, and at low-to-moderate volume without heavy compliance they are often right. They stop making sense at scale and under regulation: per-minute and egress costs compound, and you are trusting a third party’s storage location to satisfy your regulator.</p><p><strong>DIY on open source</strong> (Jibri and similar) gives maximum control, zero licensing, and full ownership of where data sits — what some regulated buyers require. The honest cost is operational: you run and scale a recorder fleet and build tamper-evidence, retention, and residency yourself. Worth it with the engineering depth and a reason to own the stack; a larger commitment than it first looks otherwise.</p><p><strong>Self-hosted / on-premise</strong> (flat licensing, your environment) is where Samvyo sits. It fits organizations for whom residency and retention control are non-negotiable — BFSI, government, defence, healthcare — because footage never leaves infrastructure you control, storage is a flat licence rather than a metered bill, and residency answers itself. It is genuinely not right for a low-volume product with no compliance pressure, where a cloud API is simpler and cheaper. Self-hosting earns its keep when volume is high, retention is long, and “where is the data” is a question you must answer with certainty.</p><p>Recording is the hardest part of video infrastructure because getting it right means solving concurrency, storage economics, and compliance at once — and the cost of getting it wrong shows up late, when the footage you need is missing, unaffordable to retrieve, or impossible to prove.</p><hr><p><em>For the architecture behind each approach — how the recording pipeline works from capture to storage to compliance chain — see the technical companion:</em><a href="https://www.samvyo.com/video-recording-architecture-what-runs-behind-the-pipeline-at-scale?ref=samvyo.com" rel="noreferrer"><em> <strong>link to technical version</strong></em></a><em>.</em></p><hr><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><h3 id="how-much-does-video-recording-cost-at-scale"><strong>How much does video recording cost at scale?</strong></h3><p>Storage is cheap per gigabyte but compounds, because retention forbids deletion — 10,000 ten-minute sessions a month add roughly 10 TB monthly, so by month twelve you are storing 100+ TB continuously. The bigger surprise is egress: retrieval runs about four times the per-GB storage rate, so platforms that frequently produce recordings often spend more retrieving than storing. Flat-licensed self-hosted infrastructure like Samvyo removes per-minute and egress metering, which is why it tends to win at high volume and long retention.</p><h3 id="how-long-must-video-kyc-recordings-be-retained-in-india"><strong>How long must video KYC recordings be retained in India?</strong></h3><p>RBI requires video KYC (V-CIP) recordings kept a minimum of five years, stored within India. Because footage accumulates without deletion across that span, storage location and retention automation become core architectural decisions — one reason regulated institutions often choose self-hosted or on-premise recording, where residency and retention stay under their control.</p><h3 id="what-is-chain-of-custody-for-video-evidence"><strong>What is chain of custody for video evidence?</strong></h3><p>It is the ability to prove a recording is the original, unaltered since creation, with a log of everyone who accessed it. A raw file in storage provides none of this; it needs tamper-evidence and access logging built into the pipeline. This is usually the missing piece in “we just save the file” setups, and what decides whether a recording holds up in an audit or court.</p><h3 id="can-recorded-video-be-tampered-with"><strong>Can recorded video be tampered with?</strong></h3><p>A stored file can be replaced or edited by anyone with access unless the system is designed to prevent and detect it. Tamper-evidence — verifiable timestamps, integrity checks, access logs — is what makes footage usable as evidence. Platforms built for regulated use, including Samvyo’s on-premise deployments, treat this as part of the recording layer rather than an add-on.</p><h3 id="on-premise-or-cloud-recording-%E2%80%94-which-is-better"><strong>On-premise or cloud recording — which is better?</strong></h3><p>Neither universally. Cloud APIs are faster and cheaper at low volume without heavy compliance. On-premise or self-hosted wins when residency is mandated, retention is long, and volume makes metered storage and egress compound — common in BFSI, government, healthcare, and defence. The deciding questions: where footage must legally reside, and how much you will record over how long.</p></hr></hr>]]></content:encoded></item><item><title><![CDATA[Enterprise Video Architecture: What Runs Behind Each Tier When You Move Beyond Zoom]]></title><description><![CDATA["Beyond Zoom" is really three enterprise video architectures — meeting tools, cloud video APIs, and self-hosted infrastructure. This technical companion walks each: what runs under the hood, where your media flows, and what you own at every layer.]]></description><link>https://www.samvyo.com/blog/enterprise-video-architecture-what-runs-behind-each-tier-when-you-move-beyond-zoom</link><guid isPermaLink="false">6a687f468b45c3f0cd63a124</guid><category><![CDATA[enterprise video solutions]]></category><category><![CDATA[On-prem Video Conferencing]]></category><category><![CDATA[Open-Source Video Infrastructure]]></category><category><![CDATA[Proprietary video SDKs]]></category><category><![CDATA[real-time communication SDKs]]></category><category><![CDATA[video SDK architecture]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 30 Jul 2026 06:49:09 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/07/zoomtechincal.png" medium="image"/><content:encoded><![CDATA[<blockquote><em>If you arrived here from the</em><a href="https://www.samvyo.com/beyond-zoom-what-businesses-actually-need-when-they-outgrow-consumer-video-calling?ref=samvyo.com" rel="noreferrer"><em> business version</em></a><em>, you’re in the right place. That piece mapped the three tiers — meeting tools, embeddable video APIs, self-hosted infrastructure — and how to tell which one your use case needs. This is the companion “how”: what each tier actually is at the architecture level, for the engineer who has to build or evaluate it. No re-run of the business case — we go straight to the wiring.</em></blockquote><img src="https://www.samvyo.com/blog-admin1/content/images/2026/07/zoomtechincal.png" alt="Enterprise Video Architecture: What Runs Behind Each Tier When You Move Beyond Zoom"/><p>“We’ve outgrown Zoom” is a product statement. “We need to embed video, keep the data in-region, and stop paying per minute” is an <strong>enterprise video architecture</strong> statement — and the two rarely get translated cleanly between the boardroom and the engineering channel. That translation gap is exactly where bad build-versus-buy decisions get made. So this piece translates: it walks the architecture behind each of the three tiers — what runs, where the media flows, and what you own at each layer — so the technical decision actually matches the business one.</p><h2 id="the-three-tiers-as-three-enterprise-video-architectures"><strong>The Three Tiers as Three Enterprise Video Architectures</strong></h2><p>The business version described the tiers by what they’re for. Underneath, they’re three different enterprise video architectures that differ in one variable: how much of the media path you control, and where the packets physically go.</p><p><strong>Meeting tools. </strong>A finished SaaS application in front of a closed media backend you never touch. You get an iframe or a client SDK; the servers, routing, and recording are entirely the vendor’s.</p><p><strong>Embeddable video APIs. </strong>A client SDK in front of the vendor’s cloud SFU. You write against rooms, tracks, and participants; the media still routes through their infrastructure, and you pay per participant-minute.</p><p><strong>Self-hosted infrastructure. </strong>You run the media server, signaling, TURN, and recording yourself — or a vendor deploys their stack into infrastructure you control. You own the media path and the data end to end.</p><p>Here’s the whole comparison in one view. The rest of this piece expands each row — because each row is a decision, and they’re usually made separately when they should be made together.</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    border: 1px solid rgba(128, 128, 128, 0.4);
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 10px 16px;
    color: inherit;
    background: transparent;
    vertical-align: top;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18);
    font-weight: 700;
  }
</style>
<table class="rate-table">
  <colgroup><col width="160"><col width="140"><col width="156"><col width="168"/></col></col></col></colgroup>
  <thead>
    <tr>
      <th>Dimension</th>
      <th>Meeting tools</th>
      <th>Cloud video API</th>
      <th>Self-hosted / managed</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="font-weight:700;">Who owns the media path</td>
      <td>Vendor</td>
      <td>Vendor</td>
      <td>You</td>
    </tr>
    <tr>
      <td style="font-weight:700;">UI / white-label</td>
      <td>Skin only</td>
      <td>Full UI, vendor media</td>
      <td>Full, top to bottom</td>
    </tr>
    <tr>
      <td style="font-weight:700;">Data residency</td>
      <td>Vendor's regions</td>
      <td>Vendor's regions</td>
      <td>Your region or on-prem</td>
    </tr>
    <tr>
      <td style="font-weight:700;">Cost model</td>
      <td>Per seat</td>
      <td>Per minute</td>
      <td>Flat license</td>
    </tr>
    <tr>
      <td style="font-weight:700;">Recording location</td>
      <td>Vendor cloud</td>
      <td>Vendor cloud</td>
      <td>Storage you control</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p>The first fork most teams hit is embedding — putting video inside their own product — so start there.</p><h2 id="what-%E2%80%9Cembed-video-in-your-product%E2%80%9D-actually-means"><strong>What “Embed Video in Your Product” Actually Means</strong></h2><p>“Embedding video” isn’t one thing. It’s a spectrum from “their UI in your page” to “your entire stack on your servers,” and there are three rungs on that ladder.</p><p><strong>Meeting SDK / iframe embed. </strong>You drop the vendor’s meeting experience into your app — Zoom’s Meeting SDK is the canonical example. Fast to ship, but it’s their interface in an iframe or webview, restyling is limited, and the media backend is entirely theirs.</p><p><strong>Client Video SDK. </strong>You get camera, microphone, and track primitives and build your own UI on top — Zoom’s Video SDK, Agora, Daily. Full control of the interface; the media still routes through the vendor’s SFU cloud; billing is per participant-minute.</p><p><strong>Own the infrastructure. </strong>You run the SFU and signaling yourself, so you control the UI, the media path, and the data. Maximum control, maximum operational surface.</p><p>The point is that where you land on this ladder sets three things at once — white-label depth, data residency, and cost model — because they’re not independent knobs; they’re consequences of the same architectural choice. And past the shallow end, you’re now responsible for, or renting, the component that makes multi-party video work at all: the SFU.</p><h2 id="the-sfu-what-running-video-actually-requires"><strong>The SFU: What Running Video Actually Requires</strong></h2><p>Any video beyond a couple of participants needs a media server, and it helps to know why. Peer-to-peer mesh has every participant send a copy to every other, so it collapses past a handful — <a href="https://samvyo.com/blog/sfu-vs-mcu-vs-mesh-which-topology-your-call-size-actually-needs?ref=samvyo.com">the call size at which each topology stops working</a> is the real dividing line. An MCU decodes and re-encodes everything into one mixed stream — CPU-heavy and higher latency. An <a href="https://samvyo.com/blog/what-is-an-sfu-and-why-does-every-video-platform-use-one?ref=samvyo.com">SFU (Selective Forwarding Unit)</a> receives one upstream copy per participant and selectively forwards packets to the others without re-encoding: low latency, far lighter, and the standard for real-time video. mediasoup, LiveKit, and Janus are SFUs.</p><p>Which is why “self-host video” sounds like installing an app but isn’t. A production deployment is an SFU (<a href="https://samvyo.com/blog/sfu-scaling-clustering-cascading-and-where-the-bottleneck-moves?ref=samvyo.com">usually clustered, and cascaded once one node fills</a>), a signaling server, STUN/TURN for NAT traversal, a recording pipeline, and the load balancing and geo-distribution to scale them. You’re not running a program; you’re operating a distributed real-time system. That operational weight is the real cost of the self-hosted tier — and the reason the managed-deployment option exists, which we’ll get to.</p><p>The SFU is also where a business requirement quietly becomes a technical one: white-label.</p><h2 id="white-label-layer-by-layer"><strong>White-Label, Layer by Layer</strong></h2><p>“Your brand, not theirs” means different things at different layers, and buyers routinely conflate two of them.</p><p><strong>At the meeting-embed layer, </strong>you can change logos and colours, but the interaction model and any “powered by” surface stay the vendor’s. Shallow branding.</p><p><strong>At the Video SDK layer, </strong>you build the whole interface, so branding is complete at the pixel level — but the media still traverses the vendor’s cloud, so white-label stops at the interface and doesn’t reach the data.</p><p><strong>At the self-hosted layer, </strong>it goes all the way down: your UI, your domain, your media servers, no upstream trace anywhere in the path.</p><p>So white-label has two dimensions people merge into one: interface branding, which a Video SDK gives you, and infrastructure ownership, which only the self-hosted layer gives you. Regulated and OEM buyers almost always mean the second — which points straight at the thing that most often forces a team down to the infrastructure layer: where the data physically lives.</p><h2 id="deployment-and-data-residency-where-the-media-actually-goes"><strong>Deployment and Data Residency: Where the Media Actually Goes</strong></h2><p>Sort the architectures by data path and the residency picture becomes concrete.</p><p><strong>Vendor cloud. </strong>Meeting tools and cloud APIs route media through the vendor’s SFUs, frequently in US regions. You don’t choose the jurisdiction, and often can’t prove it to an auditor.</p><p><strong>Managed cloud (dedicated). </strong>The platform’s stack deployed into a cloud region you specify — AWS, DigitalOcean, or Hetzner, for instance — as a dedicated deployment rather than multi-tenant infrastructure. Media stays in-region and in an environment you control, without you running the hardware. This is the middle path, and it’s where a platform like Samvyo’s managed deployment sits: its stack, your chosen cloud and region, flat-licensed.</p><p><strong>On-premise. </strong>Media never leaves your own data centre. Maximum control and the strongest residency story; you run the metal.</p><p>One honest caveat, the same one the business version makes: choosing the region or going on-prem controls jurisdiction and residency — it does not by itself make you HIPAA- or GDPR-compliant. Those are controls programs regardless of where the SFU runs. What deployment choice changes is whether you can answer “where does the media live, and under whose law” — and a managed dedicated deployment gets you most of that answer without the burden of running the hardware yourself. Residency also reshapes the component nobody budgets for: recording.</p><h2 id="compliant-recording-architecture"><strong>Compliant Recording Architecture</strong></h2><p>Where recording happens matters as much as whether it happens.</p><p><strong>Vendor-cloud recording. </strong>Recordings are captured and stored in the vendor’s cloud; you inherit their region, retention, and access model. Fine until a compliance officer asks where exactly a given recording lives and who accessed it.</p><p><strong>Server-side recording in your deployment. </strong>The SFU or a dedicated egress service captures streams into storage you control, with your encryption, retention, and audit trail. This is what regulated records — video KYC, telehealth — generally require.</p><p>And recording is never free: it’s a separate service, compute-heavy (often a headless browser or an egress pipeline per session) and storage-heavy. Whether it runs in the vendor’s cloud or your own deployment decides who can actually answer the auditor. Put the layers together — embed depth, the SFU, white-label, residency, recording — and the build-versus-buy question stops being philosophical.</p><h2 id="build-buy-or-deploy-choosing-an-enterprise-video-architecture"><strong>Build, Buy, or Deploy: Choosing an Enterprise Video Architecture</strong></h2><p><strong>Build on open source. </strong>mediasoup, LiveKit, or Janus, assembled and operated by you — SFU, signaling, TURN, recording, scaling. Total control, total operational ownership. Right when video is core to the product and you have the specialists.</p><p><strong>Buy a cloud API. </strong>Agora, Daily, or Zoom’s Video SDK: an SDK in front of their cloud SFU, billed per minute. Fastest to production, least control over media path and residency. Right when speed outweighs ownership.</p><p><strong>Deploy a commercial platform. </strong>The whole stack — SFU, signaling, TURN, recording, white-label — delivered as a deployable unit you run on-premise or as a managed cloud deployment on AWS, DigitalOcean, or Hetzner, flat-licensed. Samvyo is one such option. It’s the middle path: infrastructure ownership and residency without assembling the stack yourself. Where it doesn’t fit: if you only need a call button, or vendor-cloud routing is acceptable, this is more than the problem requires.</p><p>Three approaches, one underlying axis — how much of the media path you want to own.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>The three tiers aren’t three products; they’re three architectures separated by a single variable — how much of the media path you own. Meeting tools own all of it and hand you a window. Cloud APIs own the media and hand you an SDK. The self-hosted tier, whether on-premise or a managed cloud deployment, hands you the whole stack and the data. Match the enterprise video architecture to the actual requirement — embed depth, brand, residency, cost — and the decision stops being a build-versus-buy religious war and becomes a specification.</p><h2 id="what%E2%80%99s-next"><strong>What’s Next?</strong></h2><p><strong><em>Want the decision-maker’s version — which tier to pick and what each costs, without the wiring? </em></strong>The companion business piece frames the same three tiers as a buying decision you can forward to a non-engineer stakeholder: <a href="https://samvyo.com/blog/beyond-zoom-what-businesses-actually-need-when-they-outgrow-consumer-video-calling?ref=samvyo.com" rel="noreferrer"><strong>link to business version</strong>.</a></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><h3 id="what%E2%80%99s-the-difference-between-zoom%E2%80%99s-meeting-sdk-and-video-sdk"><strong>What’s the difference between Zoom’s Meeting SDK and Video SDK?</strong></h3><p>The Meeting SDK embeds Zoom’s existing meeting interface inside your app. The Video SDK gives you raw media and track primitives to build a fully custom UI on Zoom’s media stack, billed per participant-minute. One skins a meeting; the other is building blocks for your own product.</p><h3 id="what-is-an-sfu-and-do-i-need-one"><strong>What is an SFU, and do I need one?</strong></h3><p>An SFU (Selective Forwarding Unit) is a media server that forwards one upstream copy of each participant’s stream to the others without re-encoding. Any multi-party video beyond a few participants needs one — either the vendor’s SFU (with a cloud API) or one you run (self-hosted).</p><h3 id="can-you-self-host-video-in-the-cloud-or-only-on-premise"><strong>Can you self-host video in the cloud, or only on-premise?</strong></h3><p>Both. “Self-hosted” means a dedicated deployment you control — that can be on-premise in your own data centre, or a managed deployment in a cloud region you choose, such as AWS, DigitalOcean, or Hetzner. What separates it from a cloud API is that it’s dedicated and flat-licensed rather than multi-tenant and per-minute.</p><h3 id="does-self-hosting-make-me-hipaa-or-gdpr-compliant"><strong>Does self-hosting make me HIPAA or GDPR compliant?</strong></h3><p>No. Self-hosting controls where data physically lives — jurisdiction and residency — which is often a requirement. But compliance itself is a program of controls (access, encryption, audit, retention) that applies regardless of where the media servers run.</p><h3 id="where-are-recordings-stored-in-embedded-video"><strong>Where are recordings stored in embedded video?</strong></h3><p>It depends on the architecture. With a cloud API, recordings live in the vendor’s cloud and region. With a self-hosted or managed deployment, they’re captured into storage you control, with your own retention and audit trail. For regulated records, the latter is usually required.</p><h3 id="what-does-white-label-actually-mean-technically"><strong>What does white-label actually mean, technically?</strong></h3><p>Two separate layers that buyers often merge: interface branding — your own UI, achievable with a Video SDK — and infrastructure ownership — your media servers and domain with no upstream trace, achievable only at the self-hosted or managed-deployment layer. Enterprise and OEM buyers usually mean both.</p>]]></content:encoded></item><item><title><![CDATA[Beyond Zoom: What Businesses Actually Need When They Outgrow Consumer Video Calling]]></title><description><![CDATA[Everyone Googles “Zoom alternative for enterprise” — but that’s the wrong question. This piece breaks enterprise video calling into three tiers, the five things you actually need when you outgrow Zoom, and the real per-minute cost math, so you can name the tier and let the shortlist write itself.]]></description><link>https://www.samvyo.com/blog/beyond-zoom-what-businesses-actually-need-when-they-outgrow-consumer-video-calling</link><guid isPermaLink="false">6a687c868b45c3f0cd63a11b</guid><category><![CDATA[enterprise video solutions]]></category><category><![CDATA[Proprietary video SDKs]]></category><category><![CDATA[WebRTC vs proprietary SDKs]]></category><category><![CDATA[Customisable WebRTC Solutions]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 30 Jul 2026 06:49:03 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/07/ZoomBusiness.png" medium="image"/><content:encoded><![CDATA[<blockquote><em>Zoom is the right answer more often than the internet admits. This is about the exact line where it stops being enough for enterprise video calling — and what actually sits on the other side.</em></blockquote><img src="https://www.samvyo.com/blog-admin1/content/images/2026/07/ZoomBusiness.png" alt="Beyond Zoom: What Businesses Actually Need When They Outgrow Consumer Video Calling"/><p>Every month, thousands of teams type some version of the same phrase into Google: “<strong>Zoom alternative for enterprise</strong>.” What they get back is usually a list of ten other meeting tools — Microsoft Teams, Google Meet, Webex — as if outgrowing Zoom were solved by putting a different logo on the same kind of product. For many of those teams, swapping one meeting app for another won’t change anything, because the problem was never Zoom. The problem is that they’ve outgrown the entire category of consumer meeting tools, and they need real <strong>enterprise video calling</strong> — something that category was never built to deliver.</p><p>This piece is about that line: where a meeting tool stops being the right tool, and what actually sits on the other side. And it starts with the part most “Zoom alternative” articles skip.</p><h2 id="what-zoom-is-actually-great-at-and-the-myth-worth-killing"><strong>What Zoom Is Actually Great At (And the Myth Worth Killing)</strong></h2><p>Zoom is genuinely excellent at what it was built for. It runs reliable meetings at scale, handles webinars and large events, and does it through an interface almost everyone already knows how to use. For the job of “hold a meeting,” it’s a default for good reasons, and if your real need is cheaper or better meetings, the honest answer is often to stay on Zoom — or move to Teams if your company already lives in Microsoft’s world. Replacing it with another meeting tool is a lateral move.</p><p>There’s also a myth worth killing before we go further: the idea that Zoom is “just a meeting tool,” so you can’t build with it. That’s not true. Zoom ships developer products — a Meeting SDK that embeds the Zoom meeting experience inside your own app, and a Video SDK that lets you build a fully custom video experience on Zoom’s media stack, billed per participant-minute. So “Zoom can’t put video inside our product” is usually just wrong.</p><p>That matters, because it reframes the whole question. Outgrowing Zoom is rarely about a feature Zoom lacks. It’s about a model that stops fitting. And to see where it stops fitting, you have to see that “video” isn’t one market — it’s three.</p><h2 id="the-three-tiers-of-enterprise-video-calling"><strong>The Three Tiers of Enterprise Video Calling</strong></h2><p>Almost every confusing conversation about “replacing Zoom” clears up the moment you realise that enterprise video calling isn’t one market — it’s three distinct tiers of video product, each built for a different job.</p><p><strong>Meeting tools. </strong>Zoom, Teams, Google Meet, Webex. You use them to run meetings. The product is finished; you log in and talk.</p><p><strong>Embeddable video APIs (CPaaS). </strong>Zoom’s own Video SDK, Agora, Twilio Video, Daily, Vonage, LiveKit Cloud. You embed video inside your own product and pay per minute of usage. The product is yours; the video is a feature in it.</p><p><strong>Self-hosted infrastructure. </strong>Jitsi and LiveKit (open source), and commercial SFU-based platforms such as Samvyo. You run the media path on infrastructure you control, and the video data never leaves it.</p><p>Most people searching for a “Zoom alternative for enterprise” are, without knowing it, trying to move from tier one into tier two or tier three — usually because video now has to live inside their product, or inside their own infrastructure. Here’s the map in one view.</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    border: 1px solid rgba(128, 128, 128, 0.4);
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 10px 16px;
    color: inherit;
    background: transparent;
    vertical-align: top;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18);
    font-weight: 700;
  }
</style>
<table class="rate-table">
  <colgroup><col width="137"><col width="177"><col width="184"><col width="127"/></col></col></col></colgroup>
  <thead>
    <tr>
      <th>Tier</th>
      <th>What it's for</th>
      <th>Example providers</th>
      <th>Cost model</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="font-weight:700;">Meeting tools</td>
      <td>Running meetings, webinars, and calls</td>
      <td>Zoom, Teams, Google Meet, Webex</td>
      <td>Per seat / per host</td>
    </tr>
    <tr>
      <td style="font-weight:700;">Embeddable video APIs</td>
      <td>Putting video inside your own product</td>
      <td>Zoom Video SDK, Agora, Twilio Video, Daily, Vonage, LiveKit Cloud</td>
      <td>Per minute (usage-based)</td>
    </tr>
    <tr>
      <td style="font-weight:700;">Self-hosted infrastructure</td>
      <td>Owning the media path and the data</td>
      <td>Jitsi, LiveKit (OSS), SFU-based platforms like Samvyo</td>
      <td>Flat license / your infra or managed cloud</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p>Which tier you need isn’t a matter of taste. It comes down to five specific things enterprise video calling starts to demand the moment video becomes part of the product — rather than just a way to hold meetings.</p><h2 id="the-five-things-enterprise-video-calling-actually-requires"><strong>The Five Things Enterprise Video Calling Actually Requires</strong></h2><p><strong>1. Branding and white-label control. </strong>When video lives inside your product — a telehealth app, a trading platform, an LMS — customers should see your brand, not a vendor’s. A meeting-tool embed carries Zoom’s interface; true white-label (your UI, your domain, no upstream trace) needs a video API at minimum, often self-hosted infrastructure. Concession: many businesses are fine with a branded-but-recognisable experience and shouldn’t build infrastructure just to hide a logo.</p><p><strong>2. Data ownership and residency. </strong>Regulated buyers — banks, hospitals, government — often require video and recordings to stay in a specific jurisdiction, or on infrastructure they control. Cloud tools route media through the vendor, frequently under US jurisdiction; self-hosting changes that. The nuance vendors skip: self-hosting controls where data physically lives, but doesn’t by itself make you HIPAA- or GDPR-compliant — that’s a controls program regardless of where the bits run.</p><p><strong>3. Cost predictability. </strong><a href="https://samvyo.com/blog/per-minute-video-pricing-at-scale-what-enterprise-teams-actually-pay?ref=samvyo.com">Per-minute rates</a> read as rounding errors — Agora lists about $0.00099/minute for voice and $0.00399/minute for HD video; Zoom’s Video SDK runs roughly $0.0035–0.004 per participant-minute over a $100/month minimum. Then they compound:</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    border: 1px solid rgba(128, 128, 128, 0.4);
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 10px 16px;
    color: inherit;
    background: transparent;
    vertical-align: top;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18);
    font-weight: 700;
  }
</style>
<table class="rate-table">
  <colgroup><col width="360"><col width="264"/></col></colgroup>
  <thead>
    <tr>
      <th>Cost driver</th>
      <th>Figure</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Rate — HD video</td>
      <td>~$0.004 per participant-minute</td>
    </tr>
    <tr>
      <td>Scenario</td>
      <td>500 concurrent HD sessions, running all day</td>
    </tr>
    <tr>
      <td>Participant-minutes / month</td>
      <td>~6.2 million</td>
    </tr>
    <tr>
      <td style="font-weight:700;">Base monthly cost</td>
      <td style="font-weight:700;">~$25,000</td>
    </tr>
    <tr>
      <td>With recording + storage (1.5–2.5×)</td>
      <td>~$37,000–62,000</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p>The concession: per-minute is the cheaper, lower-risk model at low or unpredictable volume — you pay only for what you use. It flips to more expensive than a flat license once usage is high and steady, typically around 100–200 concurrent users.</p><p><strong>4. API and SDK embed depth. </strong>A meeting tool embeds a meeting; a video API hands you the primitives — rooms, tracks, raw media — to build a product and run your own logic (transcription, analytics, recording) on the stream. Concession: if you only need an “add a call” button, a meeting embed ships faster and cheaper — a full media pipeline would be over-engineering.</p><p><strong>5. Compliance and recording. </strong>Enterprise video needs compliant recording — retention, audit trails, controlled storage — not just a record button. HIPAA business-associate agreements are available from Zoom, Agora, Vonage, and LiveKit’s cloud tier, so self-hosting isn’t automatic. Where meeting tools thin out is compliance-grade recording with provable residency and audit chains — the point at which regulated buyers start eyeing tiers two and three.</p><p>Notice that not one of those five is “better meetings.” Every one is about video doing a job inside the business — which is exactly why the meeting-tool category runs out of road. So who actually provides these things, and can you trust the provider to still be there next year?</p><h2 id="the-landscape-%E2%80%94-real-names-honest-status"><strong>The Landscape — Real Names, Honest Status</strong></h2><p>Here’s the field as it actually stands, tier by tier, with two status corrections that most comparison articles get wrong.</p><p><strong>Meeting tools. </strong>Zoom, Microsoft Teams, Google Meet, Webex. If your need is meetings, that’s the whole shortlist — the choice usually comes down to which ecosystem you already pay for.</p><p><strong>Embeddable video APIs. </strong>Agora, Daily, Vonage (formerly TokBox/OpenTok), LiveKit Cloud, Zoom’s Video SDK, and Twilio Video. Two things most comparison posts get wrong: Twilio announced it was killing its video product, then publicly reversed that in late 2024 — it’s still available today, despite the “Twilio Video is shutting down” articles nobody updated. And Dyte, another popular API, was acquired by Cloudflare in 2025 and folded into its real-time stack. The point isn’t either company — it’s that in this tier, the provider’s roadmap is something you rent, and <a href="https://samvyo.com/blog/what-happens-when-your-video-api-provider-gets-acquired-or-shuts-down?ref=samvyo.com">it can change under you</a>.</p><p><strong>Self-hosted infrastructure. </strong>Jitsi and LiveKit (open source) are the usual starting points for owning the media path; commercial SFU-based platforms like Samvyo sit in the same tier — deployed on-premise, or as a managed cloud deployment on AWS, DigitalOcean, or Hetzner with support handled for you. This is where businesses land when data ownership or flat, predictable cost outweighs shipping in a weekend.</p><p>With that map in front of you, the useful question stops being “what replaces Zoom” and becomes “which tier does my use case actually live in?”</p><h2 id="choosing-the-right-tier-for-enterprise-video-calling"><strong>Choosing the Right Tier for Enterprise Video Calling</strong></h2><p>There’s no single best answer — there’s a best answer for your situation. A short way to place yourself:</p><p><strong>If you need better or cheaper meetings </strong>— stay in tier one. Zoom, or Teams if you’re already in Microsoft’s ecosystem. Moving further is solving a problem you don’t have.</p><p><strong>If you need video inside your own product, fast </strong>— tier two. A video API (Agora, Daily, or Zoom’s own Video SDK) gets you to production quickly; watch the per-minute cost curve as you scale, and check where the media routes.</p><p><strong>If you need data ownership, white-label depth, or flat cost at scale </strong>— tier three. Self-hosted open source if you have the engineering team to run it, or a commercial platform if you’d rather have deployment and support handled. Samvyo is one option here — it runs on-premise or as a managed cloud deployment on AWS, DigitalOcean, or Hetzner — alongside building on open-source media servers yourself.</p><p>And the honest boundary, stated plainly: if you mostly need reliable meetings, or your volume is low and spiky, or you have no data-residency pressure, moving to self-hosted infrastructure would be solving a problem you don’t have. The right default for “we just want a better meeting experience” is to stay where you are.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Most people searching for a Zoom alternative don’t actually need to leave Zoom — they need to understand what enterprise video calling really requires, and which of the three tiers their use case lives in. Because the answer means one thing if you want better meetings, another if you want to embed video in your product, and another entirely if you need to own the data and the infrastructure. Name the tier, and the shortlist writes itself. Skip that step, and you end up swapping one meeting tool for another and wondering why nothing changed.</p><h2 id="what%E2%80%99s-next"><strong>What’s Next?</strong></h2><p><strong><em>Want the engineering-level version — how embedded video, white-label, on-prem deployment, and compliant recording actually work under the hood? </em></strong>The companion technical deep-dive walks through the architecture behind each tier, for the team that has to build or evaluate it: <a href="https://www.samvyo.com/enterprise-video-architecture-what-runs-behind-each-tier-when-you-move-beyond-zoom?ref=samvyo.com" rel="noreferrer"><strong>link to technical version</strong>.</a></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><h3 id="what-is-the-best-zoom-alternative-for-enterprise"><strong>What is the best Zoom alternative for enterprise?</strong></h3><p>There isn’t a single best one — it depends which of three tiers you need. For better meetings, Teams or Webex are the closest swaps. To embed video in your product, a video API such as Agora, Daily, or Zoom’s own Video SDK fits. For data ownership and predictable cost at scale, self-hosted or on-premise platforms — Jitsi, LiveKit, or commercial options like Samvyo — are the category. “Best” is whichever tier matches your actual use case.</p><h3 id="can-you-embed-zoom-into-your-own-application"><strong>Can you embed Zoom into your own application?</strong></h3><p>Yes. Zoom offers a Meeting SDK that embeds the Zoom meeting experience, and a Video SDK for building a custom video experience on Zoom’s media stack, billed per participant-minute. Embedding video with Zoom is possible — the reasons teams still move on are usually pricing model, data residency, or white-label depth, not raw capability.</p><h3 id="is-zoom-hipaa-compliant"><strong>Is Zoom HIPAA compliant?</strong></h3><p>Zoom offers a HIPAA-eligible configuration with a business-associate agreement (BAA), and compliance also depends on how you configure and operate it. Self-hosting isn’t required for HIPAA — it changes where data physically lives, which is a separate, often contractual, requirement rather than a compliance one.</p><h3 id="when-should-a-business-move-off-zoom"><strong>When should a business move off Zoom?</strong></h3><p>When the need shifts from “hold meetings” to embedding video in your product, keeping video data on your own infrastructure, controlling cost as usage scales, or shipping fully under your own brand. Those are jobs meeting tools aren’t built for. If none of them apply, staying on Zoom is usually the right call.</p><h3 id="what%E2%80%99s-the-difference-between-zoom-and-a-video-api"><strong>What’s the difference between Zoom and a video API?</strong></h3><p>Zoom Meetings is a finished product you use. A video API — Agora, Daily, Twilio Video, or Zoom’s own Video SDK — is a set of building blocks you embed into your own product and pay for per minute of usage. One is for having meetings; the other is for building video features into software.</p><h3 id="is-on-premise-video-more-secure-than-zoom"><strong>Is on-premise video more secure than Zoom?</strong></h3><p>“More secure” isn’t quite the right frame. On-premise gives you data residency and jurisdictional control — the video stays on infrastructure you own — which regulated industries often require. Cloud tools like Zoom can be highly secure and compliant too. The real difference is who controls where the data lives, not security in the abstract.</p>]]></content:encoded></item><item><title><![CDATA[How Fleet Video Streaming Actually Works — The Architecture Between Vehicle and Command Centre]]></title><description><![CDATA[Cameras speak RTSP; browsers speak WebRTC. This deep dive walks the fleet video streaming architecture packet by packet — the RTSP-to-WebRTC bridge, the SFU that fans one feed out to many viewers, the latency budget, and the offline-recovery problem no SFU solves alone.]]></description><link>https://www.samvyo.com/blog/how-fleet-video-streaming-actually-works-the-architecture-between-vehicle-and-command-centre</link><guid isPermaLink="false">6a68784a8b45c3f0cd63a10c</guid><category><![CDATA[fleet video]]></category><category><![CDATA[video telematics]]></category><category><![CDATA[live streaming]]></category><category><![CDATA[edge ai]]></category><category><![CDATA[Video Conferencing Infrastructure]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 30 Jul 2026 06:48:40 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/07/edgeaitecnical.png" medium="image"/><content:encoded><![CDATA[<blockquote><em>If you arrived here from the</em><a href="https://www.samvyo.com/why-edge-ai-alone-cant-solve-fleet-video-and-what-the-cloud-layer-needs-to-do?ref=samvyo.com" rel="noreferrer"><em> business version</em></a><em>, you’re in the right place. That piece covered the “what” and the “why” — where edge stops and why a transport layer has to exist. This is the companion “how”: the same story at the packet level, for the engineer who has to build or evaluate it. No re-run of the business case — we pick up exactly where it left off.</em></blockquote><img src="https://www.samvyo.com/blog-admin1/content/images/2026/07/edgeaitecnical.png" alt="How Fleet Video Streaming Actually Works — The Architecture Between Vehicle and Command Centre"/><p>Here is the mental model most people start with: the dashcam streams video, the command-centre dashboard plays it, done. At the packet level, almost every word of that sentence is wrong. The camera doesn’t speak a protocol the browser understands. The vehicle’s uplink can’t serve more than one viewer. And “streams” quietly hides three separate network hops, each with its own failure mode. A working <strong>fleet video streaming architecture</strong> is precisely the set of components that make that naive sentence true anyway — despite the protocol mismatch, the constrained uplink, and the unreliable network of a vehicle doing 100 km/h.</p><p>This piece walks that media path leg by leg — the same discipline the <a href="https://centedge.io/rtmp-vs-srt-vs-webrtc-decision-framework/?ref=samvyo.com" rel="noreferrer"><em>RTMP vs SRT vs WebRTC</em></a> framework applies to streaming generally: don’t pick a protocol, understand each leg of the pipeline and choose deliberately at each one.</p><h2 id="why-the-edge-device-can%E2%80%99t-just-stream-at-the-packet-level"><strong>Why the Edge Device Can’t Just Stream (At the Packet Level)</strong></h2><p>The business version framed edge’s limits as capabilities it lacks. At the network layer, those limits are more concrete — and more absolute.</p><p><strong>Uplink asymmetry. </strong>Cellular connections are built for download, not upload. A moving vehicle’s usable uplink is a fraction of its downlink, and it fluctuates with signal, tower load, and speed. Continuous video upstream is already near the edge of what the radio can sustain.</p><p><strong>One origin, no fan-out. </strong>The device has a single radio and a single uplink. To serve N viewers directly it would have to upload N copies of the same stream — multiplying the one thing that’s already scarce. The fan-out has to happen somewhere with real bandwidth, which is not on the vehicle.</p><p><strong>Protocol mismatch. </strong>MDVRs and IP cameras emit RTSP/RTP, or a vendor-proprietary variant. No web browser can consume RTSP natively — there is no plugin era to fall back on anymore. The feed has to be translated before a browser can touch it.</p><p><strong>NAT and mobility. </strong>The vehicle sits behind carrier-grade NAT, and its IP address changes as it hands off between towers. You cannot simply “connect to the camera” — there's no stable, reachable address to connect to, which is <a href="https://samvyo.com/blog/nat-traversal-in-webrtc-why-the-call-connects-on-wi-fi-but-not-on-4g?ref=samvyo.com">why a WebRTC session that connects on Wi-Fi fails on a mobile carrier network</a>.</p><p>So before a single viewer sees anything, the feed has to be turned into something a browser speaks. That translation is the first real problem in the pipeline.</p><h2 id="the-rtsp-to-browser-problem"><strong>The RTSP-to-Browser Problem</strong></h2><p>Cameras speak RTSP/RTP. Browsers speak WebRTC (for real-time) or HLS/DASH (for buffered playback). There is no direct path between the two — RTSP assumes a persistent client that browsers don’t provide. Bridging the gap is unavoidable, and there are three ways to do it, each with a different latency cost.</p><p><strong>1. Transcode and repackage to HLS / LL-HLS. </strong>A server ingests the RTSP feed and re-segments it into HLS. It plays everywhere with zero client work, but latency lands at 2–8 seconds (LL-HLS pushes toward ~2s). Fine for “glance at the feed,” wrong for reacting to an incident as it happens.</p><p><strong>2. RTSP-to-WebRTC gateway. </strong>A gateway pulls the RTSP stream, unwraps the RTP media, and republishes it as WebRTC. Where the camera’s codec already matches (H.264 baseline is the common case), this is repackaging — not transcoding — so it stays sub-second. This is the right answer for live monitoring. The cost is running the gateway (per-stream or pooled) and handling codec alignment when a camera emits H.265 or something exotic, which forces a transcode.</p><p><strong>3. Native WebRTC / WHIP from the device. </strong>If the device — or an on-vehicle agent — can originate WebRTC directly via WHIP, you skip RTSP bridging entirely. Architecturally the cleanest path, but it depends on device capability you usually don’t control, since the camera vendor does.</p><p>Bridging gets one stream into one browser. But fleet monitoring is never one viewer — a dispatcher, a safety lead, and an insurer may all need the same feed at once. That’s a different problem, and it’s the reason the SFU exists.</p><h2 id="the-sfu-how-one-feed-reaches-many-viewers"><strong>The SFU: How One Feed Reaches Many Viewers</strong></h2><p>There are three ways to get a live stream from one source to many viewers, and only one of them survives contact with a fleet.</p><p><strong>Mesh (peer-to-peer). </strong>Every viewer connects directly to the source, so the source uploads one copy per viewer. It collapses past a handful of participants and is a non-starter on a vehicle uplink that can barely sustain one.</p><p><strong>MCU (Multipoint Control Unit). </strong>A server decodes every stream, mixes them into a single composite, and re-encodes it. That re-encode is CPU-expensive, adds latency, and throws away per-stream control. For fleet monitoring — where you want each vehicle as its own independently controllable feed — it’s the wrong tool.</p><p><strong>SFU (Selective Forwarding Unit). </strong>The server receives one upstream copy and selectively forwards the packets to each subscriber, with no re-encoding. Low added latency, far lighter CPU than an MCU, and it scales to many viewers. The vehicle uploads exactly once — to the SFU — and the SFU does the multiplication. mediasoup, Janus, LiveKit, and Jitsi Videobridge are all SFUs, and every serious real-time platform is built on this pattern.</p><p>One caveat worth stating plainly: an SFU is bandwidth-bound. Its egress is viewers × bitrate, so at fleet scale it needs horizontal scaling — multiple SFU nodes, routing, and sometimes <a href="https://samvyo.com/blog/sfu-scaling-clustering-cascading-and-where-the-bottleneck-moves?ref=samvyo.com">cascading between them, which moves the bottleneck rather than removing it</a>. In a fleet video streaming architecture this is the component that scales with your audience, not your fleet. It solves fan-out; it doesn’t make bandwidth free.</p><p>Fan-out solved. But “live” is a promise about time, and every component we’ve added spends some of it. So let’s account for the milliseconds.</p><h2 id="the-latency-budget-of-a-fleet-video-streaming-architecture"><strong>The Latency Budget of a Fleet Video Streaming Architecture</strong></h2><p>“Live” isn’t a binary — it’s a budget. Every leg of the path spends a slice of it, and whether the result is genuinely real-time depends on how you spend. Here’s a realistic glass-to-glass breakdown for the WebRTC path.</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    border: 1px solid rgba(128, 128, 128, 0.4);
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 10px 16px;
    color: inherit;
    background: transparent;
    vertical-align: top;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18);
    font-weight: 700;
  }
</style>
<table class="rate-table">
  <colgroup><col width="227"><col width="133"><col width="264"/></col></col></colgroup>
  <thead>
    <tr>
      <th>Leg</th>
      <th>Typical budget</th>
      <th>Where the time goes</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Capture + encode (device)</td>
      <td>30–100 ms</td>
      <td>Sensor readout and encoder settling</td>
    </tr>
    <tr>
      <td>Vehicle → ingest (cellular)</td>
      <td>50–150 ms</td>
      <td>First hop; jitter and tower handoff are the real risk</td>
    </tr>
    <tr>
      <td>Bridge (RTSP → WebRTC)</td>
      <td>10–50 ms</td>
      <td>Repackaging only; a transcode adds hundreds</td>
    </tr>
    <tr>
      <td>SFU forward</td>
      <td>5–20 ms</td>
      <td>Packet forwarding, no re-encode</td>
    </tr>
    <tr>
      <td>SFU → viewer (last mile)</td>
      <td>20–80 ms</td>
      <td>Depends on the viewer's own network</td>
    </tr>
    <tr>
      <td>Jitter buffer + decode/render</td>
      <td>50–150 ms</td>
      <td>Browser smooths jitter at the cost of delay</td>
    </tr>
    <tr>
      <td style="font-weight:700;">End-to-end (WebRTC path)</td>
      <td style="font-weight:700;">≈300–700 ms</td>
      <td style="font-weight:700;">"Live" that is actually live</td>
    </tr>
    <tr>
      <td>End-to-end (HLS path)</td>
      <td>2–8 s+</td>
      <td>Universal playback, but not real-time</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p>The takeaway isn’t the exact numbers — it’s the shape. The WebRTC path lands comfortably under a second. The moment you insert transcoding or HLS packaging into the live path, you blow the real-time budget by an order of magnitude. Protocol choice at the bridge is what decides whether “live” is a fact or a label.</p><p>But that budget assumes the network is there at all. On a moving vehicle, it frequently isn’t — and that’s where the honest hard problems live.</p><h2 id="the-hard-part-offline-rewind-and-recovery"><strong>The Hard Part: Offline, Rewind, and Recovery</strong></h2><p>Everything above assumes a live path from vehicle to viewer. When the vehicle loses coverage — a tunnel, a dead zone, a gap between towers — the live feed is simply gone. No SFU can forward packets that never arrived. This produces two problems that the streaming layer cannot solve on its own, and it’s worth being honest about them.</p><p><strong>Rewind. </strong>“Show me the last thirty seconds” assumes something stored those seconds. An SFU forwards packets in real time; it doesn’t keep a per-vehicle history. The frames you want to rewind to are on the device — which recorded them locally, exactly the thing edge is good at — not in the transport layer.</p><p><strong>Offline recovery. </strong>Retrieving footage from a coverage gap requires two things the SFU doesn’t provide: the device must have held that footage, and it must expose a footage-request path — a device-level API or command channel — that the platform can call once connectivity returns.</p><p>Here is the limitation stated plainly: rewind and offline recovery cannot be solved at the SFU layer alone. They require cooperation from the camera or MDVR — device-level access or a footage-request API — and that access is often controlled by the camera vendor, not the platform builder. It is the one part of a fleet video streaming architecture the transport layer cannot supply by itself. When the device grants it, you can stitch live streaming and on-demand recovery into a single experience. When it doesn’t, live monitoring and archived-footage retrieval remain two separate systems bolted together. Knowing which situation you’re in is the difference between an architecture that demos well and one that holds up on a highway.</p><p>Which is why choosing how to build this layer is less a feature comparison than a question of how much of the pipeline you want to own.</p><h2 id="how-teams-build-a-fleet-video-streaming-architecture"><strong>How Teams Build a Fleet Video Streaming Architecture</strong></h2><p>The business version compared these three paths on cost and fit. Here they are on architectural control — how much of the media path you assemble and operate yourself.</p><p><strong>Open-source media servers. </strong>mediasoup, Janus, or LiveKit give you the SFU; you assemble the bridge, signaling, TURN, recording, and scaling around it. mediasoup is a library you build an application on top of; LiveKit is closer to a batteries-included SFU with an SDK. Maximum control, maximum operational ownership. Right when the media path is core to your product and you have the specialists to run it.</p><p><strong>Cloud video APIs. </strong>Agora, Daily, or Cloudflare give you a cloud SFU and SDKs — fan-out and (sometimes) bridging as a service. You trade away control over where media routes, and RTSP-ingest support varies, so check whether the provider bridges RTSP for you or expects the device to originate WebRTC. Right when speed to production outweighs owning the routing.</p><p><strong>Commercial white-label platforms. </strong>Platforms in this category — Samvyo is one — deliver the SFU, the bridge, and recording as a deployable unit you run on-premise, or as a managed cloud deployment on AWS, DigitalOcean, or Hetzner, flat-licensed and embeddable under your brand. Right when the media path has to sit inside your own product and inside controlled infrastructure. Where it doesn’t fit: if you only need occasional clip pull, the edge upload you already have covers it — and if third-party cloud routing is acceptable, a full deployable stack is more than the problem requires.</p><p>Whichever path a team takes, the architecture underneath is the same shape — and that shape is the real takeaway.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Strip away the vendor names and a fleet video streaming architecture is four moving parts: a bridge that turns camera protocols into browser protocols, an SFU that turns one upstream into many downstreams, a latency budget spent carefully enough that “live” stays true, and a recovery path that admits the network won’t always be there. Edge owns the source. This layer owns everything between the source and the human watching. Get that division right, and each half does the job it’s actually built for.</p><h2 id="what%E2%80%99s-next"><strong>What’s Next?</strong></h2><p><strong><em>Want the decision-maker’s version — the “what” and the “why” without the packet-level detail? </em></strong>The companion business piece covers where edge stops, why this transport layer has to exist, and how to think about sourcing it — in language you can forward to a non-engineer stakeholder: <a href="https://samvyo.com/why-edge-ai-alone-cant-solve-fleet-video-and-what-the-cloud-layer-needs-to-do?ref=samvyo.com" rel="noreferrer"><strong>link to business version</strong>.</a></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><h3 id="can-you-stream-an-rtsp-camera-directly-to-a-web-browser"><strong>Can you stream an RTSP camera directly to a web browser?</strong></h3><p>No. Browsers don’t support RTSP natively, so a bridge is required — an RTSP-to-WebRTC gateway for sub-second latency, or a transcode-to-HLS path when you can tolerate several seconds of delay in exchange for universal playback.</p><h3 id="what-is-an-sfu-in-video-streaming"><strong>What is an SFU in video streaming?</strong></h3><p>A Selective Forwarding Unit is a media server that receives one upstream copy of a stream and forwards its packets to many subscribers without re-encoding. That makes it low-latency and far lighter on CPU than an MCU (which mixes and re-encodes), and it scales where peer-to-peer mesh cannot.</p><h3 id="how-do-you-achieve-sub-second-latency-in-fleet-video"><strong>How do you achieve sub-second latency in fleet video?</strong></h3><p>Keep a WebRTC path end-to-end: bridge RTSP to WebRTC by repackaging rather than transcoding, forward through an SFU, and keep HLS packaging out of the live path. Budgeted leg by leg, realistic glass-to-glass latency lands around 300–700 ms.</p><h3 id="why-can%E2%80%99t-the-vehicle-just-send-video-to-every-viewer-directly"><strong>Why can’t the vehicle just send video to every viewer directly?</strong></h3><p>A vehicle has one radio and one constrained cellular uplink. Sending a separate copy to each viewer multiplies the scarcest resource in the system. An SFU accepts one upstream copy from the vehicle and fans it out from a well-connected server instead.</p><h3 id="can-you-rewind-or-recover-offline-footage-through-the-streaming-layer"><strong>Can you rewind or recover offline footage through the streaming layer?</strong></h3><p>Not through the SFU alone. Live transport forwards packets in real time and keeps no per-vehicle history. Rewind and offline recovery depend on footage stored on the device and a device-level footage-request API to retrieve it once connectivity returns — access the camera vendor often controls.</p><h3 id="rtsp-to-webrtc-or-hls-%E2%80%94-which-for-live-fleet-monitoring"><strong>RTSP to WebRTC or HLS — which for live fleet monitoring?</strong></h3><p>WebRTC for real-time incident response, where sub-second latency matters. HLS or LL-HLS only when a multi-second delay is acceptable and you want the simplest, most universal playback. For monitoring an unfolding situation, WebRTC is the one that keeps “live” honest.</p>]]></content:encoded></item><item><title><![CDATA[Why Edge AI Alone Can’t Solve Fleet Video — And What the Cloud Layer Needs to Do]]></title><description><![CDATA[Modern dashcams run AI on the edge — but they can’t stream live to a command centre. This piece breaks down what edge does well, the three things it physically can’t do, and the fleet video infrastructure layer that fills the gap.]]></description><link>https://www.samvyo.com/blog/why-edge-ai-alone-cant-solve-fleet-video-and-what-the-cloud-layer-needs-to-do</link><guid isPermaLink="false">6a6877be8b45c3f0cd63a106</guid><category><![CDATA[fleet video]]></category><category><![CDATA[edge ai]]></category><category><![CDATA[video telematics]]></category><category><![CDATA[live streaming]]></category><category><![CDATA[Embedded WebRTC]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 30 Jul 2026 06:48:25 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/07/EdgeAIBusiness.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/07/EdgeAIBusiness.png" alt="Why Edge AI Alone Can’t Solve Fleet Video — And What the Cloud Layer Needs to Do"/><p><em>Your cameras got smart. Your command centre is still blind. Here’s the layer in between.</em><br><br>A modern truck already sees more than its driver does. The road-facing camera watches for tailgating and lane drift; the in-cab camera watches the driver for drowsiness and distraction; both flag events the instant they happen and save the clip — without sending a single frame anywhere. The hardware is genuinely intelligent. So here is the question that trips up nearly every operator building out their <strong>fleet video infrastructure</strong>: when a safety manager wants to <em>watch</em> truck 47 live, right now, as an incident unfolds — why can’t they?</br></br></p><p>The answer isn’t that the cameras are weak. It’s that live monitoring was never their job.</p><h2 id="what-edge-ai-actually-does-well-more-than-you-think"><strong>What Edge AI Actually Does Well (More Than You Think)</strong></h2><p>Before talking about what edge can’t do, it’s worth being precise about what it does — because it’s a lot, and any honest picture starts here. Modern MDVRs (mobile digital video recorders) and AI dashcams run inference directly on the device:</p><ul><li><strong>ADAS (advanced driver assistance) </strong>— detecting tailgating, lane departure, and forward-collision risk from the road-facing camera.</li><li><strong>DMS (driver monitoring) </strong>— detecting drowsiness, phone use, distraction, and smoking from the cabin-facing camera.</li><li><strong>Event capture </strong>— when something crosses a threshold, the device saves the relevant clip locally.</li><li><strong>Event upload </strong>— that clip, plus metadata like GPS, speed, and G-force, is pushed to a back office when connectivity allows.</li></ul><p>And it does all of this with three properties that are hard to beat: it works offline, because inference doesn’t need a network; it sips bandwidth, because you upload a 20-second event clip rather than a continuous stream; and the footage stays on the device until someone asks for it.</p><p>But notice what every one of those capabilities has in common. They happen after the fact, or in isolation — a clip, a flag, an upload. None of them puts a live human in the loop while something is still happening.</p><h2 id="the-three-things-edge-physically-can%E2%80%99t-do"><strong>The Three Things Edge Physically Can’t Do</strong></h2><p>This is where the ceiling sits — and it isn’t a missing feature. It’s a structural limit of a camera bolted to a moving vehicle with a cellular link. Three capabilities stay permanently outside its reach.</p><p><strong>1. Live multi-viewer streaming. </strong>An edge device can record continuously, but it cannot serve a live feed to several people at once. A dispatcher, a safety lead, and an insurer can’t all watch the same truck simultaneously in real time — the device has neither the uplink nor the fan-out logic to do it.</p><p><strong>2. Real-time remote diagnostics and interaction. </strong>Reviewing an uploaded clip tomorrow is not the same as seeing a situation as it develops and responding to it. Pulling a live view on demand — “show me that cabin now” — is a different capability than “here’s what happened an hour ago.”</p><p><strong>3. Command-centre monitoring at fleet scale. </strong>A control room watching a wall of live feeds — dozens or hundreds of vehicles, any one pullable to full screen the instant an alert fires — is not a bigger version of event upload. It’s a fundamentally different architecture.</p><p>These aren’t failures of edge AI. They’re simply a different job — one that lives in a different layer of the system.</p><h2 id="orthogonal-not-superior-why-this-isn%E2%80%99t-%E2%80%9Cedge-vs-cloud%E2%80%9D"><strong>Orthogonal, Not Superior: Why This Isn’t “Edge vs Cloud”</strong></h2><p>It’s tempting to read all this as “edge is limited, so move to the cloud.” That framing is wrong, and it leads to bad architecture.</p><p>Edge and the cloud layer aren’t competing for the same job. Edge AI belongs at the source: it’s the only place inference can happen instantly, offline, and without shipping video anywhere. The cloud — or on-prem — layer belongs in the middle: it’s the only place that can carry live media from a moving vehicle to human eyes and fan it out to many of them at once.</p><p>A real fleet needs both. Take away edge and you drown in bandwidth and lose offline detection. Take away the transport layer and your smart cameras can detect everything and show it to no one, live.</p><p>So if that middle layer’s job is to move live video from a moving vehicle to a command centre — what does it actually have to do to earn its place?</p><h2 id="what-fleet-video-infrastructure-has-to-get-right"><strong>What Fleet Video Infrastructure Has to Get Right</strong></h2><p>The transport layer between the camera and the command centre — the <strong>fleet video infrastructure</strong> proper — has a specific and demanding job description. Five things it has to handle.</p><p><strong>Survive the network a moving vehicle actually has. </strong>Cellular coverage on a highway drops, hands off between towers, and varies wildly. The layer has to hold a live session together across all of that, <a href="https://samvyo.com/blog/webrtc-bandwidth-estimation-why-your-call-downgrades-before-it-drops?ref=samvyo.com">degrading gracefully — downgrading quality before the call drops</a> instead of failing outright.</p><p><strong>Fan one feed out to many viewers. </strong>One camera, several simultaneous watchers, without asking the vehicle to upload the same stream once per viewer. The multiplication happens in the infrastructure, not on the constrained uplink.</p><p><strong>Keep latency low enough to call it “live.” </strong>A feed that is eight seconds behind reality is useless for an unfolding incident. Real-time monitoring needs sub-second delivery, not “eventually.”</p><p><strong>Scale across the whole fleet. </strong>Ten vehicles is a demo. A thousand vehicles, each potentially streaming, with a control room watching any subset, is an infrastructure problem — concurrency, routing, and regional distribution all at once.</p><p><strong>Sit on top of the cameras you already have. </strong>No fleet rips out its MDVRs to add live view. The layer has to work with the existing hardware and the protocols those cameras already speak.</p><p>Each of these is a hard problem on its own. Which is why the question of <em>how</em> a team gets this layer — rather than what it does — is worth understanding on its own terms.</p><h2 id="how-this-layer-gets-sourced-three-approaches"><strong>How This Layer Gets Sourced: Three Approaches</strong></h2><p>There’s no single way to add live video infrastructure to a fleet platform. Broadly, teams take one of three paths, and each fits a different kind of company.</p><p><strong>Open-source media servers. </strong>Projects like mediasoup, Janus, or LiveKit give you the core building blocks of a streaming layer for no license fee. They suit engineering-heavy teams that want full control and have the specialists to run a distributed media system in production. What you take on is the maintenance: scaling, monitoring, patching, and the on-call reality of keeping live infrastructure alive. Best when live video transport is close to your core product and you have the team to own it.</p><p><strong>Cloud video APIs. </strong>Providers such as Agora, Daily, or Cloudflare’s real-time stack let you integrate live streaming through an SDK, running on their cloud, typically billed per participant-minute. They suit teams that need to ship fast and whose data can live on a third-party cloud. The trade-offs to weigh are where the video data resides and how per-minute cost behaves as a fleet grows and streams more often — noting that <a href="https://samvyo.com/blog/why-your-sfu-bandwidth-cost-scales-with-viewers-not-publishers?ref=samvyo.com">the bill tracks the number of viewers, not the number of vehicles streaming</a>.</p><p><strong>Commercial white-label platforms. </strong>Platforms in this category — Samvyo is one — provide the streaming layer as a deployable product you run on-premise, or as a managed cloud deployment on AWS, DigitalOcean, or Hetzner, usually under flat licensing and embeddable under your own brand. They suit telematics vendors that need live video inside their own product, want the media to stay within controlled infrastructure, and prefer a cost that doesn’t climb with every added stream. Where this approach doesn’t fit: if you have no live-monitoring requirement, a small vehicle count, or you’re only moving occasional event clips, a full infrastructure platform is more than the problem needs — the edge upload you already have is the right tool.</p><p>Which path fits depends entirely on what your platform is for. But whichever one a team chooses, the reason the choice exists at all comes back to the same distinction we started with.</p><h2 id="the-bottom-line"><strong>The Bottom Line</strong></h2><p>Edge AI made cameras intelligent. It did not make them live. A dashcam can tell you a driver looked drowsy at 3:12 PM and hand you the clip — but it can’t put a safety manager in the passenger seat, watching, while the truck is still on the road. That gap isn’t a defect to be fixed at the edge. It’s a job for a different layer.</p><p>Understanding fleet video infrastructure starts with holding those two things apart: detection lives at the source, live transport lives in the middle, and a fleet that wants both real-time intelligence and real-time visibility needs each doing the job it’s actually built for.</p><h2 id="what%E2%80%99s-next"><strong>What’s Next?</strong></h2><p><strong><em>Want the engineering-level, architecture-first view of this layer? </em></strong>The companion technical deep-dive walks through the SFU that handles multi-viewer fan-out, how RTSP and on-vehicle camera feeds get bridged to a web browser, and the real latency budget from vehicle to command centre — piece by piece: <a href="https://www.samvyo.com/how-fleet-video-streaming-actually-works-the-architecture-between-vehicle-and-command-centre?ref=samvyo.com" rel="noreferrer"><strong>link to the technical version</strong>.</a></p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><h3 id="can-edge-ai-cameras-stream-live-video"><strong>Can edge AI cameras stream live video?</strong></h3><p>In a limited way. Most AI dashcams and MDVRs are built to detect events on-device and upload short clips, not to sustain a continuous live feed to multiple viewers. A device may support an on-demand live pull, but serving many simultaneous watchers, at low latency, across a fleet is the job of a separate video transport layer — not the camera itself.</p><h3 id="what-is-fleet-video-infrastructure"><strong>What is fleet video infrastructure?</strong></h3><p>It’s the layer that carries live and recorded video between vehicle cameras and the people who need to see it — handling streaming, multi-viewer fan-out, low-latency delivery, and scale across many vehicles. Edge devices handle on-vehicle detection and recording; the infrastructure layer handles moving that video, live, to a command centre or dashboard.</p><h3 id="why-can%E2%80%99t-a-dashcam-stream-to-multiple-viewers-at-once"><strong>Why can’t a dashcam stream to multiple viewers at once?</strong></h3><p>Because multiplying a single feed to many viewers — “fan-out” — requires a server in the middle, and the vehicle’s cellular uplink can’t practically upload the same stream once per viewer. A camera can originate one stream; distributing it to many watchers is handled by infrastructure between the vehicle and the viewers.</p><h3 id="edge-ai-vs-cloud-video-for-fleets-%E2%80%94-what%E2%80%99s-the-difference"><strong>Edge AI vs cloud video for fleets — what’s the difference?</strong></h3><p>Edge AI runs inference on the device — detecting driver and road events instantly, offline, without sending video anywhere. The cloud or on-prem video layer carries live media from the vehicle to human viewers and distributes it at scale. They’re complementary: edge is for detection at the source, the video layer is for live visibility. Neither replaces the other.</p><h3 id="do-i-need-to-replace-my-cameras-to-add-live-streaming"><strong>Do I need to replace my cameras to add live streaming?</strong></h3><p>Generally no. A well-designed video transport layer works on top of the MDVRs and cameras you already run, using the protocols those devices already speak. Replacing hardware is usually unnecessary to add live view — the missing piece is the layer between the camera and the viewer.</p><h3 id="what-latency-is-acceptable-for-live-fleet-monitoring"><strong>What latency is acceptable for live fleet monitoring?</strong></h3><p>For watching an incident as it unfolds, sub-second to low-single-digit-second latency is the practical target. Anything approaching the multi-second delays typical of broadcast-style streaming is too far behind reality to act on — which is why real-time monitoring and after-the-fact clip review are different technical problems.</p>]]></content:encoded></item><item><title><![CDATA[Per-Minute Video Pricing at Scale: What Enterprise Teams Actually Pay]]></title><description><![CDATA[Per-minute video pricing powers most video APIs. At enterprise scale — 500 concurrent users — it costs $25,000+/month. This article breaks down real math from Agora, ZegoCloud, and Dyte, what building your own costs, and what alternative pricing models exist.]]></description><link>https://www.samvyo.com/blog/per-minute-video-pricing-at-scale-what-enterprise-teams-actually-pay</link><guid isPermaLink="false">6a2144428b45c3f0cd63a020</guid><category><![CDATA[build vs buy RTC]]></category><category><![CDATA[cost-benefit analysis]]></category><category><![CDATA[Video Conferencing Infrastructure]]></category><category><![CDATA[WebRTC]]></category><category><![CDATA[pricing comparisions]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 04 Jun 2026 12:09:06 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/06/ChatGPT-Image-Jun-4--2026--02_57_19-PM.png" medium="image"/><content:encoded><![CDATA[<hr><img src="https://www.samvyo.com/blog-admin1/content/images/2026/06/ChatGPT-Image-Jun-4--2026--02_57_19-PM.png" alt="Per-Minute Video Pricing at Scale: What Enterprise Teams Actually Pay"/><p>Per-minute billing is the standard pricing model across the real-time video API industry. Agora, ZegoCloud, Dyte, Daily.co, and most other major providers charge based on the total participant-minutes your platform consumes. The model is straightforward: one user connected to a call for one minute equals one participant-minute. Your monthly bill is the sum of all participant-minutes multiplied by the provider’s rate.</p><p>For startups and small teams, Per-minute billing is what enables them to ship video calling in their app without a five-figure infrastructure contract. But pricing models that work at one scale don’t always work at another. This article breaks down how per-minute billing works, what it costs at enterprise scale with real math, what building your own infrastructure costs, and what alternative pricing models exist — so you can make an informed decision for your specific situation. Let’s start with the basics.</p><h2 id="what-is-per-minute-video-pricing-in-video-infrastructure"><strong>What Is Per-Minute Video Pricing in Video Infrastructure?</strong></h2><p>Per-minute billing charges you based on participant-minutes: the total time each participant spends connected to a video or audio session. If 4 people are on a 30-minute call, that’s 120 participant-minutes billed.</p><p>Most providers calculate usage by counting subscribed streams. In a group call where User A watches User B and User C’s video, User A is consuming 2 video streams and is billed for both. Some providers have moved to simpler per-user billing (counting from join to leave regardless of streams), but the core mechanic remains: more users, more minutes, higher bill.</p><p>The rates are modest in isolation. Here’s what the major providers charge:</p><p/>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    width: 100%;
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 6px 10px;
    color: inherit;            /* matches your theme — light or dark */
    background: transparent;
    text-align: left;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18); /* neutral tint, safe on any bg */
    font-weight: 700;
  }
  .rate-table tbody td:first-child {
    font-weight: 700;
  }
</style>

<table class="rate-table">
  <colgroup>
    <col width="25%">
    <col width="25%">
    <col width="25%">
    <col width="25%">
  </col></col></col></col></colgroup>
  <thead>
    <tr>
      <th>Provider</th>
      <th>Audio Rate</th>
      <th>Video HD (720p)</th>
      <th>Video Full HD</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>ZegoCloud</td>
      <td>$0.99/1K min</td>
      <td>$3.99/1K min</td>
      <td>N/A</td>
    </tr>
    <tr>
      <td>Agora</td>
      <td>$0.99/1K min</td>
      <td>$3.99/1K min</td>
      <td>$8.99/1K min</td>
    </tr>
    <tr>
      <td>Dyte</td>
      <td>$0.001/user/min</td>
      <td>$0.004/user/min</td>
      <td>N/A</td>
    </tr>
    <tr>
      <td>Daily.co</td>
      <td>$0.00099/user/min</td>
      <td>$0.004/user/min</td>
      <td>N/A</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p/><p>These numbers look small on a per-call basis. But they compound at volume. So where exactly does per-minute billing show up in real-world products?</p><h2 id="where-per-minute-video-pricing-shows-up"><strong>Where Per-Minute Video Pricing Shows Up?</strong></h2><p>Per-minute billing isn’t specific to one industry. It applies to every product that uses real-time video or voice at scale:</p><p><strong>Video KYC: </strong>Banks verify customer identity via live video. Calls are short (5–15 minutes) but high-volume — a mid-size bank may process 500–2,000 verifications daily.</p><p><strong>Telehealth: </strong>Doctors conduct 15–30 minute 1:1 consultations. Hospital networks running hundreds of concurrent consultations consume thousands of participant-minutes per hour.</p><p><strong>EdTech: </strong>Live classes with 30–500 students, 1–2 hours each. Long sessions and large group sizes make education one of the highest-cost per-minute use cases.</p><p><strong>Enterprise Meetings: </strong>Team standups, cross-department syncs, leadership reviews, client presentations. Mixed video/audio usage across 5–50 participants per session.</p><p><strong>Contact Centers: </strong>Video-assisted support and screen-sharing. Individually short (10–20 min), but thousands of sessions daily at high-volume operations.</p><p><strong>Social &amp; Live Streaming: </strong>Live audio rooms, dating apps, social video. Usage is unpredictable — a viral moment can multiply participant-minutes overnight.</p><p>The common thread: per-minute billing creates a direct, linear relationship between product usage and infrastructure cost. Whether that’s a problem depends on your scale. Let’s put actual numbers on it.</p><h2 id="the-real-math-what-enterprise-teams-actually-pay-per-month"><strong>The Real Math: What Enterprise Teams Actually Pay Per Month</strong></h2><p>Below are two realistic enterprise scenarios using the publicly available rates shown above.</p><h3 id="scenario-1-telehealth-platform-with-500-concurrent-doctors"><strong>Scenario 1: Telehealth Platform with 500 Concurrent Doctors</strong></h3><p>Configuration: 500 doctors, each conducting 12 consultations per day, average 20 minutes, 26 working days/month. 1:1 video calls (doctor + patient = 2 participants). 720p HD.</p><p>Monthly participant-minutes: 500 × 12 × 20 × 2 × 26 = 6,240,000.</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    width: 100%;
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 6px 10px;
    color: inherit;            /* matches your theme — light or dark */
    background: transparent;
    text-align: left;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18); /* neutral tint, safe on any bg */
    font-weight: 700;
  }
  .rate-table tbody td:first-child {
    font-weight: 700;
  }
</style>

<table class="rate-table">
  <colgroup>
    <col width="24%">
    <col width="21%">
    <col width="21%">
    <col width="17%">
    <col width="17%">
  </col></col></col></col></col></colgroup>
  <thead>
    <tr>
      <th>Provider</th>
      <th>Video Rate</th>
      <th>Audio Rate</th>
      <th>Monthly Cost</th>
      <th>Annual Cost</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>ZegoCloud</td>
      <td>$3.99/1K min</td>
      <td>$0.99/1K min</td>
      <td>$24,898</td>
      <td>$298,771</td>
    </tr>
    <tr>
      <td>Agora (HD)</td>
      <td>$3.99/1K min</td>
      <td>$0.99/1K min</td>
      <td>$24,898</td>
      <td>$298,771</td>
    </tr>
    <tr>
      <td>Agora (Full HD)</td>
      <td>$8.99/1K min</td>
      <td>$0.99/1K min</td>
      <td>$56,098</td>
      <td>$673,171</td>
    </tr>
    <tr>
      <td>Dyte</td>
      <td>$0.004/user/min</td>
      <td>$0.001/user/min</td>
      <td>$24,960</td>
      <td>$299,520</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p/><p>At 720p, roughly $25,000/month across providers. At Full HD on Agora, $56,000/month — over $670,000 annually. That’s video minutes alone, before recording, storage, or any add-ons.</p><p>But telehealth is high-concurrency, all-day usage. What about a more common enterprise scenario where meetings are shorter and not everyone has their camera on?</p><h3 id="scenario-2-3000-person-enterprise-with-mixed-meeting-culture"><strong>Scenario 2: 3,000-Person Enterprise with Mixed Meeting Culture</strong></h3><p>Configuration: A 3,000-employee company runs a mix of daily meetings across departments. 22 working days/month. Video at 720p HD where cameras are on.</p><p><strong>120 team standups/scrums: </strong>10 people, 20 minutes. 6 have video on, 4 are audio-only.</p><p><strong>30 cross-functional project syncs: </strong>15 people, 45 minutes. 8 on video, 7 audio-only.</p><p><strong>8 client-facing presentations: </strong>12 people (internal + external), 60 minutes. 8 on video, 4 audio-only.</p><p><strong>4 leadership reviews: </strong>20 people, 90 minutes. 6 on video, 14 audio-only.</p><p>Daily breakdown: 31,200 video minutes + 26,010 audio minutes = 57,210 participant-minutes/day.</p><p>Monthly totals: 686,400 video minutes + 572,220 audio minutes.</p><p/>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    width: 100%;
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 6px 10px;
    color: inherit;            /* matches your theme — light or dark */
    background: transparent;
    text-align: left;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18); /* neutral tint, safe on any bg */
    font-weight: 700;
  }
  .rate-table tbody td:first-child {
    font-weight: 700;
  }
</style>

<table class="rate-table">
  <colgroup>
    <col width="24%">
    <col width="21%">
    <col width="21%">
    <col width="17%">
    <col width="17%">
  </col></col></col></col></col></colgroup>
  <thead>
    <tr>
      <th>Provider</th>
      <th>Video Cost</th>
      <th>Audio Cost</th>
      <th>Monthly Total</th>
      <th>Annual Total</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>ZegoCloud</td>
      <td>$2,739</td>
      <td>$566</td>
      <td>$3,305</td>
      <td>$39,663</td>
    </tr>
    <tr>
      <td>Agora (HD)</td>
      <td>$2,739</td>
      <td>$566</td>
      <td>$3,305</td>
      <td>$39,663</td>
    </tr>
    <tr>
      <td>Agora (Full HD)</td>
      <td>$6,171</td>
      <td>$566</td>
      <td>$6,737</td>
      <td>$80,847</td>
    </tr>
    <tr>
      <td>Dyte</td>
      <td>$2,746</td>
      <td>$572</td>
      <td>$3,318</td>
      <td>$39,814</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p/><p>At HD, $3,300/month — $40,000 annually. At Full HD, $6,700/month — nearly $81,000/year. And this is a company where most people aren’t even on video. Flip to a video-mandatory culture and these numbers climb significantly. The rates are the same as the telehealth scenario ($3.99/1K video min, $0.99/1K audio min) — it’s the usage volume that drives the difference.</p><p>These are base costs. Most providers charge separately for add-ons that are standard in enterprise deployments. Let’s look at what sits on top.</p><h2 id="the-costs-that-sit-on-top-of-per-minute-rates"><strong>The Costs That Sit on Top of Per-Minute Rates</strong></h2><p>Cloud recording adds $1.49–$13.49 per 1,000 minutes depending on resolution (Agora’s published rates). TURN server / cloud proxy access starts at $500/month for 200 peak concurrent users. Cloud storage for recorded content is extra. For regulated use cases like vKYC (where every call must be recorded) or telehealth (medical record archiving), recording and storage can add 30–50% on top of the base bill.</p><p>AI features like real-time transcription or voice analysis are optional add-ons, typically billed separately — Agora’s speech-to-text runs $16.99/1K minutes. Not every deployment needs them, but factor them in if your use case does.</p><p>When you stack recording, TURN, storage, and support on top of the base rate, the all-in cost is typically 1.5x to 2.5x the headline per-minute number. When enterprise CTOs see these numbers, the first instinct is often: “WebRTC is open source. We’ll build our own.” It’s a rational thought. Here’s what the reality looks like.</p><h2 id="how-much-it-costs-to-build-video-infrastructure-yourself"><strong>How Much It Costs to Build Video Infrastructure Yourself</strong></h2><p>WebRTC is open-source and royalty-free. The technology is free. The engineering to make it production-grade is not. A basic proof-of-concept — two users on a browser call — takes a weekend. A production-grade platform with an SFU, signaling, TURN/STUN, recording, and adaptive bitrate costs $500,000–$2,000,000 to build from scratch. A more modest SDK-based approach (building on mediasoup or LiveKit) runs $50,000–$300,000.</p><p>The talent alone is expensive. WebRTC sits at the intersection of networking, codec engineering, browser APIs, and distributed systems. Specialists command $150,000–$250,000/year in North America. A minimum team of 2–3 engineers plus DevOps puts you at $400,000–$750,000/year in salary.</p><p>Then there’s the non-commercial effort that doesn’t show up on a spreadsheet. Browser compatibility is a moving target — Chrome, Safari, Firefox, and Edge each handle WebRTC differently, and updates can break things without warning. NAT traversal across corporate firewalls is a deep, ongoing challenge. Congestion control for users on unreliable networks takes months to tune. Operational maintenance runs 15–20 hours/month of monitoring, patching, and firefighting.</p><p>Scalability is the part most teams underestimate. Each video session consumes significant CPU, memory, and bandwidth. The system works at 50 concurrent sessions, starts struggling at 200, and needs a partial rewrite to handle 1,000 — <a href="https://samvyo.com/blog/scaling-video-cost-what-happens-when-one-media-server-isnt-enough?ref=samvyo.com">what actually happens when one media server isn't enough </a>is the part the build estimate never includes. Horizontal scaling across SFU instances requires load balancing, session migration, and geo-distribution — none of which come for free.</p><p>Five-year total cost of ownership: $1.5M–$7M for a from-scratch build, $650K–$3.5M for an SDK-based integration.</p><h3 id="who-it-suits"><strong>Who It Suits</strong></h3><p>Building your own makes sense when video IS your core product — the thing you’re selling, not a feature inside something else. If you’re a video conferencing company, a telehealth platform where video quality is your competitive moat, or a media company building live streaming, owning the stack gives you control that no third-party can match. You need the team, the budget, and the 12–24 month runway — but if video is what you sell, the investment pays back in product control and margin ownership.</p><p>For everyone else — companies where video is a feature inside a larger product — building from scratch is usually a distraction from what actually makes the business money. So what are the other options?<br/></p><hr><h2 id="alternative-pricing-models-for-video-infrastructure"><strong>Alternative Pricing Models for Video Infrastructure</strong></h2><p>Per-minute billing is the most common model, but not the only one. Here are the other pricing structures and who each serves best.</p><h3 id="flat-licensing"><strong>Flat Licensing</strong></h3><p>You pay a fixed fee — monthly or annually — regardless of participant-minutes consumed. Your cost is a flat line, not a curve. Samvyo uses this model: a single negotiable license with unlimited calls, on-premise deployment, and full white-label capability.</p><p>Flat licensing becomes cheaper than per-minute billing once you cross a usage threshold — typically around 100–200 concurrent users. Below that, per-minute is more efficient because you only pay for what you use. Above it, flat licensing wins, and the gap widens with every additional user. It suits enterprises with high, predictable usage and finance teams that need a fixed budget number.</p><h3 id="per-user-seat-based-pricing"><strong>Per-User / Seat-Based Pricing</strong></h3><p>You pay per named user or host, regardless of usage. Zoom’s business plans work this way. This model is common in UCaaS products rather than embeddable APIs. It suits organizations with uniform usage per user. It becomes inefficient when usage varies widely — you pay the same for a power user and someone who barely logs in.</p><h3 id="bandwidth-based-pricing"><strong>Bandwidth-Based Pricing</strong></h3><p>You pay based on data transferred rather than time. LiveKit prices at $0.18/GB after a free tier. This correlates cost with actual server resource consumption. It suits technical teams who can optimize encoding (resolution, bitrate, codec) to control costs directly — provided they know that <a href="https://samvyo.com/blog/why-your-sfu-bandwidth-cost-scales-with-viewers-not-publishers?ref=samvyo.com">the GB count is set by viewers, not publishers</a>.</p><h3 id="open-source-zero-license-cost"><strong>Open Source (Zero License Cost)</strong></h3><p>Jitsi, LiveKit, and mediasoup are free. Your costs are servers, bandwidth, and engineering. As covered above, the engineering overhead is substantial, but for teams with the capacity, this offers complete cost control and zero vendor lock-in. It’s also a common starting point for companies that later migrate to a commercial platform when maintenance outweighs savings.</p><p>Now that you know the models, how do you decide which one fits your situation?</p><h2 id="how-to-evaluate-what%E2%80%99s-right-for-your-scale"><strong>How to Evaluate What’s Right for Your Scale</strong></h2><p>Not every organization needs to move off per-minute billing. Here’s a framework:</p><p><strong>Under 50 concurrent users: </strong>Per-minute billing is likely the most efficient model. Free tiers may cover you entirely. Don’t over-optimize.</p><p><strong>50–200 concurrent users: </strong>Start running the math. Compare your actual monthly spend against flat licensing. You’re approaching the crossover point.</p><p><strong>200–500 concurrent users: </strong>Per-minute costs are a material budget line item. Evaluate flat licensing, on-prem, or OEM platforms. The savings typically justify switching effort.</p><p><strong>500+ concurrent users: </strong>If you’re still on per-minute billing, you’re likely overpaying relative to flat licensing alternatives.</p><p>Beyond cost, three factors matter. <strong>Data sovereignty</strong>: regulated industries (banking, healthcare, government) may need on-premise deployment, which not all per-minute providers offer. <strong>Predictability</strong>: per-minute fluctuates with usage; flat licensing gives finance a fixed number. <strong>Scalability economics</strong>: does your video cost grow linearly with your product’s growth, or stay flat? That answer shapes whether video is a cost center or a fixed cost that improves margins as you scale.</p><hr><h2 id="what%E2%80%99s-next"><strong>What’s Next?</strong></h2><p>If you’re currently on per-minute billing and running 200+ concurrent users, it’s worth running your own numbers through the math above. Calculate your actual monthly participant-minutes, apply the rates, add recording and TURN costs, and see where you land.</p><p>If the number surprises you, <a href="https://samvyo.com/?ref=samvyo.com" rel="noreferrer">Samvyo</a> offers a free infrastructure cost comparison where we map your current usage against our flat licensing model — no commitment, just the math. Book a <a href="https://samvyo.com/contact?ref=samvyo.com" rel="noreferrer">30-minute walkthrough</a> and bring your usage numbers. Or if you are looking for a detailed demo, book a <a href="https://samvyo.com/demo?ref=samvyo.com" rel="noreferrer">demo</a>.</p><hr><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><h3 id="what-is-per-minute-billing-in-video-apis"><strong>What is per-minute billing in video APIs?</strong></h3><p>Per-minute billing charges based on total participant-minutes consumed on your platform. One user on a call for one minute equals one participant-minute. Rates typically range from $0.99–$3.99 per 1,000 minutes for audio and $3.99–$8.99 for video. Platforms like Samvyo use an alternative model — flat licensing — where usage volume doesn’t affect cost.</p><h3 id="how-much-does-enterprise-video-infrastructure-cost-per-month"><strong>How much does enterprise video infrastructure cost per month?</strong></h3><p>On per-minute billing, a 3,000-person enterprise running mixed meetings pays $3,300–$6,700/month. A telehealth platform with 500 concurrent doctors pays $25,000–$56,000/month. Recording, TURN, and storage add 1.5x–2.5x on top. Flat-licensed platforms like Samvyo decouple cost from usage, keeping the monthly number fixed regardless of volume.</p><h3 id="when-does-per-minute-billing-stop-making-sense"><strong>When does per-minute billing stop making sense?</strong></h3><p>The crossover point is typically 100–200 concurrent users. Below that, per-minute billing is efficient — you pay only for what you use. Above it, flat licensing models become significantly cheaper. Samvyo’s flat licensing, for example, keeps cost constant whether you run 200 or 2,000 concurrent sessions.</p><h3 id="is-it-cheaper-to-build-your-own-video-infrastructure"><strong>Is it cheaper to build your own video infrastructure?</strong></h3><p>Building from scratch costs $500K–$2M upfront with WebRTC specialists at $150K–$250K/year. Five-year TCO ranges from $1.5M–$7M. It makes sense when video is your core product. For companies where video is a feature inside a larger product, managed platforms like Samvyo offer enterprise-grade infrastructure without the build-and-maintain burden.</p><h3 id="what-is-flat-licensing-for-video-infrastructure"><strong>What is flat licensing for video infrastructure?</strong></h3><p>Flat licensing means you pay a fixed fee for unlimited video usage regardless of participant-minutes. Your cost stays constant as usage grows. Samvyo uses this model — one negotiable license price that includes unlimited calls, on-premise deployment, and white-label capability. It becomes significantly cheaper than per-minute billing at enterprise scale.</p><h3 id="what-does-on-premise-video-deployment-mean"><strong>What does on-premise video deployment mean?</strong></h3><p>On-premise deployment means the video platform runs entirely on servers you own and control — data never leaves your network. Samvyo supports full on-premise deployment, which is required by regulators in banking (RBI video KYC), healthcare (HIPAA), and government where sensitive data must stay within the organization’s infrastructure.</p><h3 id="can-zoom-or-microsoft-teams-be-used-as-embeddable-video-infrastructure"><strong>Can Zoom or Microsoft Teams be used as embeddable video infrastructure?</strong></h3><p>Zoom and Teams are end-user communication products, not embeddable infrastructure. Neither supports full on-premise deployment, deep white-labeling, or OEM redistribution. For companies that need to embed video into their own product under their own brand, platforms like Samvyo are purpose-built for that use case — with SDKs, white-label capability, and on-prem deployment.</p></hr></hr></hr></hr>]]></content:encoded></item><item><title><![CDATA[Open-Source Video Infrastructure for Enterprise: Why Companies Outgrow Jitsi, LiveKit, and Self-Hosted WebRTC]]></title><description><![CDATA[Open-source video infrastructure like Jitsi and LiveKit is a smart starting point. At 250 concurrent sessions, it costs $90,000–$144,000/year to maintain. Real costs, scaling limits, missing features, and what the migration path looks like for enterprises.
]]></description><link>https://www.samvyo.com/blog/open-source-video-infrastructure-for-enterprise-why-companies-outgrow-jitsi-livekit-and-self-hosted-webrtc</link><guid isPermaLink="false">6a2129888b45c3f0cd639ff6</guid><category><![CDATA[Open-Source Video Infrastructure]]></category><category><![CDATA[Video Conferencing Infrastructure]]></category><category><![CDATA[WebRTC]]></category><category><![CDATA[WebRTC vs proprietary SDKs]]></category><dc:creator><![CDATA[Jaya Vardhan]]></dc:creator><pubDate>Thu, 04 Jun 2026 11:57:13 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/06/outgrow.png" medium="image"/><content:encoded><![CDATA[<hr><img src="https://www.samvyo.com/blog-admin1/content/images/2026/06/outgrow.png" alt="Open-Source Video Infrastructure for Enterprise: Why Companies Outgrow Jitsi, LiveKit, and Self-Hosted WebRTC"/><p>Thousands of companies run self-hosted video infrastructure on open-source platforms. Universities run Jitsi for faculty meetings. Privacy-conscious teams in Europe host their own video to stay outside US cloud jurisdiction. Startups use LiveKit to ship real-time features without a five-figure vendor contract. At small-to-mid scale — under 50 concurrent users — open-source video does exactly what it promises: free, private, functional. It’s one of the most rational infrastructure decisions a growing company can make.</p><p>This article is about what happens when it stops being enough. Not because the software is bad — it isn’t — but because the demands of an enterprise deployment are fundamentally different from the demands of a team tool. Let’s look at where those cracks actually appear.</p><h2 id="where-enterprises-hit-the-ceiling-with-open-source-video-infrastructure"><strong>Where Enterprises Hit the Ceiling with Open-Source Video Infrastructure</strong></h2><h3 id="first-the-scale-grows"><strong>First, the Scale Grows</strong></h3><p>A single Jitsi Videobridge instance handles about 40–70 participants with video on, roughly 100 at the absolute limit. LiveKit’s SFU performs better per node, but still requires multi-server orchestration at enterprise scale. For an internal team tool, these limits are invisible. For a platform serving customers — hundreds of concurrent sessions across regions — you hit them fast.</p><p>The fix is horizontal scaling: multiple media server instances behind load balancers, region-aware routing, autoscaling infrastructure — and <a href="https://samvyo.com/blog/sfu-scaling-clustering-cascading-and-where-the-bottleneck-moves?ref=samvyo.com">the bottleneck moves as you cluster and cascade</a>. This isn’t a configuration change. It’s a full infrastructure project. And the moment you start that project, you’re no longer maintaining a simple deployment — you’re running a distributed system. That takes people.</p><h3 id="then-it%E2%80%99s-not-a-one-person-job-anymore"><strong>Then It’s Not a One-Person Job Anymore</strong></h3><p>At small scale, one DevOps engineer handles your Jitsi or LiveKit deployment alongside other responsibilities. At enterprise scale — multi-server clusters, recording pipelines, TURN servers, monitoring — it becomes a dedicated role. Browser updates break call quality without warning. Security patches need tracking against upstream releases. WebRTC itself is a moving target across Chrome, Safari, Firefox, and Edge.</p><p>Enterprise deployments typically require 15–20 hours per month of dedicated engineering just for maintenance, monitoring, and incident response. Add a partial DevOps engineer allocation and you’re at $5,000–$8,000 per month in engineering cost. Put simply: the “free” platform now costs your company $60,000–$100,000 per year in engineering time alone — before you count a single server.</p><h3 id="then-you-realize-critical-features-are-missing"><strong>Then You Realize Critical Features Are Missing</strong></h3><p>Open-source video platforms were built as conferencing tools, not as embeddable enterprise infrastructure. The gaps surface as your use case matures:</p><p><strong>Recording: </strong>Jitsi’s Jibri records by running a headless Chrome instance that renders the meeting and captures the screen. Each Jibri instance records exactly one meeting at a time. Scaling to dozens of concurrent recordings means dozens of dedicated Jibri instances, each consuming 4 vCPU and 16GB RAM. When Jibri fails mid-recording under load, the recording is lost with no fallback. LiveKit’s Egress service is more modern but still requires its own infrastructure management.</p><p><strong>Compliance and Audit Trails: </strong>Regulated industries need call-level logs: who joined, when, from where, what was shared, where the recording is stored. Neither Jitsi nor LiveKit provides this natively. You build it yourself or you don’t have it. When a compliance officer asks “can you prove where patient video data from last Tuesday was stored and who accessed it?” — the answer with a stock open-source deployment is usually silence.</p><p><strong>Analytics: </strong>How many concurrent sessions ran last Thursday? Average call duration? Regional packet loss? Out of the box, you get basic server metrics. Conference-level analytics require custom development.</p><h3 id="then-customization-hits-a-wall"><strong>Then Customization Hits a Wall</strong></h3><p>You can skin Jitsi’s UI — logos, colors, fonts. But deep white-labeling — embedding video into your product under your brand, with your domain, your SDK, and zero trace of the upstream project — requires forking. Once you fork, every upstream security patch, every new release needs to be manually merged into your version. Teams that fork typically fall 6–12 months behind upstream within a year, running a version that’s effectively unsupported.</p><p>LiveKit takes a better approach with a proper SDK layer, but it’s infrastructure, not a platform. You get building blocks — rooms, tracks, participants — and build the complete product experience yourself. For teams that want a fully white-labeled, deployable product without building the UI and management layer from scratch, neither delivers that out of the box.</p><h3 id="and-there-is-no-support-when-production-breaks"><strong>And There Is No Support When Production Breaks</strong></h3><p>When your video platform goes down during a live vKYC session with 200 banking customers waiting, your options are: GitHub issues, community forums, and your own engineering team. No phone number, no escalation path, no SLA. For internal tools, this is fine. For customer-facing infrastructure in regulated industries, it’s a risk most enterprises eventually decide they can’t carry.</p><p>So what does all of this actually add up to?</p><h3 id="the-math-what-%E2%80%9Cfree%E2%80%9D-open-source-video-infrastructure-costs-at-enterprise-scale"><strong>The Math: What “Free” Open-Source Video Infrastructure Costs at Enterprise Scale</strong></h3><p>Let’s model a specific, realistic deployment. A mid-size SaaS company runs a customer-facing platform — telehealth consultations, video-based customer support, or live virtual classrooms. They’ve self-hosted Jitsi. At peak, they run 250 concurrent video sessions. Recording is required for roughly 60% of sessions (compliance or playback). Deployed across 2 cloud regions for latency. One DevOps engineer spends about 40% of their time on video infrastructure.</p><p>Here’s the infrastructure that deployment requires:</p><p><strong>Servers: </strong>4 Jitsi Videobridge instances (8 vCPU, 32GB RAM each — each handles roughly 60 sessions at peak), 1 signaling server (Prosody + Jicofo), 2 TURN servers for corporate firewall traversal — whose <a href="https://samvyo.com/blog/the-turn-bill-the-self-hosted-video-cost-nobody-forecasts?ref=samvyo.com">relay bandwidth is the cost nobody forecasts</a> — 1 monitoring stack (Prometheus + Grafana).</p><p><strong>Recording: </strong>5 Jibri instances (each records exactly 1 session at a time — covering 5 concurrent recordings at peak). Each needs 4 vCPU and 16GB RAM because Jibri renders meetings in a headless Chrome browser.</p><p><strong>Storage: </strong>~8 TB/month of recorded video at moderate resolution.</p><p>And here’s what it costs:</p><p/>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    width: 100%;
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 6px 10px;
    color: inherit;            /* matches your theme — light or dark */
    background: transparent;
    text-align: left;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18); /* neutral tint, safe on any bg */
    font-weight: 700;
  }
  .rate-table tr.total td {
    font-weight: 700;
  }
</style>

<table class="rate-table">
  <colgroup>
    <col width="50%">
    <col width="50%">
  </col></col></colgroup>
  <thead>
    <tr>
      <th>Cost Category</th>
      <th>Monthly Estimate</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Server infrastructure (4 JVB + signaling + 2 TURN + monitoring)</td>
      <td>$900 – $1,600</td>
    </tr>
    <tr>
      <td>Recording instances (5 Jibri at 4 vCPU / 16GB each)</td>
      <td>$500 – $800</td>
    </tr>
    <tr>
      <td>Object storage (~8 TB recorded video)</td>
      <td>$200 – $400</td>
    </tr>
    <tr>
      <td>Engineering maintenance (15–20 hrs/month @ $80–$120/hr)</td>
      <td>$1,200 – $2,400</td>
    </tr>
    <tr>
      <td>DevOps engineer (40% allocation, $130K–$180K/yr salary)</td>
      <td>$4,300 – $6,000</td>
    </tr>
    <tr>
      <td>Security patching, upstream tracking, incident response</td>
      <td>$400 – $800</td>
    </tr>
    <tr class="total">
      <td>Total Monthly Cost</td>
      <td>$7,500 – $12,000</td>
    </tr>
    <tr class="total">
      <td>Total Annual Cost</td>
      <td>$90,000 – $144,000</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p/><p>$90,000 to $144,000 per year for a 250-session deployment on “free” software. Scale to 500 concurrent sessions and the server and recording line items roughly double.</p><p>And the real cost isn’t even the money. It’s what you’re not building while your team is keeping video infrastructure alive. In the name of “free,” what enterprises actually give up is growth — they compromise on scalability, on onboarding new customers, on shipping features that make the product easier to use, on automating workflows, on building the ecosystem that compounds over time. The software costs nothing. The opportunity cost is enormous.</p><p>If these numbers or this pattern sound familiar, it’s worth asking honestly: have you outgrown open-source?</p><hr><h2 id="the-signals-that-you%E2%80%99ve-outgrown-open-source-video-infrastructure"><strong>The Signals That You’ve Outgrown Open-Source Video Infrastructure</strong></h2><p>Not every company needs to migrate. But if three or more of these are true, the cost of staying is likely higher than the cost of switching:</p><p><strong>Your engineers spend more time maintaining video infrastructure than building your product. </strong>The maintenance burden has shifted from a side task to a recurring drag on roadmap velocity.</p><p><strong>You’ve failed or struggled with a compliance audit because of video recording or data residency gaps. </strong>Compliance is asking questions your deployment can’t answer.</p><p><strong>You need white-label video in your product, and the fork is falling behind upstream. </strong>Every upstream release is a merge headache. You’re running a version nobody else supports.</p><p><strong>You’re hiring a dedicated WebRTC engineer just to keep the platform running. </strong>When infrastructure requires its own headcount, the “free” math has changed.</p><p><strong>Scaling past current capacity requires an architecture change, not just more servers. </strong>Session migration, cascading SFUs, geo-distribution — none of which are simple additions.</p><p><strong>Downtime takes hours to resolve because there’s no vendor support to escalate to. </strong>Your team is debugging production from GitHub threads at 2 AM.</p><p>If this sounds familiar, the next question is: what’s the migration path? That depends on what your industry actually needs.</p><hr><h2 id="what-comes-next-choosing-the-right-path-for-your-industry"><strong>What Comes Next: Choosing the Right Path for Your Industry</strong></h2><h3 id="what-does-your-industry-require"><strong>What Does Your Industry Require?</strong></h3><p><strong>Banking &amp; Financial Services: </strong>Data sovereignty is non-negotiable. Video KYC regulations mandate that customer data stays within the organization’s infrastructure. You need on-premise deployment, end-to-end encryption, call-level audit trails, and provable data residency. Compliance drives the architecture.</p><p><strong>Healthcare: </strong>HIPAA, GDPR, and equivalent regulations require patient video data to be processed within controlled environments. Recording for medical records, audit trails for regulatory proof, and demonstrable data residency are hard requirements.</p><p><strong>EdTech: </strong>Scale is the primary challenge — hundreds of concurrent classrooms with 30–500 students. Recording for playback is essential. White-labeling matters. Cost predictability matters because usage grows linearly with enrollment.</p><p><strong>Enterprise IT / SaaS: </strong>Companies embedding video into their own products need SDK integration, white-label capability, and a platform that doesn’t require forking someone else’s codebase. The decision is driven by engineering speed: ship video in weeks, not months.</p><h3 id="which-models-deliver-those-requirements"><strong>Which Models Deliver Those Requirements?</strong></h3><p><a href="https://samvyo.com/blog/build-buy-or-embed-the-technical-decision-guide-for-video-infrastructure?ref=samvyo.com"><strong>Commercial On-Premise Platforms</strong></a><strong>: </strong>Deploy on your own servers, full data sovereignty, vendor support with SLAs. Samvyo operates here — flat licensing, on-prem deployment, white-label, built-in recording and AI features. Suits BFSI, healthcare, and government where compliance mandates on-premise and vendor support is a requirement.</p><p><strong>Cloud Video APIs: </strong>Agora, Daily.co, Dyte offer SDKs you integrate into your product, running on their cloud. Fast to integrate, well-documented. Suits edtech and SaaS where data sovereignty isn’t a hard requirement and per-minute costs haven’t become unsustainable.</p><p><strong>Managed Open-Source: </strong>Third-party providers host and maintain Jitsi on your behalf. Solves the operational pain without a full platform migration. Doesn’t solve feature gaps (white-label, compliance, audit trails), but eliminates the engineering overhead.</p><p><strong>Bandwidth-Based Infrastructure (LiveKit Cloud): </strong>LiveKit’s managed cloud, priced per GB. Developer-friendly, more modern than Jitsi. Suits engineering-heavy teams comfortable building the complete product experience on top of infrastructure building blocks.</p><h3 id="how-to-choose"><strong>How to Choose</strong></h3><p><strong>If compliance drives your architecture </strong>(BFSI, healthcare, government) — you need on-premise with audit trails and vendor support. Cloud-only options are disqualified.</p><p><strong>If scale and cost predictability are the priority </strong>(edtech, high-volume SaaS) — compare flat licensing against per-minute billing at your projected usage.</p><p><strong>If engineering speed matters most </strong>(startups, product teams) — cloud video APIs get you to production fastest. Optimize later if volume grows.</p><p><strong>If you want to stay on open-source without the operational burden </strong>&nbsp;— managed hosting solves the maintenance problem. The feature gaps remain.</p><hr><h2 id="what%E2%80%99s-next"><strong>What’s Next?</strong></h2><p>If you’re running self-hosted Jitsi or LiveKit and the maintenance overhead, scaling challenges, or compliance gaps in this article sound familiar — it’s worth understanding what the alternatives look like for your setup.</p><p><a href="https://samvyo.com/?ref=samvyo.com" rel="noreferrer">Samvyo</a> offers a free migration assessment where we review your current deployment, map your requirements, and show you what a managed, flat-licensed alternative looks like for your use case. No commitment — just an honest technical conversation can be <a href="https://samvyo.com/contact?ref=samvyo.com" rel="noreferrer">booked</a>. If you are looking for a detailed demo, please book a <a href="https://samvyo.com/demo?ref=samvyo.com" rel="noreferrer">meeting</a>.</p><hr><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong><br/></h2><h3 id="for-enterprises-what-are-the-alternatives-for-jitsi"><strong>For enterprises, what are the alternatives for Jitsi?</strong></h3><p>Commercial on-premise platforms like Samvyo offer flat licensing, white-label, and vendor support deployed on your infrastructure. Cloud APIs like Agora and Daily.co offer fast integration but run on their cloud with per-minute billing. Managed open-source providers host Jitsi for you, solving operational pain but not the feature gaps.</p><h3 id="is-jitsi-suitable-for-enterprise-use"><strong>Is Jitsi suitable for enterprise use?</strong></h3><p>Jitsi works well under ~100 concurrent users. Beyond that, it requires multi-server architecture, dedicated engineering, and custom development for compliance and recording. At 200+ sessions, operational overhead runs $90,000–$144,000/year — at which point platforms like Samvyo become more capable and more cost-efficient.</p><h3 id="what-size-companies-is-samvyo-ideal-for"><strong>What size companies is Samvyo ideal for?</strong></h3><p>Samvyo is built for enterprises running 100+ concurrent video sessions — the scale where per-minute billing gets expensive and self-hosted open-source becomes an engineering burden. It’s particularly suited for regulated industries (banking, healthcare, government) and SaaS companies embedding white-labeled video into their own product.</p><h3 id="how-does-samvyo%E2%80%99s-pricing-compare-to-self-hosted-open-source-video"><strong>How does Samvyo’s pricing compare to self-hosted open-source video?</strong></h3><p>Self-hosted Jitsi at enterprise scale costs $90,000–$144,000/year in servers, recording, storage, and engineering. Samvyo replaces that entire stack with a single flat license — predictable cost, no engineering overhead, no per-minute billing.</p><h3 id="can-samvyo-replace-a-jitsi-or-livekit-deployment"><strong>Can Samvyo replace a Jitsi or LiveKit deployment?</strong></h3><p>Yes. Samvyo provides the same on-premise deployment and data sovereignty that companies chose open-source for, while adding compliance audit trails, white-label, built-in recording, AI features, and vendor support that open-source doesn’t offer natively.</p><h3 id="does-samvyo-support-white-labeling-for-enterprise-video"><strong>Does Samvyo support white-labeling for enterprise video?</strong></h3><p>Full white-label out of the box — your brand, your domain, your SDK, zero upstream branding. Unlike Jitsi where deep customization requires forking the codebase, Samvyo’s white-label is a built-in feature, not a maintenance liability.</p><h3 id="when-should-an-enterprise-switch-from-open-source-video-to-samvyo"><strong>When should an enterprise switch from open-source video to Samvyo?</strong></h3><p>When engineering maintenance exceeds 15–20 hours/month, compliance teams are asking questions your platform can’t answer, your fork is falling behind upstream, or you’re hiring headcount just to keep video running. These are signals the “free” model costs more than a managed alternative.</p><h3 id="does-samvyo-support-on-premise-video-deployment"><strong>Does Samvyo support on-premise video deployment?</strong></h3><p>Yes. Samvyo deploys entirely on your servers — your infrastructure, your data, your control. Required by regulators in banking (RBI video KYC), healthcare (HIPAA), and government where data sovereignty is non-negotiable.</p></hr></hr></hr></hr></hr>]]></content:encoded></item><item><title><![CDATA[Communication Sovereignty: Why Enterprises and Governments Are Building Their Own Video Conferencing Infrastructure]]></title><description><![CDATA[Communication sovereignty unlocks AI capabilities impossible when your data lives elsewhere. Future leaders won't have the best SaaS subscriptions—they'll own their infrastructure and their AI future.]]></description><link>https://www.samvyo.com/blog/communication-sovereignty-building-own-video-conferencing-infrastructure</link><guid isPermaLink="false">698458808b45c3f0cd639fb3</guid><category><![CDATA[Communication Sovereignty]]></category><category><![CDATA[Video Conferencing Infrastructure]]></category><category><![CDATA[Customisable WebRTC Solutions]]></category><dc:creator><![CDATA[Saurav K. Panda]]></dc:creator><pubDate>Thu, 05 Feb 2026 12:01:13 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/02/infographic_4_roi_landscape.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/02/infographic_4_roi_landscape.png" alt="Communication Sovereignty: Why Enterprises and Governments Are Building Their Own Video Conferencing Infrastructure"/><p><em>The recent French government decision to phase out Microsoft Teams and Zoom by 2027 signals a fundamental shift in how organizations view digital communication infrastructure. Here's what it means for the future of enterprise collaboration.</em></p><h2 id="the-wake-up-call-france-charts-a-new-course">The Wake-Up Call: France Charts a New Course</h2><p>On January 27, 2026, France made a groundbreaking announcement: all 2.5 million civil servants will transition from U.S.-based video conferencing platforms—Teams, Zoom, Webex, and GoTo Meeting—to <strong>Visio</strong>, a homegrown WebRTC-based platform, by 2027.</p><p>"The aim is to end the use of non-European solutions and guarantee the security and confidentiality of public electronic communications by relying on a powerful and sovereign tool," declared David Amiel, France's minister for civil service and state reform.</p><p>This isn't just about patriotism. It's about <strong>control, security, and strategic autonomy</strong> in an increasingly digital world where communication infrastructure has become as critical as physical infrastructure.</p><h2 id="the-security-concerns-that-never-went-away">The Security Concerns That Never Went Away</h2><p>The move toward communication sovereignty isn't new—it's been building for years:</p><h3 id="the-2020-zoom-crisis"><strong>The 2020 Zoom Crisis</strong></h3><p>At the pandemic's peak, as Zoom usage exploded, so did security breaches:</p><ul><li><strong>Google</strong> banned Zoom from company-owned computers</li><li><strong>NASA</strong> prohibited all employees from using Zoom</li><li><strong>U.S. Senate</strong> urged members to choose alternative platforms</li><li><strong>Taiwan, Germany, and Singapore</strong> banned it for government use</li><li><strong>SpaceX and Standard Chartered Bank</strong> forbid employee usage</li><li><strong>New York City schools</strong> switched to Microsoft Teams</li></ul><p>The issues ranged from "Zoom-bombing" attacks to concerns about data routing through Chinese servers, lack of end-to-end encryption, and vulnerability to foreign surveillance.</p><h3 id="the-2025-2026-escalation"><strong>The 2025-2026 Escalation</strong></h3><p>Fast forward to today, and the concerns have intensified:</p><ul><li>The <strong>EU-US Data Transfer Framework</strong> faces renewed scrutiny after Trump administration policy changes</li><li>The <strong>NIS2 Directive</strong> (effective October 2024) mandates comprehensive cybersecurity for critical infrastructure</li><li><strong>GDPR enforcement</strong> has matured, with authorities focusing on cross-border data transfers</li><li>Growing geopolitical tensions have made data residency a top priority for defense, healthcare, and finance sectors</li></ul><h2 id="the-european-digital-sovereignty-movement">The European Digital Sovereignty Movement</h2><p>France's decision follows the <strong>Berlin Declaration for European Digital Sovereignty</strong>, signed by EU member states on November 18, 2025. This Franco-German initiative established a working group to:</p><ul><li>Define common European digital services</li><li>Develop sovereignty indicators for cloud, AI, and cybersecurity</li><li>Influence procurement frameworks across member states</li></ul><p>Other European nations are following suit:</p><ul><li><strong>Austria's military</strong> dropped Microsoft Office for LibreOffice</li><li><strong>German states</strong> are adopting open-source alternatives</li><li><strong>The Netherlands</strong> published its Digital Open Strategic Autonomy (DOSA) agenda</li><li><strong>Wire</strong>, a European alternative, now serves 1,800+ organizations including the German government</li></ul><h2 id="beyond-security-the-ai-integration-opportunity">Beyond Security: The AI Integration Opportunity</h2><p>Here's what most discussions miss: <strong>Communication sovereignty unlocks transformative AI capabilities that are impossible with third-party platforms.</strong></p><h3 id="mission-critical-voice-analytics"><strong>Mission-Critical Voice Analytics</strong></h3><p>When you control your communication infrastructure:</p><p>✅ <strong>Real-time transcription and analysis</strong> without sending data to external AI providers<br>✅ <strong>Sentiment analysis</strong> on customer calls for service quality monitoring<br>✅ <strong>Compliance monitoring</strong> in regulated industries (BFSI, healthcare)<br>✅ <strong>Predictive analytics</strong> to identify escalation patterns before they become problems<br>✅ <strong>Custom AI models</strong> trained on your organization's domain-specific language</br></br></br></br></p><h3 id="the-third-party-risk-problem"><strong>The Third-Party Risk Problem</strong></h3><p>With platforms like Teams or Zoom:</p><ul><li>Your sensitive communications pass through their AI processing pipelines</li><li>You have limited control over data retention and AI training usage</li><li>Compliance becomes complex across multiple vendors</li><li>Integration with custom AI models requires exposing your data via APIs</li></ul><h3 id="the-sovereign-solution"><strong>The Sovereign Solution</strong></h3><p>With your own infrastructure:</p><ul><li>Process all voice and video data within your security perimeter</li><li>Train proprietary AI models on your communication patterns</li><li>Implement zero-knowledge architectures where even metadata stays internal</li><li>Integrate with internal systems (CRM, ERP, knowledge bases) without data leaving your environment</li></ul><p><strong>Example Use Cases:</strong></p><ul><li>A defense contractor analyzing classified project discussions for security risks</li><li>A hospital system using voice AI to automatically generate clinical notes without HIPAA violations</li><li>A financial institution detecting fraud patterns in trading floor communications</li><li>A government agency monitoring citizen service calls for quality assurance</li></ul><h2 id="the-roi-of-communication-sovereignty">The ROI of Communication Sovereignty</h2><p>Organizations building their own platforms are discovering unexpected benefits:</p><h3 id="cost-efficiency-at-scale"><strong>Cost Efficiency at Scale</strong></h3><ul><li>France cited reducing "additional financial costs" from multiple platform licenses</li><li>Open-source solutions like Nextcloud Talk and Jitsi eliminate per-user fees</li><li>Self-hosted infrastructure has predictable costs versus cloud subscription models</li></ul><h3 id="strategic-independence"><strong>Strategic Independence</strong></h3><ul><li>No vendor lock-in or forced migration to cloud-only models</li><li>Immunity to geopolitical service disruptions</li><li>Freedom to innovate without platform constraints</li></ul><h3 id="regulatory-compliance"><strong>Regulatory Compliance</strong></h3><ul><li>Simplified GDPR, HIPAA, and industry-specific compliance</li><li>Data residency guarantees for regulated industries</li><li>Audit trail control for legal and compliance teams</li></ul><h3 id="innovation-velocity"><strong>Innovation Velocity</strong></h3><ul><li>Rapid AI experimentation without vendor approval cycles</li><li>Custom feature development for unique organizational needs</li><li>Integration with legacy systems and proprietary tools</li></ul><h2 id="the-technology-is-ready">The Technology Is Ready</h2><p>The tools to build sovereign communication platforms have matured dramatically:</p><p><strong>WebRTC</strong> provides open-standard real-time communication<br><strong>MediaSoup, Jitsu, and Janus</strong> offer production-grade media servers<br><strong>Nextcloud Talk, Wire, and Element</strong> deliver enterprise collaboration<br><strong>Open-source AI frameworks</strong> (Whisper, Wav2Vec2) enable transcription and analysis<br><strong>Cloud-native architectures</strong> support hybrid and multi-cloud deployments</br></br></br></br></p><p>Organizations don't have to build from scratch—they can leverage proven components while maintaining full control.</p><h2 id="the-question-every-cio-should-ask">The Question Every CIO Should Ask</h2><p><em>"If our communication data is strategic—and it is—why are we treating the infrastructure as a commodity?"</em></p><p>The enterprises and governments leading the next decade won't be those with the best third-party subscriptions. They'll be those who recognized that <strong>communication sovereignty is digital sovereignty</strong>, and that owning your infrastructure is owning your future.</p><p>France has shown the way. Austria's military has followed. The Netherlands is charting its course.</p><p><strong>The question isn't whether to pursue communication sovereignty—it's when to start.</strong></p><h2 id="what-this-means-for-you">What This Means for You</h2><p><strong>🔐 You Can Sleep Better at Night</strong><br>When you own your communication platform, you're not wondering what vulnerabilities exist in someone else's system or whether you're compliant with the latest regulations. You know exactly where your data is and who has access to it.</br></p><p><strong>🌍 True Control Over Your Data</strong><br>Data sovereignty isn't just a buzzword—it's about ensuring your sensitive conversations stay within your borders and under your rules. No surprise policy changes, no forced cloud migrations, no jurisdictional ambiguity.</br></p><p><strong>🤖 Unlock AI Without Compromise</strong><br>The most powerful AI capabilities—real-time analytics, custom models trained on your domain, predictive insights—require direct access to your data. Third-party platforms force you to choose between innovation and security. Your own infrastructure gives you both.</br></p><p><strong>💰 Costs That Make Sense</strong><br>Yes, there's upfront investment. But at scale, paying per-user fees forever costs more than owning your infrastructure. Plus, you get predictable costs and no surprise price hikes when your renewal comes up.</br></p><p><strong>🚀 Build What You Actually Need</strong><br>Ever wished your video platform could integrate directly with your custom CRM? Or automatically trigger workflows based on meeting outcomes? With your own platform, you don't wait for vendors to add features. You build exactly what your business needs.</br></p><p><strong>What's your organization's communication sovereignty strategy? </strong></p><h2 id="what%E2%80%99s-next"><strong>What’s Next?</strong></h2><p>Whether you are evaluating secure video conferencing options for your enterprise, exploring on-premise deployment for your government department, or simply looking for a highly customizable platform that fits your industry's unique demands — we would love to hear from you.</p><p><strong>📅 Schedule a Demo</strong> Experience Samvyo firsthand with a personalised walkthrough tailored to your industry and requirements. 👉 <a href="https://cal.com/saurav-panda-luodk2/samvyo-demo?ref=samvyo.com" rel="noreferrer">Book a Demo with Our Team</a></p><p><strong>📞 Talk to a Specialist</strong> Have specific questions about on-premise deployment, compliance, or integration? Our team of experts is ready to assist. 👉 <a href="https://samvyo.com/demo?ref=samvyo.com" rel="noreferrer">Schedule a Consultation</a></p><p><strong>📧 Get in Touch</strong> Prefer to start with an email? Reach out to our enterprise solutions team directly. 👉 <a href="https://samvyo.com/contact?ref=samvyo.com" rel="noreferrer">Contact Us</a></p><p><em>Samvyo — Secure. Sovereign. Built in India. For India and the World.</em></p>]]></content:encoded></item><item><title><![CDATA[The Future of Virtual Care: How Strategic Technology Partnerships Are Revolutionizing Healthcare Delivery]]></title><description><![CDATA[Virtual care adoption has surged, yet 67% of implementations face video quality issues affecting clinical decisions. Strategic technology partnerships—not system replacement—are revolutionizing healthcare by creating seamless virtual care ecosystems that deliver measurable ROI.]]></description><link>https://www.samvyo.com/blog/the-future-of-virtual-care-how-strategic-technology-partnerships-are-revolutionizing-healthcare-delivery/</link><guid isPermaLink="false">689b97778b45c3f0cd639f5e</guid><category><![CDATA[Virtual Healthcare]]></category><category><![CDATA[#pratik]]></category><dc:creator><![CDATA[Saurav K. Panda]]></dc:creator><pubDate>Tue, 12 Aug 2025 20:32:55 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2025/08/Virtual-Care-Blog-Image-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2025/08/Virtual-Care-Blog-Image-1.jpg" alt="The Future of Virtual Care: How Strategic Technology Partnerships Are Revolutionizing Healthcare Delivery"/><p>The healthcare industry stands at a pivotal moment. Virtual care adoption has accelerated dramatically, yet many healthcare systems struggle with fragmented communication infrastructure that limits the full potential of their virtual care investments. The solution isn't to replace existing systems—it's to enhance them through strategic technology partnerships that create seamless, integrated virtual care ecosystems.</p><h2 id="the-hidden-crisis-in-virtual-care-implementation">The Hidden Crisis in Virtual Care Implementation</h2><p>While virtual care platforms have transformed healthcare delivery, a closer look reveals significant communication challenges that impact patient outcomes and operational efficiency:</p><p><strong>The Statistics Tell a Concerning Story:</strong></p><ul><li>67% of virtual nursing implementations face video quality issues that directly affect clinical decision-making</li><li>45% of AI-powered monitoring systems generate false alerts due to poor video feed quality</li><li>Healthcare systems spend an average of $28,000 annually per virtual care station with limited communication capabilities</li><li>52% of smart hospital initiatives struggle with integration complexity</li><li>Clinical efficiency drops by 38% due to communication delays between virtual and bedside teams</li></ul><p>These aren't just technical issues—they're barriers to delivering optimal patient care and achieving the ROI that virtual care promises.</p><h2 id="the-virtual-care-ecosystem-more-than-just-video-calls">The Virtual Care Ecosystem: More Than Just Video Calls</h2><p>Modern virtual care encompasses three critical domains, each with unique communication requirements:</p><h3 id="virtual-nursing-remote-patient-monitoring">Virtual Nursing &amp; Remote Patient Monitoring</h3><p>Virtual nursing has evolved beyond simple video consultations. Today's virtual nursing stations require:</p><ul><li>Ultra-HD video quality for accurate clinical assessments</li><li>Scalable communication supporting multiple simultaneous patient observations</li><li>Seamless integration with Electronic Health Records (EHR)</li><li>Real-time collaboration between remote nurses and bedside clinical teams</li></ul><h3 id="ai-powered-patient-monitoring-systems">AI-Powered Patient Monitoring Systems</h3><p>The integration of artificial intelligence in patient monitoring creates new communication demands:</p><ul><li>Computer vision systems requiring optimized video feeds for accurate analysis</li><li>Fall prevention and patient surveillance systems needing enhanced video quality</li><li>Real-time alert systems connecting AI detection with clinical response teams</li><li>Smart hospital solutions requiring unified communication across multiple platforms</li></ul><h3 id="digital-health-telehealth-platforms">Digital Health &amp; Telehealth Platforms</h3><p>Comprehensive digital health solutions demand enterprise-grade communication infrastructure:</p><ul><li>Remote patient monitoring with multi-modal communication capabilities</li><li>Mobile health applications requiring secure, scalable communication backbone</li><li>Clinical decision support systems needing real-time data exchange</li><li>Population health management platforms with integrated communication workflows</li></ul><h2 id="the-partnership-imperative-integration-over-replacement">The Partnership Imperative: Integration Over Replacement</h2><p>The most successful virtual care implementations don't result from replacing existing systems—they emerge from strategic partnerships that enhance current investments while addressing communication gaps.</p><h3 id="enhanced-virtual-nursing-through-strategic-integration">Enhanced Virtual Nursing Through Strategic Integration</h3><p>Consider the transformation possible when virtual nursing platforms integrate with enterprise-grade communication solutions:</p><p><strong>Before Integration:</strong></p><ul><li>Limited observer-to-patient ratios due to communication constraints</li><li>Video quality issues affecting clinical assessment accuracy</li><li>Fragmented workflows between virtual observation centers and bedside teams</li><li>High per-station technology costs with limited scalability</li></ul><p><strong>After Strategic Partnership:</strong></p><ul><li>150% improvement in observer-to-patient ratios through enhanced communication efficiency</li><li>Crystal-clear 4K video streaming enabling accurate remote clinical assessments</li><li>Unified communication platforms connecting virtual and bedside teams seamlessly</li><li>$40,000 annual savings per virtual care station through optimized technology deployment</li></ul><h3 id="ai-enhanced-monitoring-with-communication-excellence">AI-Enhanced Monitoring with Communication Excellence</h3><p>The integration of advanced communication infrastructure with AI-powered monitoring systems creates unprecedented clinical capabilities:</p><p><strong>Smart Hospital Communication Enhancement:</strong></p><ul><li>AI-optimized video feeds improving computer vision accuracy by 80%</li><li>Real-time clinical alerts with instant communication triggers</li><li>Voice recognition and vital sign monitoring integration</li><li>Predictive communication routing based on patient acuity levels</li></ul><p><strong>Clinical Automation Benefits:</strong></p><ul><li>65% reduction in false alerts through superior video quality</li><li>55% reduction in clinical documentation burden through automated workflows</li><li>$125,000 annual operational cost savings per facility</li><li>70% improvement in cross-department collaboration efficiency</li></ul><h2 id="the-technical-architecture-of-integrated-virtual-care">The Technical Architecture of Integrated Virtual Care</h2><p>Successful virtual care integration requires a three-layer approach:</p><h3 id="layer-1-infrastructure-excellence">Layer 1: Infrastructure Excellence</h3><ul><li>Native API connectivity with existing virtual care devices and AI monitoring systems</li><li>Cloud-native architecture supporting unlimited virtual care expansion</li><li>Edge computing capabilities for reduced latency in critical care scenarios</li><li>Redundant systems ensuring 99.99% uptime for patient safety</li></ul><h3 id="layer-2-communication-superior">Layer 2: Communication Superior</h3><ul><li>Ultra-high definition video streaming for accurate clinical assessments</li><li>Advanced audio processing with noise cancellation for clear hospital communication</li><li>Multi-party conferencing supporting complex clinical consultations</li><li>Cross-platform integration across desktop, tablet, and mobile devices</li></ul><h3 id="layer-3-clinical-workflow-optimization">Layer 3: Clinical Workflow Optimization</h3><ul><li>Intelligent call routing based on clinical priorities and staff availability</li><li>AI-powered clinical note generation from video consultations</li><li>Advanced alert management with intelligent escalation systems</li><li>Real-time HIPAA audit trails and regulatory compliance monitoring</li></ul><h2 id="real-world-impact-measurable-results">Real-World Impact: Measurable Results</h2><p>The benefits of strategic virtual care partnerships extend beyond theoretical improvements—they deliver measurable results that impact both clinical outcomes and financial performance:</p><h3 id="clinical-excellence-metrics">Clinical Excellence Metrics</h3><ul><li>40% faster emergency response times through optimized communication workflows</li><li>50% improvement in patient satisfaction scores for virtual care interactions</li><li>30% reduction in preventable adverse events through enhanced monitoring communication</li><li>25% increase in virtual care platform adoption rates</li></ul><h3 id="operational-efficiency-gains">Operational Efficiency Gains</h3><ul><li>60% faster customer deployment leading to accelerated implementation timelines</li><li>45% improvement in customer satisfaction scores</li><li>50% reduction in integration complexity and deployment resources</li><li>30% decrease in ongoing technical support requirements</li></ul><h3 id="financial-performance-impact">Financial Performance Impact</h3><ul><li>Traditional virtual care systems: $125,000 annual cost per station</li><li>Integrated enhanced systems: $85,000 annual cost per station</li><li><strong>Net annual savings: $40,000 per virtual care station</strong></li></ul><h2 id="the-partnership-advantage-why-integration-wins">The Partnership Advantage: Why Integration Wins</h2><p>The most successful virtual care implementations recognize that excellence comes through strategic partnerships rather than single-vendor solutions. Here's why:</p><h3 id="technical-superiority">Technical Superiority</h3><ul><li>Rapid deployment in days rather than months</li><li>Unlimited scalability without performance degradation</li><li>Healthcare-grade security with end-to-end encryption</li><li>AI-optimized architecture purpose-built for virtual care environments</li></ul><h3 id="clinical-impact">Clinical Impact</h3><ul><li>Enhanced patient outcomes through improved communication quality</li><li>Streamlined workflows reducing administrative burden on clinical staff</li><li>Comprehensive cost optimization through unified platform approaches</li><li>Built-in regulatory compliance with automated audit trails</li></ul><h3 id="strategic-value">Strategic Value</h3><ul><li>Partnership-first approach enhancing existing investments</li><li>Open integration supporting multiple platform ecosystems</li><li>Continuous innovation ensuring compatibility with emerging technologies</li><li>Dedicated customer success programs optimizing ROI</li></ul><h2 id="implementation-roadmap-from-vision-to-reality">Implementation Roadmap: From Vision to Reality</h2><p>Successful virtual care enhancement follows a structured implementation approach:</p><h3 id="phase-1-assessment-integration-weeks-1-2">Phase 1: Assessment &amp; Integration (Weeks 1-2)</h3><ul><li>Comprehensive virtual care workflow analysis</li><li>Communication bottleneck identification and resolution planning</li><li>Device integration testing and video quality optimization</li><li>Clinical team training on enhanced communication capabilities</li></ul><h3 id="phase-2-enhanced-workflow-deployment-weeks-3-4">Phase 2: Enhanced Workflow Deployment (Weeks 3-4)</h3><ul><li>Multi-site virtual care center connectivity implementation</li><li>AI-powered clinical priority routing configuration</li><li>Advanced analytics integration for performance optimization</li><li>Mobile communication extension for clinical staff flexibility</li></ul><h3 id="phase-3-scale-optimization-months-2-3">Phase 3: Scale &amp; Optimization (Months 2-3)</h3><ul><li>Enterprise-wide expansion across hospital systems</li><li>Advanced AI integration for predictive communication routing</li><li>Cross-platform data analytics for continuous improvement</li><li>Strategic partnership development with additional healthcare technology vendors</li></ul><h2 id="looking-forward-the-future-of-integrated-virtual-care">Looking Forward: The Future of Integrated Virtual Care</h2><p>The healthcare industry's digital transformation continues to accelerate, and the organizations that thrive will be those that embrace strategic partnerships to create comprehensive, integrated virtual care ecosystems.</p><h3 id="emerging-opportunities">Emerging Opportunities</h3><ul><li>Next-generation virtual care features including predictive analytics</li><li>Multi-platform integration supporting diverse healthcare technology ecosystems</li><li>International expansion of integrated virtual care solutions</li><li>Industry leadership through clinical research and evidence-based outcomes</li></ul><h3 id="the-competitive-imperative">The Competitive Imperative</h3><p>Healthcare organizations face a clear choice: continue managing virtual care communication limitations while competitors advance integrated solutions, or embrace strategic partnerships that deliver comprehensive virtual care platforms with superior clinical results, operational efficiency, and financial performance.</p><h2 id="conclusion-partnership-as-strategy">Conclusion: Partnership as Strategy</h2><p>The future of virtual care isn't about choosing between different technology vendors—it's about creating strategic partnerships that enhance existing investments while addressing critical communication gaps. The most successful healthcare systems will be those that recognize virtual care excellence comes through integration, not replacement.</p><p>By embracing partnerships that enhance rather than compete with existing virtual care investments, healthcare organizations can deliver superior patient outcomes, achieve operational excellence, and realize the full financial potential of their virtual care initiatives.</p><p>The question isn't whether to enhance your virtual care capabilities—it's whether you'll lead the transformation or follow others who recognize that strategic partnerships are the key to virtual care excellence.</p><hr><p><em>Ready to explore how strategic partnerships can transform your virtual care capabilities? Contact us at </em><a href="mailto:hello@samvyo.com"><em>hello@samvyo.com</em></a><em> or </em><a href="https://samvyo.com/contact?ref=samvyo.com" rel="noreferrer"><em>here</em></a><em>, to discuss integration opportunities that can enhance your existing virtual care investments while delivering measurable improvements in clinical outcomes, operational efficiency, and financial performance.</em></p></hr>]]></content:encoded></item><item><title><![CDATA[How Samvyo Helps Fashion Retailers Sell Smarter and Style Better]]></title><description><![CDATA[With Samvyo, fashion retailers turn browsers into buyers by offering instant video styling sessions, live expert Q&A, and post-purchase support — all from their website. It’s fast, personal, and builds trust from the very first click.]]></description><link>https://www.samvyo.com/blog/how-samvyo-helps-fashion-retailers-sell-smarter-and-style-better/</link><guid isPermaLink="false">6893a5158b45c3f0cd639f46</guid><category><![CDATA[#pratik]]></category><dc:creator><![CDATA[Saurav K. Panda]]></dc:creator><pubDate>Wed, 06 Aug 2025 19:27:05 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2025/08/Untitled-design--2-.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2025/08/Untitled-design--2-.png" alt="How Samvyo Helps Fashion Retailers Sell Smarter and Style Better"/><p>In today's digital-first world, <strong>fashion retailers</strong> face more challenges --- and more opportunities --- than ever before. Customers expect fast, personalized, and interactive shopping experiences from their very first click.</p><p>Our powerful platforms, <strong>Samvyo Meet</strong> (Video Conferencing) and <strong>Samvyo Meetnow</strong> (Contact Center Solution), help fashion brands connect with shoppers in real-time, build trust through personalized styling sessions, and offer seamless support throughout their fashion journey.</p><p><strong>Here's how your fashion business benefits:</strong></p><h4 id="%E2%80%A2-seamless-website-integration-with-embedded-call-link-or-qr-code">• Seamless website integration with embedded call link or QR code</h4><p><em>Let your visitors launch instant live video-audio calls from your site --- no installs, no barriers.</em></p><h4 id="%E2%80%A2-no-phone-numbers-neededjust-click-and-connect">• No phone numbers needed --- just click and connect</h4><p><em>Enable customers to connect securely without sharing their number --- frictionless and privacy-first.</em></p><h4 id="%E2%80%A2-smart-call-transcriptions-actionable-insights-and-analytics">• Smart call transcriptions, actionable insights, and analytics</h4><p><em>AI-powered tracking turns every conversation into valuable data --- from style preferences to seasonal trends.</em></p><h4 id="%E2%80%A2-effortless-crm-integration-on-demand">• Effortless CRM integration on demand</h4><p><em>All calls, styling notes, and follow-ups sync smoothly into your CRM for better customer relationships and faster conversions.</em></p><h2 id="convert-website-browsers-into-fashion-buyers">Convert Website Browsers into Fashion Buyers</h2><p>Your website is no longer just a catalog --- it's your <strong>virtual boutique</strong>.</p><p>With Samvyo, you can:</p><ul><li>Host <strong>live virtual styling sessions</strong> for interested shoppers</li></ul><p><em>With Samvyo Meet, your styling team can conduct real-time video fashion consultations directly from your showroom or studio --- giving customers personalized outfit recommendations, styling tips, and live try-on demonstrations from the comfort of their home.</em></p><ul><li>Run <strong>interactive fit and style Q&amp;A sessions</strong> to answer customer queries in real time</li></ul><p><em>Using Samvyo Meetnow, route incoming styling queries instantly to a live fashion expert for real-time video or audio sessions --- resolving doubts on sizing, color matching, styling options, or care instructions without any delays.</em></p><ul><li>Engage customers with <strong>personalized fashion shows and styling demos</strong>, building confidence from the start</li></ul><p><em>Samvyo's browser-based video-audio interface lets you create one-on-one styling experiences --- showcasing how pieces mix and match, demonstrating fabric quality, and creating a more personal and trustworthy shopping experience right from the first click.</em></p><p><em>This instant and interactive experience leads to </em><strong>higher-quality leads</strong><em> and </em><strong>faster purchase decisions</strong><em>.</em></p><h2 id="route-customers-to-the-right-fashion-expert-%E2%80%94-instantly">Route Customers to the Right Fashion Expert — Instantly</h2><p>Every customer has unique style needs --- some want help with occasion wear, others with seasonal updates or personal styling.</p><p><em>Samvyo's </em><strong>smart routing system</strong><em> ensures:</em></p><ul><li>Customers are connected to the right department (personal styling, alterations, customer care, returns) in real time</li></ul><p><em>Samvyo Meetnow's intelligent routing instantly identifies the customer's fashion needs and connects them via live video or audio call to the exact stylist or specialist they need --- no manual transfers or hold time.</em></p><ul><li>No back-and-forth or lost styling opportunities</li></ul><p><strong>Our system ensures every style query is tracked, routed, and responded to --- minimizing drop-offs and ensuring no potential customer slips through the cracks.</strong></p><ul><li><em>A smoother, more boutique-like shopping experience</em></li></ul><p><strong>By instantly directing customers to the right fashion expert, Samvyo creates a seamless, high-end boutique interaction --- one that feels fast, personalized, and luxury from the very first conversation.</strong></p><h2 id="stay-connected-after-the-purchase">Stay Connected After the Purchase</h2><p>Samvyo enables you to <strong>build long-term customer relationships</strong> with intelligent post-purchase fashion support:</p><ul><li><strong>Remote Styling and Care Assistance</strong></li></ul><p><strong>With Samvyo Meetnow, customers can access live or automated video-audio guidance for styling tips, care instructions, outfit coordination, or seasonal wardrobe updates --- all without visiting the store.</strong></p><ul><li><strong>Virtual Fit and Alteration Consultations</strong></li></ul><p><strong>When customers need fit adjustments or styling advice for their purchases, they can initiate a real-time video call through Samvyo for immediate visual assessment and live alteration guidance --- helping them get the perfect fit and style.</strong></p><p><em>This consistent support boosts </em><strong>customer satisfaction</strong><em> and increases </em><strong>repeat purchases</strong><em> and </em><strong>brand loyalty</strong><em>.</em></p><h2 id="build-trust-with-real-time-fashion-expertise">Build Trust with Real-Time Fashion Expertise</h2><p>For fashion shoppers, trust and personal connection are everything. Samvyo empowers your team to deliver:</p><ul><li><strong>Live audio and video styling support</strong></li></ul><p><strong>With Samvyo Meet, your styling team can provide real-time, face-to-face consultations that build confidence --- whether it's showcasing fabric quality, demonstrating styling options, or addressing fit concerns.</strong></p><ul><li><strong>Automated style follow-ups</strong></li></ul><p><strong>Samvyo Meetnow enables timely, automated follow-ups after every styling session --- keeping customers engaged with new arrivals, seasonal trends, and personalized recommendations throughout their fashion journey.</strong></p><ul><li><strong>Transparent, two-way communication directly from website without phone numbers</strong></li></ul><p><strong>Shoppers can initiate secure, real-time styling conversations from your website --- no phone numbers needed --- creating a comfortable and trustworthy space that encourages honest style discussions.</strong></p><p><em>These personal touches make a </em><strong>big impact</strong><em> on your brand's credibility and customer loyalty.</em></p><h2 id="unlock-actionable-fashion-insights-from-every-interaction">Unlock Actionable Fashion Insights from Every Interaction</h2><p>Every conversation with a customer reveals valuable style preferences and trends.</p><p>With Samvyo's AI-powered engagement intelligence, you gain access to:</p><ul><li><strong>Pre-call context</strong> to prepare your styling team before they connect</li></ul><p><em>Samvyo Meetnow equips your stylists with real-time customer insights --- such as past purchases, browsing behavior, and style preferences --- so they're fully prepared with relevant recommendations before the conversation begins.</em></p><ul><li><strong>In-call enhancements</strong> to support stylists during fashion consultations</li></ul><p><em>Smart prompts, sentiment detection, and real-time styling suggestions guide your team during video or audio calls, helping them respond with better recommendations, faster, and more accurately.</em></p><ul><li><strong>Post-call analytics</strong> to track style preferences and improve future interactions</li></ul><p><em>Every styling session is transcribed, analyzed, and turned into insights --- revealing patterns in customer preferences, seasonal trends, and opportunities to refine your fashion recommendations.</em></p><p><em>This data helps you </em><strong>understand customer style DNA</strong><em>, refine your merchandising approach, and enhance stylist performance.</em></p><h2 id="why-samvyo-is-built-for-fashion-retailers">Why Samvyo Is Built for Fashion Retailers</h2><p>From your front-end shopping experience to your post-purchase styling support, Samvyo is designed to help fashion brands:</p><p>✅ Engage website visitors with instant styling help<br>✅ Route style queries to the right fashion expert<br>✅ Build trust through personalized fashion consultations<br>✅ Manage post-purchase styling and care support<br>✅ Turn style insights into sales growth</br></br></br></br></p><p>Whether you're an independent boutique or a growing fashion brand, <strong>Samvyo scales with your style</strong> --- making every customer feel like they have their own personal stylist.</p><p><strong>📅 Schedule a Demo</strong> Experience Samvyo firsthand with a personalised walkthrough tailored to your industry and requirements. 👉 <a href="https://cal.com/saurav-panda-luodk2/samvyo-demo?ref=samvyo.com" rel="noreferrer">Book a Demo with Our Team</a></p><p><strong>📞 Talk to a Specialist</strong> Have specific questions about on-premise deployment, compliance, or integration? Our team of experts is ready to assist. 👉 <a href="https://samvyo.com/demo?ref=samvyo.com" rel="noreferrer">Schedule a Consultation</a></p><p><strong>📧 Get in Touch</strong> Prefer to start with an email? Reach out to our enterprise solutions team directly. 👉 <a href="https://samvyo.com/contact?ref=samvyo.com" rel="noreferrer">Contact Us</a></p>]]></content:encoded></item><item><title><![CDATA[Revolutionizing Banking Communication: How Video Technology is Transforming Financial Services]]></title><description><![CDATA[Traditional banking tools no longer meet customer expectations. This blog explores how secure, banking-grade video communication is transforming customer service, compliance, and operations—driving faster ROI, boosting satisfaction, and preparing banks for a digital-first future.]]></description><link>https://www.samvyo.com/blog/revolutionizing-banking-communication-how-video-technology-is-transforming-financial-services/</link><guid isPermaLink="false">6890d6798b45c3f0cd639f31</guid><category><![CDATA[Banking Communication]]></category><category><![CDATA[#pratik]]></category><dc:creator><![CDATA[Saurav K. Panda]]></dc:creator><pubDate>Mon, 04 Aug 2025 16:01:30 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2025/08/ChatGPT-Image-Aug-4--2025--09_30_49-PM.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2025/08/ChatGPT-Image-Aug-4--2025--09_30_49-PM.png" alt="Revolutionizing Banking Communication: How Video Technology is Transforming Financial Services"/><p>In today's digital-first world, banking customers expect seamless, instant communication solutions that match the sophistication of modern fintech platforms. Yet many traditional financial institutions still struggle with outdated IVR systems, fragmented communication channels, and compliance challenges that hinder customer experience and operational efficiency.</p><p>The statistics are striking: 73% of banking customers now expect immediate video support for complex issues, while 60% hang up on legacy IVR systems before reaching an agent. With traditional support calls costing $12.50 compared to just $3.20 for video solutions, the financial case for transformation is compelling.</p><h2 id="the-banking-communication-crisis-more-than-just-customer-frustration">The Banking Communication Crisis: More Than Just Customer Frustration</h2><h3 id="retail-bankings-pain-points">Retail Banking's Pain Points</h3><p>Modern retail banking faces a perfect storm of communication challenges. Legacy IVR systems create frustrating customer experiences, leading to abandoned calls and decreased satisfaction scores. Long wait times for account queries and transaction disputes have become the norm, while customers increasingly demand visual assistance for complex financial products.</p><p>The fragmentation between mobile apps, web portals, and branch services creates inconsistent experiences that erode customer trust and loyalty. When customers can't get quick, effective support, they look elsewhere.</p><h3 id="wealth-managements-remote-challenge">Wealth Management's Remote Challenge</h3><p>Wealth management has been particularly impacted by the shift toward remote interactions. Financial advisors struggle with limited consultation capabilities, making it difficult to maintain strong client relationships without in-person meetings.</p><p>Traditional scheduling conflicts and no-shows for financial planning sessions waste valuable advisor time, while compliance challenges with unrecorded client interactions create regulatory risks. The inability to conduct secure screen sharing for portfolio reviews limits advisors' ability to provide comprehensive service.</p><h3 id="corporate-bankings-complexity">Corporate Banking's Complexity</h3><p>Corporate banking faces its own unique challenges. Complex loan approval processes often require multiple in-person meetings, creating delays that can impact business financing timelines. Document verification processes create bottlenecks, while relationship manager accessibility issues frustrate enterprise clients who expect immediate attention.</p><p>Trade finance communication, with its intricate requirements and multiple stakeholders, becomes particularly cumbersome without proper video communication infrastructure.</p><h2 id="the-solution-banking-grade-video-communication">The Solution: Banking-Grade Video Communication</h2><h3 id="instant-deployment-that-actually-works">Instant Deployment That Actually Works</h3><p>Modern banking institutions need solutions that can deploy quickly without compromising security or compliance. The ideal platform should go live within days, not months, with pre-configured compliance settings specifically designed for financial services.</p><p>Integration complexity has historically been a major barrier, but contemporary solutions eliminate this challenge by working seamlessly with existing core banking systems. The result is immediate ROI through enhanced productivity and customer satisfaction.</p><h3 id="security-and-compliance-built-in">Security and Compliance Built-In</h3><p>Banking-grade security isn't optional—it's fundamental. End-to-end encryption for all sensitive financial discussions, combined with GDPR, HIPAA, and SOC compliance built into the platform architecture, ensures regulatory requirements are met from day one.</p><p>Comprehensive audit trails provide the documentation needed for regulatory reporting, while role-based access controls with multi-factor authentication maintain security standards across all user levels.</p><h3 id="banking-specific-features-that-matter">Banking-Specific Features That Matter</h3><p>Video KYC capabilities streamline customer onboarding with integrated document verification. Secure screen sharing enables portfolio reviews and financial planning sessions, while digital signature integration accelerates loan document processing.</p><p>CRM integration with major banking platforms like Salesforce Financial Cloud and Temenos ensures data consistency across systems, while AI-powered features provide automated call summaries, sentiment analysis, and predictive customer insights.</p><h2 id="real-world-results-across-banking-segments">Real-World Results Across Banking Segments</h2><h3 id="retail-banking-transformation">Retail Banking Transformation</h3><p>Banks implementing comprehensive video communication solutions see dramatic improvements in customer experience metrics. Video KYC processes reduce onboarding time while maintaining security standards. Real-time transaction dispute resolution with screen sharing capabilities eliminates the frustration of phone-only support.</p><p>The results speak for themselves: 40% reduction in support costs combined with 65% improvement in customer satisfaction scores demonstrate the tangible impact of modern communication technology.</p><h3 id="wealth-management-enhancement">Wealth Management Enhancement</h3><p>For wealth management, video communication transforms advisor-client relationships. Secure 1:1 consultations with screen sharing enable real-time market analysis discussions and investment strategy presentations. Recording capabilities ensure compliance while providing valuable reference materials for clients.</p><p>Successful implementations show 35% increases in assets under management and 50% improvements in client retention rates, directly impacting revenue and long-term relationship value.</p><h3 id="corporate-banking-efficiency">Corporate Banking Efficiency</h3><p>Corporate banking benefits from video-enabled loan application reviews and real-time document verification. Multi-party business meetings for complex financing structures become more efficient and productive, while maintaining the security standards required for sensitive business discussions.</p><p>The efficiency gains are substantial: 45% faster loan approval times and 30% increases in business banking revenue demonstrate the competitive advantage that effective communication technology provides.</p><h3 id="compliance-and-risk-management">Compliance and Risk Management</h3><p>Perhaps nowhere is the impact more significant than in compliance and fraud management. Secure video interviews for fraud case resolution, combined with automated audit trail generation, streamline previously time-intensive processes.</p><p>Compliance officer oversight capabilities with session monitoring ensure regulatory requirements are met while reducing administrative burden. Organizations report 85% reductions in compliance documentation time and 60% faster fraud resolution.</p><h2 id="the-technology-advantage">The Technology Advantage</h2><h3 id="industry-specific-expertise">Industry-Specific Expertise</h3><p>Banking communication solutions must understand the unique requirements of financial services. Pre-built workflows for retail banking, wealth management, corporate banking, and compliance eliminate the need for extensive customization while ensuring best practices are followed from implementation.</p><p>Proven implementations across diverse banking models provide confidence that solutions will work effectively regardless of institutional size or complexity.</p><h3 id="rapid-deployment-and-roi">Rapid Deployment and ROI</h3><p>Unlike traditional banking system implementations that can take months or years, modern video communication platforms can be deployed in days. This rapid deployment translates to immediate productivity gains and faster return on investment.</p><p>The economic advantages are clear: transparent, usage-based pricing eliminates the unpredictable costs associated with per-session fees, while unified platforms reduce vendor complexity and management overhead.</p><h3 id="technical-excellence-for-banking">Technical Excellence for Banking</h3><p>Custom WebRTC SDK optimization for banking applications ensures optimal performance, while banking-grade security standards provide the protection financial institutions require. Infinite scalability supports institutional growth without performance degradation.</p><h2 id="implementation-a-proven-framework">Implementation: A Proven Framework</h2><h3 id="week-1-foundation-setup">Week 1: Foundation Setup</h3><p>The implementation process begins with banking-grade account creation and multi-factor authentication setup. Role-based agent configuration ensures different banking departments have appropriate access levels, while compliance-ready room configurations enable audit trail functionality from day one.</p><p>Custom branding integration maintains institutional identity throughout the customer experience.</p><h3 id="week-2-team-enablement">Week 2: Team Enablement</h3><p>Training modules tailored specifically for banking professionals ensure rapid adoption without extensive learning curves. Workflow customization matches existing banking processes, while integration with current CRM and core systems maintains operational continuity.</p><p>Compliance baseline establishment and audit trail verification ensure regulatory requirements are met immediately.</p><h3 id="month-1-optimization-and-expansion">Month 1: Optimization and Expansion</h3><p>AI insights implementation provides valuable customer behaviour analysis, while advanced compliance features support sophisticated regulatory requirements. Cross-department expansion enables organization-wide benefits, and custom SDK integration extends capabilities to mobile banking applications.</p><h2 id="the-financial-case-for-change">The Financial Case for Change</h2><h3 id="quantifiable-roi-across-banking-functions">Quantifiable ROI Across Banking Functions</h3><p>The financial benefits of modern video communication extend across all banking functions. Customer support cost reductions from $12.50 per traditional call to $3.20 per video call create substantial annual savings for institutions handling thousands of customer interactions.</p><p>Wealth management sees direct revenue impact through increased client capacity per advisor. An average increase of 15 additional clients per advisor, at $2,500 annual revenue per client, generates $37,500 in additional annual revenue per advisor.</p><p>Loan processing efficiency improvements from 21-day to 12-day approval times represent a 43% improvement that directly impacts customer satisfaction and competitive positioning.</p><p>Compliance cost reductions are equally impressive, with automated documentation reducing compliance officer time from 4 hours to 30 minutes per week, creating annual savings of $45,000 per compliance officer.</p><h2 id="looking-forward-the-future-of-banking-communication">Looking Forward: The Future of Banking Communication</h2><h3 id="strategic-entry-points">Strategic Entry Points</h3><p>Different banking departments can benefit from tailored implementation approaches. Retail banking teams might start with customer support enhancement pilots, while wealth management divisions focus on advisor-client consultation optimization.</p><p>Corporate banking units can launch with loan application and business relationship management improvements, while compliance departments deploy solutions for audit trail enhancement and regulatory documentation.</p><p>Digital banking teams have unique opportunities to integrate video communication with mobile banking applications and video KYC processes.</p><h3 id="immediate-next-steps">Immediate Next Steps</h3><p>The path forward involves customized demonstration environments that match specific institutional needs, with pre-configured banking workflows that provide immediate value demonstration. Full platform access with banking compliance features enables comprehensive evaluation.</p><p>Technical deep-dives with banking solutions engineering teams ensure implementation questions are addressed, while ROI calculations based on institution-specific metrics provide clear financial justification.</p><h2 id="conclusion-the-choice-is-clear">Conclusion: The Choice is Clear</h2><p>Modern banking customers expect sophisticated communication options that match their digital experiences in other industries. Financial institutions that continue to rely on outdated communication systems risk losing customers to more agile competitors who prioritize user experience.</p><p>The combination of immediate deployment, bank-grade security, comprehensive compliance features, and proven ROI makes video communication technology not just an upgrade, but a competitive necessity.</p><p>Whether the focus is retail banking customer experience, wealth management client relationships, corporate banking efficiency, or regulatory compliance, modern video communication platforms adapt to institutional needs while delivering measurable results.</p><p>The banking industry stands at a communication crossroads. Institutions can continue managing communication complexity while fin-tech competitors gain market share, or they can deploy modern solutions that focus on what matters most: customer satisfaction, regulatory compliance, and institutional growth.</p><p>For banking leaders ready to transform their communication infrastructure, the technology exists today to implement comprehensive video communication solutions that deliver immediate results while supporting long-term strategic objectives. The question isn't whether to modernize communication systems, but how quickly institutions can implement solutions that their customers already expect.</p><p><strong>📅 Schedule a Demo</strong> Experience Samvyo firsthand with a personalised walkthrough tailored to your industry and requirements. 👉 <a href="https://cal.com/saurav-panda-luodk2/samvyo-demo?ref=samvyo.com" rel="noreferrer">Book a Demo with Our Team</a></p><p><strong>📞 Talk to a Specialist</strong> Have specific questions about on-premise deployment, compliance, or integration? Our team of experts is ready to assist. 👉 <a href="https://samvyo.com/demo?ref=samvyo.com" rel="noreferrer">Schedule a Consultation</a></p><p><strong>📧 Get in Touch</strong> Prefer to start with an email? Reach out to our enterprise solutions team directly. 👉 <a href="https://samvyo.com/contact?ref=samvyo.com" rel="noreferrer">Contact Us</a></p>]]></content:encoded></item><item><title><![CDATA[How Samvyo Transforms Guest Experience and Hotel Operations]]></title><description><![CDATA[Samvyo transforms hotel operations with QR-powered video support, enabling instant guest services, seamless check-ins, and efficient staff coordination—elevating the guest experience from arrival to checkout.]]></description><link>https://www.samvyo.com/blog/how-samvyo-transforms-guest-experience-and-hotel-operations/</link><guid isPermaLink="false">688a0bce8b45c3f0cd639f0a</guid><category><![CDATA[Guest Experience Solutions]]></category><category><![CDATA[#pratik]]></category><dc:creator><![CDATA[Saurav K. Panda]]></dc:creator><pubDate>Thu, 31 Jul 2025 16:36:52 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1660557989695-14fac79c086d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fGhvdGVsJTIwcmVjZXB0aW9ufGVufDB8fHx8MTc1Mzk2MzcyMXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1660557989695-14fac79c086d?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fGhvdGVsJTIwcmVjZXB0aW9ufGVufDB8fHx8MTc1Mzk2MzcyMXww&ixlib=rb-4.1.0&q=80&w=2000" alt="How Samvyo Transforms Guest Experience and Hotel Operations"/><p>In today's hyper-competitive hospitality landscape, <strong>hotels, resorts, and hospitality businesses</strong> face unprecedented challenges in delivering exceptional guest experiences while managing complex operations efficiently. Modern travellers expect instant, personalized, and seamless interactions from booking to checkout and beyond.</p><p>Our powerful platforms, <strong>Samvyo Meet</strong> (Video Conferencing) and <strong>Samvyo Meetnow</strong> (Contact Center Solution), help hospitality businesses connect with guests in real-time, build trust through transparent communication, and deliver exceptional service throughout the entire guest journey.</p><p><strong>Here's how your hospitality business benefits:</strong></p><h4 id="%E2%80%A2-seamless-website-integration-with-embedded-call-link-or-qr-code">• Seamless website integration with embedded call link or QR code</h4><p><em>Let your website visitors launch instant live video-audio calls from your booking page --- no apps to download, no barriers to communication.</em></p><h4 id="%E2%80%A2-no-phone-numbers-neededjust-click-and-connect">• No phone numbers needed --- just click and connect</h4><p><em>Enable guests to connect securely without sharing personal information — friction-less and privacy-first communication.</em></p><h4 id="%E2%80%A2-smart-call-transcriptions-actionable-insights-and-analytics">• Smart call transcriptions, actionable insights, and analytics</h4><p><em>AI-powered tracking turns every guest interaction into valuable data --- from booking preferences to service requests.</em></p><h4 id="%E2%80%A2-effortless-pms-integration-on-demand">• Effortless PMS integration on demand</h4><p><em>All calls, guest notes, and service requests sync smoothly into your Property Management System for better tracking and personalized service.</em></p><h2 id="transform-your-website-into-a-virtual-concierge">Transform Your Website into a Virtual Concierge</h2><p>Your website is no longer just a booking platform --- it's your <strong>virtual front desk</strong>.</p><p>With Samvyo, you can:</p><ul><li>Host <strong>live virtual property tours</strong> for potential guests</li></ul><p><em>With Samvyo Meet, your sales team can conduct real-time video walk-throughs of rooms, amenities, and facilities — giving guests a comprehensive view of your property from anywhere in the world.</em></p><ul><li>Run <strong>interactive pre-arrival consultations</strong> to personalize guest experiences</li></ul><p><em>Using Samvyo Meetnow, connect incoming inquiries instantly to your guest services team for real-time video or audio sessions --- discussing special requests, dietary preferences, or activity planning before arrival.</em></p><ul><li>Engage prospects with <strong>personalized service demos and amenity showcases</strong></li></ul><p><em>Samvyo's browser-based video interface lets you provide one-on-one virtual concierge services --- showcasing spa treatments, restaurant offerings, or local attractions to build excitement and trust.</em></p><p><em>This instant and interactive experience leads to </em><strong>higher conversion rates</strong><em> and </em><strong>increased direct bookings</strong><em>.</em></p><h2 id="route-guests-to-the-right-department-%E2%80%94-instantly">Route Guests to the Right Department — Instantly</h2><p>Every guest inquiry is unique --- some need help with reservations, others with dining, spa services, or local attractions.</p><p><em>Samvyo's </em><strong>smart routing system</strong><em> ensures:</em></p><ul><li>Guests are connected to the right department (front desk, concierge, housekeeping, dining, spa) in real time</li></ul><p><em>Samvyo Meetnow's intelligent routing instantly identifies the guest's needs and connects them via live video or audio call to the exact team member who can help --- no transfers or wait times.</em></p><ul><li>No missed requests or lost opportunities</li></ul><p><strong>Our system ensures every guest inquiry is tracked, routed, and responded to --- minimizing service gaps and ensuring no guest need goes unaddressed.</strong></p><ul><li><em>A smoother, more professional hospitality experience</em></li></ul><p><strong>By instantly directing guests to the right expert, Samvyo creates a seamless, luxury-grade interaction — one that feels personalized, efficient, and five-star from the very first touch-point.</strong></p><h2 id="enhance-the-entire-guest-journey">Enhance the Entire Guest Journey</h2><p>Samvyo enables you to <strong>deliver exceptional service</strong> at every stage of the guest experience:</p><ul><li><strong>Pre-Arrival Virtual Concierge</strong></li></ul><p><strong>With Samvyo Meetnow, guests can access live video consultations for trip planning, special arrangements, or property information --- creating anticipation and ensuring their needs are understood before they arrive.</strong></p><ul><li><strong>In-Stay Real-Time Support</strong></li></ul><p><strong>Guests can initiate instant video or audio calls from their room or anywhere on the property for immediate assistance --- from room service orders to technical support or local recommendations.</strong></p><ul><li><strong>Virtual Room Service and Maintenance</strong></li></ul><p><strong>Staff can provide visual guidance for in-room amenities, troubleshoot issues remotely, or take detailed service requests through live video calls --- ensuring faster resolution and higher satisfaction.</strong></p><p><em>This comprehensive support approach increases </em><strong>guest satisfaction scores</strong><em> and drives </em><strong>positive reviews</strong><em> and </em><strong>repeat bookings</strong><em>.</em></p><h2 id="build-trust-with-personalized-guest-relations">Build Trust with Personalized Guest Relations</h2><p>In hospitality, trust and personal connection drive loyalty. Samvyo empowers your team to deliver:</p><ul><li><strong>Face-to-face guest services</strong></li></ul><p><strong>With Samvyo Meet, your team can provide real-time, personal interactions that build relationships --- whether it's helping with special celebrations, addressing concerns, or providing local insights.</strong></p><ul><li><strong>Proactive guest outreach</strong></li></ul><p><strong>Samvyo Meetnow enables automated and personalized follow-ups throughout the guest journey --- from pre-arrival welcome calls to post-stay satisfaction surveys.</strong></p><ul><li><strong>Transparent, secure communication directly from your website</strong></li></ul><p><strong>Guests can initiate private, real-time conversations from your booking platform --- no phone numbers needed --- creating a comfortable space for honest feedback and special requests.</strong></p><p><em>These personal touches create </em><strong>memorable experiences</strong><em> that distinguish your property and build lasting guest loyalty.</em></p><h2 id="unlock-guest-intelligence-from-every-interaction">Unlock Guest Intelligence from Every Interaction</h2><p>Every conversation with a guest reveals valuable insights about preferences, pain points, and opportunities.</p><p>With Samvyo's AI-powered engagement intelligence, you gain access to:</p><ul><li><strong>Pre-call guest context</strong> to prepare your team</li></ul><p><em>Samvyo Meetnow equips your staff with real-time guest insights --- such as booking history, preferences, past interactions, and special occasions --- so they're fully prepared to provide personalized service.</em></p><ul><li><strong>In-call enhancements</strong> to support staff during conversations</li></ul><p><em>Smart prompts, sentiment detection, and real-time suggestions guide your team during video or audio calls, helping them respond appropriately, anticipate needs, and exceed expectations.</em></p><ul><li><strong>Post-call analytics</strong> to track satisfaction and improve service delivery</li></ul><p><em>Every interaction is transcribed, analyzed, and turned into insights --- revealing patterns in guest preferences, common requests, and opportunities to enhance your service offerings.</em></p><p><em>This data helps you </em><strong>understand guest expectations</strong><em>, refine your service standards, and improve staff performance across all touch-points.</em></p><h2 id="why-samvyo-is-built-for-hospitality-excellence">Why Samvyo Is Built for Hospitality Excellence</h2><p>From your booking process to post-stay engagement, Samvyo is designed to help hospitality businesses:</p><p>✅ Convert website visitors into direct bookings<br>✅ Route guest inquiries to the right specialist<br>✅ Build relationships through personalized service<br>✅ Manage guest services with real-time efficiency<br>✅ Turn guest insights into operational improvements</br></br></br></br></p><p>Whether you're a boutique hotel, luxury resort, or hospitality chain, <strong>Samvyo scales with your needs</strong> --- making every guest feel like a VIP while streamlining your operations.</p><p><strong>Let Samvyo transform your property into a real-time guest engagement destination where exceptional service meets cutting-edge technology.</strong></p><hr><p><em>Ready to elevate your guest experience? Discover how Samvyo's enterprise-grade video solutions can transform your hospitality operations with seamless integration, AI-driven insights, and 24/7 support by taking to an expert. Book a </em><a href="https://samvyo.com/demo?ref=samvyo.com" rel="noreferrer"><em>demo</em></a><em>, here!</em></p></hr>]]></content:encoded></item><item><title><![CDATA[Twilio's VoIP Price Surge: Why Now is the Perfect Time to Switch to Samvyo's Revolutionary Communication Platform]]></title><description><![CDATA[Twilio hiked prices 88%. Samvyo eliminates phone numbers entirely—customers scan QR codes, see all departments visually, connect instantly. No more "Press 1 for Sales" frustration. Skip price hikes, revolutionize communication instead.]]></description><link>https://www.samvyo.com/blog/twilios-voip-price-surge-why-now-is-the-perfect-time-to-switch-to-samvyos-revolutionary-communication-platform/</link><guid isPermaLink="false">68827e598b45c3f0cd639eeb</guid><category><![CDATA[Next-Gen Communication Beyond VoIP]]></category><category><![CDATA[#pratik]]></category><dc:creator><![CDATA[Saurav K. Panda]]></dc:creator><pubDate>Thu, 24 Jul 2025 19:48:48 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2025/07/VoIP-vs-Samvyo-Final.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2025/07/VoIP-vs-Samvyo-Final.png" alt="Twilio's VoIP Price Surge: Why Now is the Perfect Time to Switch to Samvyo's Revolutionary Communication Platform"/><p>The communications landscape just got more expensive. Twilio recently announced significant price increases for their Voice US SIP Trunking routes, effective August 13, 2025. For businesses relying on VoIP communications, this represents a substantial cost escalation that demands immediate attention—and an opportunity to embrace a fundamentally better approach to business communications.</p><h2 id="the-price-shock-what-twilio-users-are-facing">The Price Shock: What Twilio Users Are Facing</h2><p>Twilio's latest pricing update delivers a harsh reality check for businesses:</p><ul><li><strong>US 48 States (Zone 1)</strong>: Price jumping from $0.0053 to $0.0100 per minute - an <strong>88% increase</strong></li><li><strong>US High Cost Areas (Zone 4)</strong>: Escalating from $0.0420 to $0.0620 per minute - a <strong>48% increase</strong></li></ul><p>For businesses processing thousands of minutes monthly, these increases translate to hundreds or thousands of dollars in additional operational costs. A company handling 10,000 minutes per month in Zone 1 will see their costs rise from $53 to $100 monthly - nearly doubling their VoIP expenses.</p><h2 id="the-fundamental-problem-with-traditional-voip-systems">The Fundamental Problem with Traditional VoIP Systems</h2><p>Beyond cost increases, traditional VoIP providers like Twilio operate on an outdated model that limits modern business potential:</p><h3 id="phone-number-dependency">Phone Number Dependency</h3><p>Traditional VoIP applications, including Twilio's services, are fundamentally tied to telecom phone numbers. This creates several limitations:</p><ul><li><strong>Geographic constraints</strong> that limit global accessibility</li><li><strong>Carrier dependency</strong> that introduces additional costs and complexity</li><li><strong>Scalability issues</strong> when expanding to new markets or regions</li><li><strong>Maintenance overhead</strong> for managing multiple phone number allocations</li></ul><h3 id="limited-ivr-capabilities">Limited IVR Capabilities</h3><p>Conventional Interactive Voice Response (IVR) systems suffer from:</p><ul><li><strong>Rigid menu structures</strong> that frustrate callers with "Press 1 for Sales, Press 2 for Support" navigation</li><li><strong>Sequential menu limitation</strong> forcing customers to listen through entire option lists</li><li><strong>Department routing delays</strong> requiring multiple button presses and wait times</li><li><strong>Limited personalization</strong> options</li><li><strong>Poor integration</strong> with modern business workflows</li><li><strong>Outdated user experience</strong> that feels disconnected from digital-first interactions</li></ul><h2 id="enter-samvyo-revolutionizing-business-communications">Enter Samvyo: Revolutionizing Business Communications</h2><p>While Twilio users grapple with increased costs and outdated technology, Samvyo offers a fundamentally different approach that transcends traditional VoIP limitations.</p><h3 id="beyond-phone-numbers-qr-based-communication-revolution">Beyond Phone Numbers: QR-Based Communication Revolution</h3><p>Samvyo pioneered <strong>QR-based communication systems</strong> that eliminate the need for traditional phone numbers and frustrating menu navigation entirely:</p><ul><li><strong>Instant Visual Access</strong>: Customers scan a QR code to see all available departments and services in a clear, visual interface</li><li><strong>Direct Department Connection</strong>: Skip the "Press 1 for Sales, Press 2 for Support" maze—customers simply tap their desired department for immediate connection</li><li><strong>Real-time Availability</strong>: Live indicators show which departments are available for instant assistance</li><li><strong>Zero Geographic Limitations</strong>: No need for local phone numbers in different regions</li><li><strong>Seamless Integration</strong>: QR codes can be embedded in marketing materials, websites, products, or physical locations</li><li><strong>Enhanced Analytics</strong>: Track department preferences and communication patterns in ways impossible with traditional phone systems</li><li><strong>Cost Elimination</strong>: No telecom carrier fees or phone number maintenance costs</li></ul><h3 id="intelligent-voice-agents-vs-static-chatbots">Intelligent Voice Agents vs. Static Chatbots</h3><p>While competitors offer basic chatbot functionality, Samvyo enables organizations to develop and integrate <strong>sophisticated voice agents</strong> that deliver genuinely human-like interactions:</p><h4 id="advanced-voice-intelligence">Advanced Voice Intelligence</h4><ul><li><strong>Natural conversation flow</strong> that understands context and intent</li><li><strong>Emotional intelligence</strong> capabilities that respond appropriately to customer sentiment</li><li><strong>Multi-language support</strong> with native-level fluency</li><li><strong>Dynamic learning</strong> that improves with each interaction</li></ul><h4 id="on-demand-lively-interactive-experience">On-demand Lively Interactive Experience</h4><p>Unlike static chatbots that follow predetermined scripts, Samvyo's voice agents provide:</p><ul><li><strong>Adaptive responses</strong> based on real-time conversation analysis</li><li><strong>Personality customization</strong> that reflects your brand voice and values</li><li><strong>Complex problem-solving</strong> capabilities that go beyond simple FAQ responses</li><li><strong>Seamless escalation</strong> to human agents when necessary</li></ul><h3 id="revolutionary-ivr-alternative-visual-department-selection">Revolutionary IVR Alternative: Visual Department Selection</h3><p>Samvyo's platform completely reimagines the traditional IVR experience by eliminating the frustrating "Press 1, Press 2" navigation system:</p><h4 id="instant-visual-department-access">Instant Visual Department Access</h4><ul><li><strong>QR code scanning</strong> reveals a visual interface showing all available departments</li><li><strong>One-click department selection</strong> directly connects customers to the right team</li><li><strong>Live assistance indicators</strong> showing real-time availability of each department</li><li><strong>Instant connection</strong> without waiting through menu options or hold music</li><li><strong>Department descriptions</strong> helping customers choose the most appropriate service</li></ul><h4 id="integration-first-design">Integration-First Design</h4><ul><li><strong>API-native architecture</strong> that connects seamlessly with existing business systems</li><li><strong>Real-time data access</strong> for informed, personalized interactions</li><li><strong>Workflow automation</strong> that reduces manual intervention</li><li><strong>Omnichannel consistency</strong> across all communication touchpoints</li></ul><h4 id="on-demand-smart-voice-navigation">On-demand Smart Voice Navigation</h4><ul><li><strong>Conversational interfaces</strong> that understand natural language requests when voice interaction is preferred</li><li><strong>Predictive routing</strong> that anticipates customer needs based on previous interactions</li><li><strong>Contextual awareness</strong> that remembers customer history and preferences</li><li><strong>Personalized experiences</strong> tailored to individual customer profiles</li></ul><h2 id="the-samvyo-advantage-technology-that-transforms-business">The Samvyo Advantage: Technology That Transforms Business</h2><h3 id="cost-effective-excellence-without-telecom-dependencies">Cost-Effective Excellence Without Telecom Dependencies</h3><p>Unlike traditional providers that impose sudden price hikes and carrier fees, Samvyo offers:</p><ul><li><strong>Transparent, predictable pricing</strong> with no hidden telecom costs</li><li><strong>No phone number licensing fees</strong> or carrier dependency charges</li><li><strong>Scalable architecture</strong> that grows with your business without proportional cost increases</li><li><strong>Elimination of traditional telephony infrastructure</strong> requirements</li></ul><h3 id="custom-integration-capabilities">Custom Integration Capabilities</h3><p>Where Twilio offers one-size-fits-all solutions, Samvyo specializes in:</p><ul><li><strong>Bespoke voice agent development</strong> tailored to your specific industry and use cases</li><li><strong>Custom workflow integration</strong> that aligns with your existing business processes</li><li><strong>Brand-specific personality development</strong> for your voice agents</li><li><strong>Specialized industry solutions</strong> that understand sector-specific requirements</li></ul><h3 id="advanced-technology-stack">Advanced Technology Stack</h3><p>Our modern infrastructure leverages cutting-edge AI and communication technology:</p><ul><li><strong>Crystal-clear voice quality</strong> through advanced audio processing</li><li><strong>Real-time language processing</strong> with contextual understanding</li><li><strong>Seamless video integration</strong> capabilities for multi-modal communications</li><li><strong>Robust API ecosystem</strong> for easy integration with existing systems</li><li><strong>Enterprise-grade security</strong> with end-to-end encryption</li></ul><h3 id="predictable-pricing-model">Predictable Pricing Model</h3><p>While Twilio surprises users with dramatic price increases, Samvyo commits to:</p><ul><li><strong>Transparent, stable pricing</strong> that enables accurate budgeting</li><li><strong>No surprise carrier fees</strong> or telecom-related cost escalations</li><li><strong>Value-based pricing</strong> that scales with your business success</li><li><strong>Comprehensive cost analysis</strong> to demonstrate clear ROI</li></ul><h2 id="real-world-applications-qr-based-communication-in-action">Real-World Applications: QR-Based Communication in Action</h2><h3 id="retail-and-hospitality">Retail and Hospitality</h3><ul><li><strong>Product support</strong>: QR codes on products that instantly display support options—customers can visually select from Technical Support, Warranty Claims, or User Guides for immediate live assistance</li><li><strong>Restaurant ordering</strong>: Table-based QR codes showing visual menu categories—diners can directly connect to Kitchen Staff, Sommelier, or Manager without navigating phone menus</li><li><strong>Hotel services</strong>: Room-specific QR codes displaying all hotel services—guests can instantly connect to Housekeeping, Concierge, Room Service, or Front Desk with one tap</li><li><strong>Automobile Sales Enablement: </strong>From the dealer’s website, customers can click a link or scan a QR code to instantly explore 360° virtual car tours, check financing and exchange options, schedule test drives, connect directly with a sales expert, or access post-sales service assistants for maintenance scheduling and support.</li></ul><h3 id="healthcare-and-professional-services">Healthcare and Professional Services</h3><ul><li><strong>Patient intake</strong>: QR-based interface showing Appointment Scheduling, Insurance Verification, or Medical Records departments with live availability indicators</li><li><strong>Consultation scheduling</strong>: Visual selection between different specialists, appointment types, or urgency levels for direct connection</li><li><strong>Follow-up care</strong>: Patients can easily choose between Prescription Refills, Test Results, or General Questions without phone menu navigation</li><li><strong>Medical Device Assistance: </strong>QR codes on medical devices enable real-time live video assistance for setup guidance, troubleshooting support, warranty verification, and instant expert help, eliminating delays and miscommunication.</li></ul><h3 id="b2b-and-enterprise">B2B and Enterprise</h3><ul><li><strong>Lead qualification</strong>: Prospects scan QR codes to visually select from Sales, Technical Consulting, or Partnership inquiries for immediate expert connection</li><li><strong>Technical support</strong>: Visual interface showing different product lines or support tiers, connecting directly to specialized technical teams</li><li><strong>Sales enablement</strong>: Customers can instantly choose between Product Demos, Pricing Information, or Implementation Support</li></ul><h2 id="the-migration-advantage-from-legacy-to-innovation">The Migration Advantage: From Legacy to Innovation</h2><p>Switching from Twilio to Samvyo isn't just about cost savings—it's about fundamentally upgrading your communication capabilities while eliminating traditional telephony limitations.</p><h3 id="seamless-transition-process">Seamless Transition Process</h3><p>Our technical team specializes in smooth migrations that:</p><ul><li><strong>Eliminate downtime</strong> during the transition period</li><li><strong>Preserve existing integrations</strong> while enabling new capabilities</li><li><strong>Provide comprehensive training</strong> on advanced voice agent capabilities</li><li><strong>Offer ongoing support</strong> to maximize platform utilization</li></ul><h3 id="enhanced-feature-set-beyond-traditional-voip">Enhanced Feature Set Beyond Traditional VoIP</h3><p>Samvyo's platform includes capabilities impossible with traditional phone-based systems:</p><ul><li><strong>QR-based instant connection</strong> for immediate customer engagement</li><li><strong>AI-powered voice agents</strong> that provide genuinely helpful interactions</li><li><strong>Advanced analytics and insights</strong> into customer communication patterns</li><li><strong>Multi-modal communication</strong> combining voice, video, and data</li><li><strong>Personalization at scale</strong> through intelligent customer profiling</li></ul><h2 id="making-the-smart-move-from-traditional-to-transformational">Making the Smart Move: From Traditional to Transformational</h2><p>Twilio's price increases represent more than just higher costs—they highlight the limitations of legacy telephony-based communication systems. Smart businesses recognize this moment as an opportunity to embrace communication technology designed for the digital age.</p><h3 id="your-strategic-action-plan">Your Strategic Action Plan</h3><ol><li><strong>Assess Current Limitations</strong>: Calculate not just Twilio's cost increases, but the opportunity costs of phone number dependency and limited IVR capabilities</li><li><strong>Explore QR-Based Solutions</strong>: Understand how eliminating phone numbers can transform customer engagement and reduce operational complexity</li><li><strong>Design Voice Agent Strategy</strong>: Work with Samvyo to develop voice agents that reflect your brand personality and business expertise</li><li><strong>Plan Comprehensive Migration</strong>: Design a transition strategy that maximizes new capabilities while ensuring business continuity</li><li><strong>Implement and Scale</strong>: Begin leveraging advanced communication technology that grows with your business needs</li></ol><h2 id="the-bottom-line-beyond-cost-savings-to-communication-evolution">The Bottom Line: Beyond Cost Savings to Communication Evolution</h2><p>While Twilio users face unwelcome billing surprises, you have the power to transcend traditional communication limitations entirely. Samvyo's platform represents a fundamental evolution beyond VoIP—offering QR-based accessibility, intelligent voice agents, and revolutionary IVR alternatives that create genuinely superior customer experiences.</p><p>Don't let price increases dictate your communication strategy. Instead, leverage this moment to upgrade to a platform that eliminates phone number dependencies, enables truly intelligent customer interactions, and positions your business at the forefront of communication innovation.</p><p>The difference between Samvyo and traditional providers isn't just about features or pricing—it's about embracing a communication paradigm designed for modern business success.</p><p><strong>Ready to explore how Samvyo can revolutionize your communication infrastructure while eliminating traditional telephony constraints?</strong> <a href="https://samvyo.com/contact?ref=samvyo.com" rel="noreferrer">Contact</a> our team today for a personalized consultation and discover why forward-thinking businesses are making the leap from phone-based limitations to QR-enabled, AI-powered communication excellence.</p><p><em>The telecommunications landscape is evolving rapidly. Make sure you're positioned with technology that transcends traditional limitations and enables unprecedented customer engagement.</em></p>]]></content:encoded></item><item><title><![CDATA[How Healthcare Communications Can Samvyo Improve for Better Healthcare Outcomes?]]></title><description><![CDATA[Exploring custom real-time video/voice calling platforms that integrate seamlessly into your healthcare brand enabling patients /stake-holders to connect through your trusted ecosystem while improving care coordination, satisfaction, and operational efficiency.]]></description><link>https://www.samvyo.com/blog/how-healthcare-communications-can-samvyo-improve-for-better-healthcare-outcomes/</link><guid isPermaLink="false">687e62db8b45c3f0cd639ec8</guid><category><![CDATA[Healthcare Communication]]></category><category><![CDATA[#pratik]]></category><category><![CDATA[Patient Engagement]]></category><category><![CDATA[Remote Care]]></category><category><![CDATA[EHR Integration]]></category><category><![CDATA[Custom Platform]]></category><category><![CDATA[Healthcare Outcomes]]></category><dc:creator><![CDATA[Saurav K. Panda]]></dc:creator><pubDate>Mon, 21 Jul 2025 17:04:48 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1639432522665-12c11347b61a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDEwOXx8aGVhbHRoY2FyZSUyMG9wZXJhdGlvbnN8ZW58MHx8fHwxNzUzMTE3Mzg0fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<h2 id="the-hidden-crisis-in-healthcare-communication">The Hidden Crisis in Healthcare Communication</h2><img src="https://images.unsplash.com/photo-1639432522665-12c11347b61a?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDEwOXx8aGVhbHRoY2FyZSUyMG9wZXJhdGlvbnN8ZW58MHx8fHwxNzUzMTE3Mzg0fDA&ixlib=rb-4.1.0&q=80&w=2000" alt="How Healthcare Communications Can Samvyo Improve for Better Healthcare Outcomes?"/><p>Healthcare today faces an invisible epidemic that's costing the industry billions and compromising patient outcomes: fragmented communication. While medical technology has advanced dramatically, the way patients and providers communicate remains stuck in silos that create friction, frustration, and potentially life-threatening gaps in care.</p><p>Recent studies reveal that <strong>85% of healthcare support tickets</strong> stem from communication breakdowns between patients, providers, and healthcare systems. These aren't just minor inconveniences—they represent critical moments where patients struggle to access care, understand their treatment, or navigate complex healthcare systems.</p><h2 id="the-ripple-effect-of-communication-gaps">The Ripple Effect of Communication Gaps</h2><h3 id="patient-experience-breakdown">Patient Experience Breakdown</h3><p>When communication fails, patients experience:</p><ul><li><strong>Delayed care access</strong> due to confusing interfaces and disconnected systems</li><li><strong>Medication adherence issues</strong> from unclear instructions across multiple touch points</li><li><strong>Anxiety and frustration</strong> when they can't reach their care team through preferred channels</li><li><strong>Emergency room visits</strong> that could have been prevented with better remote support</li></ul><h3 id="provider-team-challenges">Provider Team Challenges</h3><p>Healthcare professionals face their own communication obstacles:</p><ul><li><strong>Information silos</strong> between departments, devices, and platforms</li><li><strong>Time drain</strong> from repetitive patient inquiries across multiple channels</li><li><strong>Coordination difficulties</strong> in remote monitoring and home health scenarios</li><li><strong>Technology fatigue</strong> from managing disparate communication tools</li></ul><h2 id="the-multi-channel-healthcare-reality">The Multi-Channel Healthcare Reality</h2><p>Modern healthcare delivery spans numerous touch points, each with its own communication challenges:</p><h3 id="hospital-systems">Hospital Systems</h3><p>Patients interact with registration, nursing, specialists, discharge planning, and billing—often through completely different communication channels. This fragmentation creates confusion and delays in care coordination.</p><h3 id="medical-equipment-integration">Medical Equipment Integration</h3><p>From home glucose monitors to cardiac devices, medical equipment generates data and alerts but often lacks intuitive communication pathways for patients to understand results or seek clarification.</p><h3 id="laboratory-services">Laboratory Services</h3><p>Test results, preparation instructions, and follow-up communications frequently exist in isolation, leaving patients uncertain about next steps and timing.</p><h3 id="home-health-services">Home Health Services</h3><p>Remote care delivery requires seamless communication between patients, caregivers, and clinical teams, yet most solutions fail to provide integrated, real-time connectivity.</p><h2 id="how-samvyos-custom-videovoice-integration-improves-specific-healthcare-scenarios">How Samvyo's Custom Video/Voice Integration Improves Specific Healthcare Scenarios</h2><h3 id="geriatric-care-communication-enhancement">Geriatric Care Communication Enhancement</h3><p>Samvyo's custom platform transforms geriatric care by integrating familiar communication methods within your brand's trusted interface. The real-time video/voice capabilities allow elderly patients to connect with their care teams using simplified, large-button interfaces while maintaining your organization's visual identity and trust signals.</p><h3 id="remote-post-hospitalization-recovery-monitoring">Remote Post-Hospitalization Recovery Monitoring</h3><p>The platform enables seamless transitions from hospital to home by providing patients with direct video/voice access to their care teams through your branded application. This custom integration ensures patients recognize and trust the communication channel while providers monitor recovery progress in real-time through their existing EHR systems.</p><h3 id="telemedicine-support-within-your-brand-ecosystem">Telemedicine Support Within Your Brand Ecosystem</h3><p>Rather than directing patients to generic video conferencing tools, Samvyo's custom integration allows you to conduct telemedicine appointments through your own branded platform. Patients remain within your digital ecosystem, strengthening brand loyalty while receiving high-quality video/voice care delivery.</p><h3 id="medical-device-integration-with-custom-communication-layer">Medical Device Integration with Custom Communication Layer</h3><p>Samvyo connects medical devices directly to your branded communication platform, allowing patients to discuss device readings, alerts, or concerns through video/voice calls without leaving your application environment. This seamless integration improves medication adherence and device compliance while maintaining your brand relationship.</p><h2 id="how-samvyo-transforms-healthcare-communications-for-better-outcomes">How Samvyo Transforms Healthcare Communications for Better Outcomes</h2><p>Samvyo addresses healthcare communication challenges through a comprehensive approach that fundamentally improves patient outcomes:</p><h3 id="custom-real-time-videovoice-calling-platform-integration">Custom Real-Time Video/Voice Calling Platform Integration</h3><p>Samvyo's core strength lies in seamlessly integrating custom real-time video and voice calling platforms directly into your existing healthcare brand. This isn't a generic solution—it's a purpose-built communication ecosystem for your brand that maintains your organization's identity while providing:</p><ul><li><strong>Instant escalation capabilities</strong> from text to video/voice without losing context</li><li><strong>Brand-consistent interface</strong> that patients recognize and trust</li><li><strong>Native integration</strong> with your existing patient portals and applications</li><li><strong>Customizable user experience</strong> tailored to your patient demographics</li><li><strong>Scalable architecture</strong> that grows with your organization's needs</li></ul><h3 id="seamless-ehr-and-crm-integration">Seamless EHR and CRM Integration</h3><p>Samvyo's platform connects directly with your Electronic Health Records and Customer Relationship Management systems, ensuring:</p><ul><li><strong>Complete communication history</strong> accessible during patient encounters</li><li><strong>Automated documentation</strong> of all patient interactions</li><li><strong>Real-time data synchronization</strong> across all care touchpoints</li><li><strong>Provider workflow optimization</strong> through integrated communication tools</li></ul><h3 id="multi-modal-accessibility-under-your-brand">Multi-Modal Accessibility Under Your Brand</h3><p>The platform supports diverse communication preferences while maintaining your brand identity across phone, web, mobile, and device-integrated communications.</p><h2 id="measuring-success-the-85-solution">Measuring Success: The 85% Solution</h2><p>Leading healthcare organizations implementing integrated communication platforms report remarkable outcomes:</p><ul><li><strong>85% reduction in support tickets</strong> through proactive, clear communication pathways</li><li><strong>Improved patient satisfaction scores</strong> from consistent, accessible support</li><li><strong>Reduced readmission rates</strong> through better post-discharge communication</li><li><strong>Enhanced provider efficiency</strong> from streamlined communication workflows</li></ul><h2 id="exploring-custom-real-time-videovoice-platform-integration-in-your-brand">Exploring Custom Real-Time Video/Voice Platform Integration in Your Brand</h2><h3 id="purpose-built-communication-excellence">Purpose-Built Communication Excellence</h3><p>Samvyo's approach to healthcare communication integration goes beyond simple software implementation. We help you integrate a fully customized real-time video/voice calling platform that appears as a natural extension of your existing brand identity.</p><p><strong>Brand Consistency Features:</strong></p><ul><li><strong>Custom visual design</strong> matching your color schemes, logos, and interface standards</li><li><strong>Personalized user workflows</strong> aligned with your patient journey mapping</li><li><strong>Branded communication templates</strong> for appointment reminders, follow-ups, and emergency protocols</li><li><strong>Native mobile and web integration</strong> within your existing patient applications</li></ul><h3 id="technical-integration-capabilities">Technical Integration Capabilities</h3><p>The custom platform seamlessly connects with your existing technology infrastructure:</p><p><strong>EHR Integration Points:</strong></p><ul><li>Real-time communication logging directly into patient records</li><li>Automated appointment scheduling from communication interactions</li><li>Provider dashboard integration showing communication history and pending items</li><li>Clinical decision support through integrated patient communication data</li></ul><p><strong>CRM System Connectivity:</strong></p><ul><li>Patient engagement scoring based on communication patterns</li><li>Automated follow-up campaign triggers from video/voice interactions</li><li>Marketing integration for patient satisfaction and referral programs</li><li>Analytics dashboard showing communication effectiveness metrics</li></ul><h3 id="implementation-process-for-your-custom-solution">Implementation Process for Your Custom Solution</h3><p>Samvyo's integration process ensures minimal disruption to your operations while maximizing the custom platform benefits:</p><ol><li><strong>Brand Assessment and Design Phase</strong> - Analyzing your current patient communication touchpoints and designing custom interface elements</li><li><strong>Technical Integration Planning</strong> - Mapping connections to your EHR, CRM, and existing patient portal systems</li><li><strong>Custom Development</strong> – Customising Samvyo’s exsisting Video/Voice templates to your brand with industry standard security practices.</li><li><strong>Staff Training and Patient Onboarding</strong> - Ensuring your team can leverage the new capabilities while patients experience seamless brand continuity</li><li><strong>Performance Monitoring and Optimization</strong> - Continuous improvement based on usage patterns and patient feedback</li></ol><h2 id="how-samvyos-custom-integration-creates-competitive-advantages">How Samvyo's Custom Integration Creates Competitive Advantages</h2><p>Healthcare organizations implementing Samvyo's custom real-time video/voice platform integration gain significant advantages:</p><h3 id="patient-experience-enhancement">Patient Experience Enhancement</h3><ul><li><strong>Brand trust amplification</strong> through consistent, familiar communication interfaces</li><li><strong>Reduced technology anxiety</strong> as patients use your trusted brand environment for all communications</li><li><strong>Improved satisfaction scores</strong> from seamless video/voice access to care teams</li><li><strong>Higher engagement rates</strong> due to integrated, convenient communication options</li></ul><h3 id="operational-excellence">Operational Excellence</h3><ul><li><strong>85% reduction in support tickets</strong> through proactive, integrated communication workflows</li><li><strong>Streamlined provider workflows</strong> with all communication tools embedded in existing systems</li><li><strong>Enhanced clinical efficiency</strong> from context-rich patient interaction history</li><li><strong>Reduced training overhead</strong> as staff work within familiar branded environments</li></ul><h3 id="strategic-brand-positioning">Strategic Brand Positioning</h3><ul><li><strong>Market differentiation</strong> through superior patient communication experiences</li><li><strong>Increased patient retention</strong> via seamless, branded care delivery</li><li><strong>Enhanced referral generation</strong> from improved patient satisfaction</li><li><strong>Future-ready infrastructure</strong> for expanding telemedicine and remote care services</li></ul><h2 id="taking-action-implementing-your-custom-samvyo-solution">Taking Action: Implementing Your Custom Samvyo Solution</h2><p>Healthcare leaders ready to explore custom real-time video/voice platform integration should consider:</p><h3 id="assessment-questions">Assessment Questions</h3><ul><li>How could seamless video/voice integration within your brand improve patient satisfaction?</li><li>What operational efficiencies would result from embedded communication tools in your EHR/CRM systems?</li><li>How might custom-branded communication platforms differentiate your organization?</li><li>What patient populations would benefit most from integrated video/voice access?</li></ul><h3 id="implementation-considerations">Implementation Considerations</h3><ul><li>Current patient portal usage and satisfaction levels</li><li>Integration requirements with existing technology infrastructure</li><li>Staff readiness for enhanced communication capabilities</li><li>Patient demographic analysis for optimal interface design</li></ul><h3 id="roi-evaluation-framework">ROI Evaluation Framework</h3><ul><li>Support ticket reduction potential (target: &gt;50% reduction in support tickets)</li><li>Patient satisfaction improvement metrics</li><li>Provider efficiency gains from integrated workflows</li><li>Brand loyalty and retention improvements</li></ul><p>The future of healthcare communication isn't about adding more tools—it's about integrating custom, branded solutions that enhance your organization's identity while dramatically improving patient and provider experiences. Samvyo's approach ensures you achieve both objectives simultaneously.</p><hr><p><em>Ready to explore how Samvyo can help you integrate a custom real-time video/voice calling platform seamlessly into your healthcare brand? </em><a href="https://samvyo.com/demo?ref=samvyo.com" rel="noreferrer"><em>Discover</em></a><em> how healthcare communications can be transformed for better healthcare outcomes through our comprehensive integration approach. </em><a href="https://samvyo.com/contact?ref=samvyo.com" rel="noreferrer"><em>Contact us</em></a><em> to learn more about reducing support friction while strengthening your brand identity.</em></p></hr>]]></content:encoded></item><item><title><![CDATA[How Samvyo Helps Automotive Dealers Sell Smarter and Support Better]]></title><description><![CDATA[Samvyo empowers automotive dealerships to sell smarter and support better with real-time video engagement, intelligent routing, and post-sale assistance.
From virtual car tours to AI-powered insights, it transforms every customer interaction into a high-converting experience.]]></description><link>https://www.samvyo.com/blog/drive-sales-with-video-support/</link><guid isPermaLink="false">686e7db58b45c3f0cd639e7b</guid><category><![CDATA[Automotive Dealership Solutions]]></category><category><![CDATA[#pratik]]></category><category><![CDATA[Real-Time Customer Engagement]]></category><category><![CDATA[Video Selling for Car Dealers]]></category><category><![CDATA[AI-Powered Support & Insights]]></category><category><![CDATA[Post-Sale Customer Experience]]></category><category><![CDATA[Seamless Website Integration]]></category><dc:creator><![CDATA[Saurav K. Panda]]></dc:creator><pubDate>Wed, 09 Jul 2025 18:23:45 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1727893260618-265706007994?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDd8fGF1dG9tb2JpbGUlMjBkZWFsZXIlMjB2aWRlbyUyMGNvbmZlcmVuY2luZ3xlbnwwfHx8fDE3NTIwNzU2MDN8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1727893260618-265706007994?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDd8fGF1dG9tb2JpbGUlMjBkZWFsZXIlMjB2aWRlbyUyMGNvbmZlcmVuY2luZ3xlbnwwfHx8fDE3NTIwNzU2MDN8MA&ixlib=rb-4.1.0&q=80&w=2000" alt="How Samvyo Helps Automotive Dealers Sell Smarter and Support Better"/><p>In today’s digital-first world,<strong> automotive dealerships</strong> face more challenges — and more opportunities — than ever before. Customers expect fast, informed, and personalized interactions from their very first inquiry.</p><p>Our powerful platforms, <strong>Samvyo Meet</strong> (Video Conferencing) and <strong>Samvyo Meetnow</strong> (Contact Center Solution), help dealerships connect with potential buyers in real-time, build trust through transparent communication, and offer seamless support even after the sale is made.</p><p><strong>Here’s how your dealership benefits:</strong></p><h4 id="%E2%80%A2-seamless-website-integration-with-embedded-call-link-or-qr-code">• Seamless website integration with embedded call link or QR code</h4><p><em>Let your visitors launch instant live video-audio calls from your site — no installs, no barriers.</em></p><h4 id="%E2%80%A2-no-phone-numbers-needed-%E2%80%94-just-click-and-connect">• No phone numbers needed — just click and connect</h4><p><em>Enable customers to connect securely without sharing their number — frictionless and privacy-first.</em></p><h4 id="%E2%80%A2-smart-call-transcriptions-actionable-insights-and-analytics">• Smart call transcriptions, actionable insights, and analytics</h4><p><em>AI-powered tracking turns every conversation into valuable data — from buyer interest to sales trends.</em></p><h4 id="%E2%80%A2-effortless-crm-integration-on-demand">• Effortless CRM integration on demand</h4><p><em>All calls, notes, and follow-ups sync smoothly into your CRM for better tracking and faster closures.</em></p><hr><h2 id="%F0%9F%9A%97-convert-website-visitors-into-buyers">🚗 Convert Website Visitors into Buyers</h2><p>Your website is no longer just a catalog — it’s your <strong>virtual showroom</strong>.</p><p>With Samvyo, you can:</p><ul><li>Host <strong>live virtual car tours</strong> for interested buyers and sellers</li></ul><p><em>With Samvyo Meet, your sales team can conduct real-time video-audio car walkarounds directly from your showroom or lot — giving customers a 360° live view of the vehicle, from the comfort of their home.</em></p><ul><li>Run <strong>interactive Q&amp;A sessions</strong> to answer customer queries in real time</li></ul><p><em>Using Samvyo Meetnow, route incoming buyer queries instantly to a live expert for real-time video or audio sessions — resolving doubts on financing, model features, or service without any delays.</em></p><ul><li>Engage customers with <strong>personalized demos, building trust and confidence</strong> from the start</li></ul><p><em>Samvyo’s browser-based video-audio interface lets you tailor product demos one-on-one — creating a more human and trustworthy experience right from the first click, even before they step into your showroom.</em></p><p><em>This instant and interactive experience leads to </em><strong>higher-quality leads</strong><em> and </em><strong>faster sales cycles</strong><em>.</em></p><hr><h2 id="%F0%9F%A4%9D-route-customers-to-the-right-team-%E2%80%94-instantly">🤝 Route Customers to the Right Team — Instantly</h2><p>Every customer has unique needs — some want help with financing, others with insurance or service.</p><p><em>Samvyo’s </em><strong>smart routing system</strong><em> ensures:</em></p><ul><li><strong>Customers are connected to the right department (sales, finance, service, insurance) in real time</strong></li></ul><p>Samvyo Meetnow’s intelligent routing instantly identifies the customer’s intent and connects them via live video or audio call to the exact team they need — no manual transfers or hold time.</p><ul><li><strong>No back-and-forth or lost inquiries</strong></li></ul><p><em>Our system ensures every query is tracked, routed, and responded to — minimizing drop-offs and ensuring no lead slips through the cracks.</em></p><ul><li><strong><em>A smoother, more professional buying experience</em></strong></li></ul><p><em>By instantly directing customers to the right expert, Samvyo creates a seamless, dealership-grade interaction — one that feels fast, smart, and high-touch from the very first conversation.</em></p><hr><h2 id="%F0%9F%9B%A0%EF%B8%8F-stay-connected-after-the-sale">🛠️ Stay Connected After the Sale</h2><p>Samvyo enables you to <strong>build long-term customer relationships</strong> with intelligent post-sale support engagement:</p><ul><li><strong>Remote Self-Service Assistance</strong></li></ul><p><em>With Samvyo Meetnow, customers can access live or automated video-audio guidance for common post-sale needs like servicing schedules, feature usage, or minor troubleshooting — all without visiting the dealership.</em></p><ul><li><strong>Virtual Roadside Assistance</strong></li></ul><p>In case of breakdowns or emergencies, customers can initiate a real-time video or audio call through Samvyo for immediate visual assessment and live assistance — helping resolve issues faster and more confidently.</p><p><em>This consistent support boosts </em><strong>customer satisfaction</strong><em> and increases </em><strong>repeat business</strong><em> and </em><strong>referrals</strong></p><hr><h2 id="%F0%9F%92%AC-build-trust-with-real-time-support">💬 Build Trust with Real-Time Support</h2><p>For pre-owned car buyers, trust is everything. Samvyo empowers your team to deliver:</p><ul><li><strong>Live audio and video support</strong></li></ul><p>With Samvyo Meet, your team can provide real-time, face-to-face support that builds transparency — whether it’s showcasing a vehicle’s condition or addressing last-minute concerns.</p><ul><li><strong>Automated follow-ups</strong></li></ul><p><em>Samvyo Meetnow enables timely, automated follow-ups after every interaction — keeping buyers engaged, informed, and cared for throughout their decision-making journey.</em></p><ul><li><strong>Transparent, two-way communication directly from website without phone numbers</strong></li></ul><p><em>Buyers can initiate secure, real-time conversations from your website — no phone numbers needed — creating an open and trustworthy space that encourages honest dialogue.</em></p><p><em>These small moments of service make a </em><strong>big impact</strong><em> on your dealership’s credibility and brand value.</em></p><hr><h2 id="%F0%9F%93%88-unlock-actionable-insights-from-every-interaction">📈 Unlock Actionable Insights from Every Interaction</h2><p>Every conversation with a customer reveals something valuable.</p><p>With Samvyo’s AI-powered engagement intelligence, you gain access to:</p><ul><li><strong>Pre-call context</strong> to prepare your team before they speak</li></ul><p>Samvyo Meetnow equips your agents with real-time caller insights — such as past interactions, browsing behavior, and vehicle interests — so they’re fully prepared before the conversation begins.</p><ul><li><strong>In-call enhancements</strong> to support agents during conversations</li></ul><p>Smart prompts, sentiment detection, and real-time suggestions guide your team during video or audio calls, helping them respond better, faster, and more accurately.</p><ul><li><strong>Post-call analytics</strong> to track buyer intent and improve future interactions</li></ul><p><em>Every call is transcribed, analyzed, and turned into insights — revealing patterns in buyer behavior, objections, and opportunities to refine your pitch.</em></p><p><em>This data helps you </em><strong>understand buyer preferences</strong><em>, refine your sales approach, and enhance agent performance.</em></p><hr><h2 id="why-samvyo-is-built-for-automotive-dealers">Why Samvyo Is Built for Automotive Dealers</h2><p>From your front-end sales process to your post-sale service, Samvyo is designed to help dealerships:</p><p>✅ Engage website visitors instantly<br>✅ Route queries to the right team<br>✅ Build trust through human-centered support<br>✅ Manage after-sales service with ease<br>✅ Turn insights into sales growth</br></br></br></br></p><p>Whether you're an independent pre-owned dealer or a growing network, <strong>Samvyo scales with your needs</strong> — making every customer feel like a VIP.</p><p><strong>Let Samvyo transform your dealership into a real-time customer engagement powerhouse.<br><br>📅 Schedule a Demo</br></br></strong> Experience Samvyo firsthand with a personalised walkthrough tailored to your industry and requirements. 👉 <a href="https://cal.com/saurav-panda-luodk2/samvyo-demo?ref=samvyo.com" rel="noreferrer">Book a Demo with Our Team</a></p><p><strong>📞 Talk to a Specialist</strong> Have specific questions about on-premise deployment, compliance, or integration? Our team of experts is ready to assist. 👉 <a href="https://samvyo.com/demo?ref=samvyo.com" rel="noreferrer">Schedule a Consultation</a></p><p><strong>📧 Get in Touch</strong> Prefer to start with an email? Reach out to our enterprise solutions team directly. 👉 <a href="https://samvyo.com/contact?ref=samvyo.com" rel="noreferrer">Contact Us</a></p><p><em>Samvyo — Secure. Sovereign. Built in India. For India and the World.</em></p></hr></hr></hr></hr></hr></hr>]]></content:encoded></item><item><title><![CDATA[Transformative Customer Support Solutions: How IVR-Less Voice and Video Calling Revolutionizes Business Communication]]></title><description><![CDATA[Discover how IVR-less web-based voice and video calling platforms transform customer support and boost sales by integrating seamless communication into websites, apps, and stores.]]></description><link>https://www.samvyo.com/blog/ivr-less-web-calling-transforming-customer-support</link><guid isPermaLink="false">67f518da2016a5f94cddc20a</guid><category><![CDATA[web-based calling platform]]></category><category><![CDATA[IVR-less customer support]]></category><category><![CDATA[customer support technology]]></category><category><![CDATA[website voice integration]]></category><category><![CDATA[contextual customer support]]></category><category><![CDATA[video calling for sales]]></category><dc:creator><![CDATA[Saurav K. Panda]]></dc:creator><pubDate>Tue, 08 Apr 2025 12:57:22 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1553775282-20af80779df7?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fGN1c3RvbWVyJTIwc3VwcG9ydHxlbnwwfHx8fDE3NDQyODQwNTB8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1553775282-20af80779df7?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fGN1c3RvbWVyJTIwc3VwcG9ydHxlbnwwfHx8fDE3NDQyODQwNTB8MA&ixlib=rb-4.0.3&q=80&w=2000" alt="Transformative Customer Support Solutions: How IVR-Less Voice and Video Calling Revolutionizes Business Communication"/><p>In today's fast-paced digital landscape, businesses of all sizes are seeking innovative ways to enhance customer interactions. Traditional <strong>Interactive Voice Response (IVR) systems</strong>, once considered cutting-edge, now often create frustration and disconnect in the customer journey. [Insert link to related resource here] The emergence of <strong>IVR-less web-based voice and video calling platforms</strong> represents a paradigm shift in how businesses can connect with customers, providing <strong>seamless communication channels</strong> that boost engagement and conversion rates.</p><h2 id="what-are-ivr-less-web-based-calling-solutions">What Are <strong>IVR-Less Web-Based Calling Solutions</strong>?</h2><p><strong>IVR-less calling platforms</strong> integrate voice and video capabilities directly into websites, mobile applications, and even physical store interfaces without the maze-like menu systems of traditional call centers. These solutions enable instant, <strong>context-aware communications</strong> between customers and support representatives. Businesses can now offer <strong>one-click voice or video connections</strong>, eliminating the frustrating experience of navigating through numbered options and pre-recorded messages.</p><h3 id="key-benefits-of-direct-voice-and-video-integration">Key Benefits of <strong>Direct Voice and Video Integration</strong></h3><p>The transition from traditional call systems to <strong>integrated web-based solutions</strong> offers substantial advantages for businesses and customers alike. These modern <strong>communication platforms</strong> create more personalized support experiences while reducing operational costs.</p><h4 id="instantaneous-customer-connection">Instantaneous Customer Connection</h4><p>When a visitor encounters an issue on your website or needs assistance in your mobile app, they no longer need to search for contact information or dial a separate number. With <strong>embedded calling features</strong>, customers can initiate conversations in seconds directly from their current interface. This immediacy significantly reduces abandonment rates during the purchase journey.</p><h4 id="seamless-context-retention">Seamless Context Retention</h4><p>One of the most powerful aspects of <strong>integrated calling solutions</strong> is the ability to preserve context. When a customer initiates a call from a specific product page or during a particular stage in their journey, support agents receive this valuable information automatically. This <strong>contextual awareness</strong> eliminates the need for customers to explain their situation repeatedly, creating a more efficient and satisfying experience.</p><h2 id="transforming-business-operations-across-different-sectors">Transforming Business Operations Across Different Sectors</h2><p>The implementation of <strong>IVR-less calling solutions</strong> delivers tangible benefits across various industries and business models. From small e-commerce ventures to enterprise-level operations, organizations are witnessing remarkable transformations in their <strong>customer engagement metrics</strong>.</p><h3 id="e-commerce-revolution">E-Commerce Revolution</h3><p>Online retailers face unique challenges in providing personalized assistance comparable to in-store experiences. <strong>Web-based voice and video calling</strong> bridges this gap effectively. When shoppers have questions about product specifications or need help comparing options, a single click connects them with knowledgeable staff who can guide their purchase decision.</p><h3 id="financial-services-enhancement">Financial Services Enhancement</h3><p>Banking and financial service providers benefit tremendously from secure, <strong>integrated communication channels</strong>. Customers dealing with complex financial decisions often require personalized guidance. <strong>Direct video connections</strong> allow advisors to explain complicated products, verify identity documentation securely, and build trust through face-to-face interaction without requiring branch visits.</p><h3 id="healthcare-communication-improvement">Healthcare Communication Improvement</h3><p>Medical practices implementing <strong>web-based calling solutions</strong> can improve patient experiences significantly. Appointment scheduling, prescription clarifications, and preliminary consultations become more accessible and efficient. <strong>Video capabilities</strong> allow healthcare providers to assess visible symptoms and offer immediate guidance when appropriate.</p><h2 id="technical-implementation-considerations">Technical Implementation Considerations</h2><p>Implementing an <strong>IVR-less calling platform</strong> requires careful planning but offers remarkable flexibility across different business environments. Modern solutions provide various integration options to suit technical requirements and business objectives.</p><h3 id="website-integration">Website Integration</h3><p>Adding <strong>voice and video calling features</strong> to existing websites typically involves embedding lightweight JavaScript components. These elements can be customized to match your brand's appearance and trigger points. Calls can be initiated from specific pages, after certain actions, or based on visitor behavior patterns that suggest assistance might be needed.</p><h3 id="mobile-app-implementation">Mobile App Implementation</h3><p>For businesses with dedicated mobile applications, <strong>SDK integration</strong> enables native calling experiences directly within the app interface. This approach eliminates disruptive context switching that occurs when users must leave an app to make separate phone calls, significantly improving the user experience and increasing problem resolution rates.</p><h3 id="physical-location-deployment">Physical Location Deployment</h3><p>Innovative businesses are extending <strong>digital communication capabilities</strong> to brick-and-mortar locations. Using QR codes, NFC tags, or dedicated kiosks, customers can instantly connect with specialized support staff who may not be physically present at that location. This approach optimizes staffing resources while providing expert assistance precisely when needed.</p><h2 id="measuring-impact-and-roi">Measuring Impact and ROI</h2><p>Implementing <strong>web-based calling solutions</strong> provides highly measurable returns that traditional communication systems cannot match. The digital nature of these platforms offers comprehensive analytics and performance insights.</p><h3 id="conversion-rate-optimization">Conversion Rate Optimization</h3><p>Businesses implementing <strong>direct calling options</strong> frequently report significant improvements in conversion rates. The ability to address questions or concerns immediately during the decision-making process prevents cart abandonment and builds purchase confidence. These interactions create valuable opportunities for upselling and cross-selling relevant products or services.</p><h3 id="customer-satisfaction-metrics">Customer Satisfaction Metrics</h3><p>Modern <strong>calling platforms</strong> automatically capture satisfaction data through post-call surveys and interaction analysis. This continuous feedback loop enables businesses to identify improvement opportunities quickly and recognize high-performing support representatives. The elimination of hold times and repetitive information gathering consistently leads to higher satisfaction scores.</p><h3 id="operational-efficiency-gains">Operational Efficiency Gains</h3><p>Beyond customer-facing benefits, <strong>integrated calling solutions</strong> streamline internal operations. Support representatives access relevant customer information automatically, reducing handling times and increasing first-call resolution rates. The contextual data provided allows for more personalized and efficient service delivery.</p><h2 id="security-and-compliance-considerations">Security and Compliance Considerations</h2><p>As businesses implement advanced <strong>communication technologies</strong>, maintaining security and regulatory compliance remains essential. Modern <strong>web-based calling platforms</strong> incorporate robust protection mechanisms while adhering to industry standards.</p><h3 id="data-protection-measures">Data Protection Measures</h3><p>Leading solutions employ end-to-end encryption for voice and video transmissions, ensuring sensitive information remains secure. Customer data is protected throughout the communication process, building trust and meeting privacy expectations. Session recording features include automatic redaction capabilities for sensitive information when needed for training or quality assurance.</p><h3 id="regulatory-alignment">Regulatory Alignment</h3><p>Industries with specific compliance requirements benefit from purpose-built features addressing their unique needs. Financial services organizations can maintain FINRA compliance with appropriate recording and documentation capabilities. Healthcare providers can select HIPAA-compliant solutions that safeguard protected health information during <strong>video consultations</strong>.</p><h2 id="implementation-strategies-for-different-business-sizes">Implementation Strategies for Different Business Sizes</h2><p>The flexibility of modern <strong>communication platforms</strong> makes them appropriate for organizations across the spectrum, from startups to global enterprises. Implementation approaches can be tailored to specific business needs and growth stages.</p><h3 id="small-business-approach">Small Business Approach</h3><p>Small businesses often benefit most from turnkey solutions requiring minimal technical expertise. <strong>Cloud-based platforms</strong> with straightforward integration options provide immediate capabilities without significant investment. Pay-as-you-go pricing models allow growing companies to scale their <strong>communication capabilities</strong> alongside business expansion.</p><h3 id="mid-market-implementation">Mid-Market Implementation</h3><p>Mid-sized organizations typically seek balanced solutions combining ease of implementation with customization options. These businesses benefit from platforms offering branded interfaces, integration with existing CRM systems, and advanced routing capabilities. The ability to create specialized departments and skill-based routing enhances customer experience while optimizing staffing efficiency.</p><h3 id="enterprise-deployment">Enterprise Deployment</h3><p>Large enterprises require robust, highly customizable solutions capable of handling substantial call volumes across multiple departments and locations. Enterprise-grade implementations often include advanced analytics, AI-powered routing, and comprehensive integration with existing business intelligence systems. These organizations benefit from dedicated deployment assistance and ongoing optimization services.</p><h2 id="future-trends-in-web-based-communication">Future Trends in <strong>Web-Based Communication</strong></h2><p>The evolution of <strong>integrated calling solutions</strong> continues with emerging technologies creating new possibilities for business communication. Forward-thinking organizations should monitor these developments to maintain competitive advantages.</p><h3 id="ai-enhanced-interactions">AI-Enhanced Interactions</h3><p><strong>Artificial intelligence</strong> is increasingly incorporated into communication platforms, providing real-time assistance to both customers and support representatives. AI capabilities include sentiment analysis during calls, automated language translation, and intelligent routing based on customer history and current needs. These features create more efficient and personalized experiences.</p><h3 id="augmented-reality-integration">Augmented Reality Integration</h3><p>The combination of <strong>video calling</strong> with augmented reality creates powerful support scenarios, particularly for technical assistance. Support representatives can annotate the customer's visual field, highlighting specific components or providing visual instructions. This capability dramatically improves resolution rates for complex technical issues while reducing frustration.</p><h2 id="conclusion-the-competitive-advantage-of-modern-communication">Conclusion: The Competitive Advantage of Modern Communication</h2><p>In an increasingly digital marketplace, the quality of customer interactions often determines business success. <strong>IVR-less web-based voice and video calling platforms</strong> provide significant advantages in creating seamless, frustration-free customer experiences across all touch points. Organizations implementing these solutions report increased satisfaction metrics, higher conversion rates, and improved operational efficiency.</p><p>By eliminating the barriers created by traditional phone systems and integrating <strong>communication directly into the customer journey</strong>, businesses create more natural and effective support experiences. As technology continues evolving, the gap between companies offering modern <strong>communication options</strong> and those relying on outdated systems will only widen. Forward-thinking businesses should evaluate their current communication infrastructure and consider the transformative potential of <strong>integrated voice and video solutions</strong>.</p><p>Are you looking forward to enhance you business communication beyond IVR? How about a system that can help you enhance your CSAT score by at-least 30points? Do drop us an email at <strong>hello@samvyo.com</strong> or <a href="https://samvyo.com/contact?ref=samvyo.com" rel="noreferrer">contact us</a>, for a free 30 mins exploration discussion to understand your existing challenges related to business-customer communication and find a feasible solution to your challenges.</p>]]></content:encoded></item><item><title><![CDATA[WebRTC vs Proprietary Video SDKs: What Each One Actually Costs You]]></title><description><![CDATA[“Free” is the most expensive word in this decision. WebRTC has no license fee and can still cost $300–500k over three years; a proprietary SDK bills by the minute and ships in weeks. The real trade isn’t price — it’s control versus convenience. Here’s what each costs, and how to decide.]]></description><link>https://www.samvyo.com/blog/comprehensive-comparison-webrtc-vs-proprietary-video-sdks-business-decision-guide</link><guid isPermaLink="false">67ece4972016a5f94cddc0c5</guid><category><![CDATA[WebRTC]]></category><category><![CDATA[Proprietary video SDKs]]></category><category><![CDATA[WebRTC vs proprietary SDKs]]></category><category><![CDATA[Video communication implementation]]></category><category><![CDATA[Real-time communication]]></category><category><![CDATA[cost-benefit analysis]]></category><dc:creator><![CDATA[Saurav K. Panda]]></dc:creator><pubDate>Wed, 02 Apr 2025 12:15:30 GMT</pubDate><media:content url="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-1--2026--09_34_53-AM-2.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.samvyo.com/blog-admin1/content/images/2026/09/ChatGPT-Image-Sep-1--2026--09_34_53-AM-2.png" alt="WebRTC vs Proprietary Video SDKs: What Each One Actually Costs You"/><p>Almost every team building video starts at the same fork: use WebRTC, the open standard, and build on it yourself — or buy a proprietary video SDK and ship faster. The WebRTC vs proprietary video SDK decision gets framed as free-versus-paid, which is exactly why so many teams get it wrong. WebRTC has no license fee and can still cost you $300,000 over three years. A proprietary SDK bills you by the minute and can get you to launch in a fraction of the time. The real question isn’t price. It’s control versus convenience — and that trade shows up as a cost structure, a timeline, and a team you either have or have to hire.</p><p>Here’s the whole decision at a glance, then each row in detail.</p>
<!--kg-card-begin: html-->
<style>
  .rate-table {
    border-collapse: collapse;
    border: 1px solid rgba(128, 128, 128, 0.4);
  }
  .rate-table th,
  .rate-table td {
    border: 1px solid rgba(128, 128, 128, 0.4);
    padding: 10px 16px;
    color: inherit;
    background: transparent;
    vertical-align: top;
  }
  .rate-table thead th {
    background: rgba(128, 128, 128, 0.18);
    font-weight: 700;
  }
</style>
<table class="rate-table">
  <colgroup><col width="140"><col width="242"><col width="242"/></col></col></colgroup>
  <thead>
    <tr>
      <th>Dimension</th>
      <th>WebRTC (open standard)</th>
      <th>Proprietary video SDK</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Upfront cost</td>
      <td>No license fee</td>
      <td>No license fee; pay per use</td>
    </tr>
    <tr>
      <td>Real cost</td>
      <td>~$300k–$500k over 3 years (team + infra)</td>
      <td>~$0.004 / participant-minute; scales with usage</td>
    </tr>
    <tr>
      <td>Time to ship</td>
      <td>4–8 months</td>
      <td>1–3 months</td>
    </tr>
    <tr>
      <td>Team needed</td>
      <td>2–4 real-time media specialists</td>
      <td>1–2 general developers</td>
    </tr>
    <tr>
      <td>Scaling past ~4 users</td>
      <td>Build an SFU/MCU yourself (+$5k–$20k/mo)</td>
      <td>Built in, invisible</td>
    </tr>
    <tr>
      <td>Control</td>
      <td>Total ownership, no vendor risk</td>
      <td>Vendor's roadmap, pricing, and lifespan</td>
    </tr>
    <tr>
      <td>Right when</td>
      <td>Large scale, deep customization, long horizon</td>
      <td>Speed to market, standard feature set</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<p>The rest of this guide is that table, explained — starting with what the two things even are.</p><h2 id="the-two-options-in-plain-terms"><strong>The two options, in plain terms</strong></h2><p>WebRTC (Web Real-Time Communication) is the open standard for real-time audio and video in the browser. Google open-sourced it in 2011, and every major browser supports it. It gives you the raw building blocks — camera and mic capture, peer connections, data channels — and nothing above that. It’s not a product; it’s a foundation you build a product on. (If you’re unsure how those pieces fit together, our explainer on what an SFU is and why every platform uses one covers the server side.)</p><p>A proprietary video SDK is a commercial toolkit that wraps WebRTC (usually) in pre-built components, infrastructure, and features. Providers like Twilio, Agora, Vonage, and Daily sell these on usage-based pricing. You get documented APIs, managed servers, and features that would take months to build yourself — in exchange for a per-minute bill and a dependency on someone else’s platform. That dependency is not hypothetical: Twilio announced it was shutting its video API down in 2023 before reversing course, and Dyte was acquired by Cloudflare in 2025 and folded into another product. The roadmap belongs to the vendor.</p><p>With the definitions clear, the first real difference is the one everybody gets wrong: cost.</p><h2 id="what-each-actually-costs"><strong>What each actually costs</strong></h2><p>WebRTC is free to license, and that’s where the free part ends. Building on it means hiring people who understand real-time media — engineers in that specialty run roughly $100,000–$150,000 a year and are hard to find. Then there’s infrastructure: signaling, TURN, and media servers add somewhere between $2,000 and $10,000 a month depending on scale and redundancy. Add ongoing maintenance and security work, and a serious WebRTC build lands around $300,000–$500,000 over three years. The technology is free; the system around it is not.</p><p>A proprietary SDK inverts that. There’s no team to hire and no infrastructure to run — you pay per participant-minute, typically around $0.004 for HD video, with volume discounts as you grow. A small app burning 10,000 minutes a month might spend $50–$500; a large one running into the millions of minutes pays thousands a month. The cost is predictable and tied directly to usage, but it never goes to zero, and it climbs with every user you add. (We break the per-minute math down further in our guide to what integrating a video SDK really costs.)</p><p>Which model wins depends on scale and time horizon — and that’s a question of how fast you need to ship and who’s doing the work.</p><h2 id="time-to-ship-and-the-team-you-need"><strong>Time to ship, and the team you need</strong></h2><p>Building video on WebRTC from scratch typically takes 4–8 months to a real launch, longer if you want anything past basic calling. The hard parts aren’t obvious up front: getting media through firewalls and NAT (ICE, STUN, TURN), adapting quality across devices and networks, and surviving the browser and device compatibility maze. It takes 2–4 engineers with specific real-time media experience — the exact people who are hardest to recruit and keep.</p><p>A proprietary SDK collapses that to 1–3 months, often with 1–2 general developers rather than a specialist team. The provider has already solved network traversal, quality adaptation, and cross-platform behavior behind their API, so your developers spend their time on your product instead of on media plumbing. For most teams, this is the single biggest reason to buy rather than build.</p><p>Speed and simplicity are the SDK’s pitch. The next section is where you find out what you’re actually buying.</p><h2 id="what-you-get-out-of-the-box"><strong>What you get out of the box</strong></h2><p>WebRTC gives you capture, connection, and data channels — the primitives. Everything users actually notice, you build. Recording, screen sharing, and chat are all possible, but each is a project of its own on top of the core. That’s real work, and it’s work that doesn’t differentiate your product; it’s table stakes you’re rebuilding from parts.</p><p>Proprietary SDKs ship the table stakes as features. Noise suppression, echo cancellation, background blur and virtual backgrounds, cloud recording with transcription, moderation controls and waiting rooms, and usage analytics are typically standard. Increasingly they include AI features — speaker detection, live transcription, real-time translation. You’re not just buying media transport; you’re buying the decade of feature work built on top of it.</p><p>All of which holds up beautifully — until you try to grow.</p><h2 id="what-happens-when-you-grow"><strong>What happens when you grow</strong></h2><p>WebRTC’s peer-to-peer model is genuinely elegant for two to four people. Past that it breaks down: each participant has to send their stream to every other one, and upload bandwidth and device CPU run out fast. To scale, you need a server that routes media intelligently — a Selective Forwarding Unit (SFU) or, for mixed output, an MCU. (Our SFU explainer covers exactly how those work and why the SFU won.) Standing up and running that layer adds roughly $5,000–$20,000 a month and a good deal of engineering, which is the point where the “free” solution stops looking free.</p><p>Proprietary platforms absorb all of this. Their media servers, global routing, quality adaptation, and failover are built to scale to hundreds or thousands of participants without you touching any of it. You grow; the invoice grows; nothing else changes. For teams that expect rapid or unpredictable growth, that’s worth a lot.</p><p>Scale is one place the vendor earns its fee. Compliance is another — with an asterisk.</p><h2 id="security-and-compliance"><strong>Security and compliance</strong></h2><p>Both are encrypted at the core: WebRTC mandates DTLS and SRTP, so media in transit is protected either way. The difference is everything around that baseline. With WebRTC you build authentication, permissions, session control, and the audit trails that regulations like HIPAA, GDPR, and SOC 2 require. It’s doable, but security mistakes here are expensive, and “encrypted media” is a long way from “compliant system.”</p><p>Proprietary providers sell compliance as a product. Many carry SOC 2, ISO 27001, and HIPAA-ready certifications that extend to what you build on them, plus documentation and audit support that shorten your own certification path. If you’re selling into healthcare, finance, or government, that prepared paperwork can be worth more than the SDK itself. The catch: your compliance now depends on a vendor staying certified and staying in business.</p><p>Which lands on the real axis this whole decision turns on — not cost, not features, but control.</p><h2 id="control-versus-convenience"><strong>Control versus convenience</strong></h2><p>This is the trade underneath all the others. WebRTC gives you complete ownership: the interface, the behavior, the roadmap, the data. No vendor can change your pricing, deprecate a feature you depend on, or discontinue the thing you built your product on. You adapt on your own timeline. That independence is the entire reason large, differentiated platforms build on WebRTC despite the cost and the calendar.</p><p>A proprietary SDK asks you to give some of that up for speed. Customization lives inside the vendor’s parameters, API changes happen on their schedule, and their priorities are set by their market, not your one important use case. The strongest providers now offer white-labeling and deep customization that cover most needs — but the roadmap and the runway are still theirs. Twilio’s video shutdown-and-reversal and Dyte’s acquisition are the reminder that the platform you build on can move without your consent. (We cover how to protect yourself from that in our piece on video API vendor risk, and list portable options in our Twilio alternatives guide.)</p><p>So how do you actually choose? Run your situation through five questions.</p><h2 id="how-to-actually-decide"><strong>How to actually decide</strong></h2><p>Immediate or long-term? If you need to be in market fast with a minimum viable product, buy. If you’re building a highly customized platform for the long haul, WebRTC’s ownership pays off at scale.</p><p>What can your team actually do? Be honest about real-time media experience. If you have it, WebRTC is on the table. If you don’t, a proprietary SDK will get you a better result than a specialist team you haven’t hired yet.</p><p>Capex or opex? WebRTC is a large up-front investment in development you own. A proprietary SDK is an operating expense that scales with use. Startups with engineers but little cash sometimes prefer the former; enterprises usually prefer the predictable latter.</p><p>How many must-have features are yours to build? List them. If most of your requirements come standard in an SDK, building them yourself on WebRTC is expensive reinvention. If your needs are unusual, WebRTC’s blank canvas is an advantage.</p><p>How big will you get? Applications that stay under four to six participants can live on plain WebRTC. Anything expecting large sessions or fast growth has to weigh the SFU/MCU work against a platform that already scales.</p><p>Answer those five and the choice usually makes itself.</p><h2 id="the-bottom-line"><strong>The bottom line</strong></h2><p>WebRTC and a proprietary video SDK aren’t better and worse; they’re two ends of a control-versus-convenience trade. WebRTC gives you ownership, flexibility, and cost efficiency at scale — if you have the time, the team, and the appetite to run infrastructure. A proprietary SDK gives you speed, features, and predictable operations — if you can accept a per-minute bill and a dependency on someone else’s roadmap. Plenty of teams split the difference: ship on an SDK to reach the market, and build WebRTC expertise in parallel for the parts that eventually need to be theirs. The right answer isn’t universal. It’s whichever one matches your scale, your team, and how much of this you need to own.</p><h2 id="talk-it-through"><strong>Talk it through</strong></h2><p>Building video calling, conferencing, live streaming, or conversational AI into a website, mobile app, or physical space — and not sure which side of this trade fits? Reach out at <strong>hello@samvyo.com</strong> or <a href="https://samvyo.com/demo?ref=samvyo.com" rel="noreferrer">here</a>, for a demo and a straight conversation about what would actually work for your use case.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><h3 id="what%E2%80%99s-the-difference-between-webrtc-and-a-proprietary-video-sdk"><strong>What’s the difference between WebRTC and a proprietary video SDK?</strong></h3><p>WebRTC is the free, open standard for real-time video in the browser — the raw building blocks you develop on yourself. A proprietary video SDK is a commercial toolkit that wraps those building blocks in managed infrastructure and ready-made features, billed by usage. WebRTC is a foundation you build on; an SDK is a product you buy.</p><h3 id="is-webrtc-really-free"><strong>Is WebRTC really free?</strong></h3><p>The technology is free to license, but building a production system on it isn’t. Between real-time media engineers ($100k–$150k each) and server infrastructure ($2k–$10k a month), a serious WebRTC build runs about $300,000–$500,000 over three years. “Free” refers to the license, not the system.</p><h3 id="is-webrtc-cheaper-than-a-proprietary-sdk"><strong>Is WebRTC cheaper than a proprietary SDK?</strong></h3><p>Only at scale, and only if you have the team. A proprietary SDK costs around $0.004 per participant-minute, which is cheap to start and grows with usage. WebRTC costs a lot up front but nothing per minute, so it wins on cost once your volume is high enough to outrun the build-and-run expense — typically large, long-running platforms.</p><h3 id="how-long-does-it-take-to-build-video-with-webrtc-versus-an-sdk"><strong>How long does it take to build video with WebRTC versus an SDK?</strong></h3><p>Roughly 4–8 months on WebRTC with 2–4 specialist engineers, versus 1–3 months on a proprietary SDK with 1–2 general developers. The SDK is faster because network traversal, scaling, and cross-platform behavior are already solved behind its API.</p><h3 id="which-should-i-choose-webrtc-or-a-proprietary-video-sdk"><strong>Which should I choose, WebRTC or a proprietary video SDK?</strong></h3><p>Buy an SDK if you need speed to market, have a standard feature set, or lack real-time media expertise. Build on WebRTC if you need deep customization, expect large scale over a long horizon, and have the team to own the infrastructure. Many teams start on an SDK and move specific pieces to WebRTC later.</p><h3 id="where-does-a-platform-like-samvyo-fit-between-the-two"><strong>Where does a platform like Samvyo fit between the two?</strong></h3><p>Samvyo is built to close the gap. It ships the same embeddable SDKs a CPaaS provider gives you — so you get speed to market — plus the OEM and white-label depth and the deployment control they usually don’t offer. Because it’s based on an SFU architecture available on-premise or as a managed cloud, teams that need it can keep the media path, TURN, and recording under their own control while the platform stays resilient by design. It’s the convenience of an SDK with more of the ownership you’d otherwise only get from building on WebRTC yourself.</p>]]></content:encoded></item><item><title><![CDATA[How Real-time Voice, Video, and AI SDKs Are Revolutionizing Customer Support]]></title><description><![CDATA[Discover how real-time communication SDKs with voice, video, and AI capabilities are transforming customer support operations, boosting satisfaction, and reducing costs.
]]></description><link>https://www.samvyo.com/blog/how-realtime-voice-video-ai-sdks-transform-customer-support</link><guid isPermaLink="false">67ea6e18aeb302628d291633</guid><category><![CDATA[real-time communication SDKs]]></category><category><![CDATA[customer support technology]]></category><category><![CDATA[voice APIs]]></category><category><![CDATA[video support]]></category><category><![CDATA[AI in customer service]]></category><category><![CDATA[first-contact resolution]]></category><category><![CDATA[communication integration]]></category><category><![CDATA[customer experience]]></category><dc:creator><![CDATA[Saurav K. Panda]]></dc:creator><pubDate>Mon, 24 Mar 2025 07:56:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1626863905121-3b0c0ed7b94c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fGN1c3RvbWVyJTIwc3VwcG9ydHxlbnwwfHx8fDE3NDM1MTIzMTB8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1626863905121-3b0c0ed7b94c?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDJ8fGN1c3RvbWVyJTIwc3VwcG9ydHxlbnwwfHx8fDE3NDM1MTIzMTB8MA&ixlib=rb-4.0.3&q=80&w=2000" alt="How Real-time Voice, Video, and AI SDKs Are Revolutionizing Customer Support"/><p>In today's hyperconnected world, customers expect <strong>instant, personalized support experiences</strong>. Traditional ticketing systems and email-based customer service are quickly becoming relics of the past. Forward-thinking companies are now leveraging <strong>real-time communication SDKs</strong> (Software Development Kits) to transform their customer support operations. These powerful tools integrate voice, video, and AI capabilities directly into existing applications, creating seamless experiences that boost satisfaction and loyalty.</p><p>The demand for immediate, high-quality support has never been higher. According to recent industry research, [insert research link here], businesses that implement real-time communication solutions see a <strong>35% increase in customer satisfaction scores</strong> and a <strong>28% reduction in support costs</strong>. Let's explore how these technologies are reshaping the customer support landscape and providing competitive advantages to early adopters.</p><h2 id="the-evolution-of-customer-support-technology">The Evolution of Customer Support Technology</h2><p>Customer support has evolved dramatically over the past decade. Phone-only call centers have given way to <strong>omnichannel solutions</strong> that meet customers where they are. This shift reflects changing consumer preferences and technological advancements in communication infrastructure.</p><p>Modern support systems now integrate multiple communication channels into unified interfaces. Agents can <strong>seamlessly transition between text, voice, and video</strong> while maintaining context. This capability transforms fragmented interactions into cohesive conversations that build stronger customer relationships.</p><p>The journey from siloed communication channels to integrated real-time platforms represents a fundamental paradigm shift. Early support systems treated each channel as a separate entity, often resulting in disconnected customer experiences. Today's integrated approach recognizes that customers may start a conversation on one channel and prefer to continue it on another.</p><h2 id="key-components-of-real-time-communication-sdks">Key Components of Real-time Communication SDKs</h2><h3 id="voice-communication-apis">Voice Communication APIs</h3><p>Voice remains a critical channel for complex support scenarios. Today's voice SDKs offer far more than basic calling functionality, providing <strong>crystal-clear audio quality</strong> even in low-bandwidth environments. Modern voice APIs utilize adaptive codecs that automatically adjust to network conditions.</p><p>Advanced voice SDKs include features like <strong>call recording, transcription, and sentiment analysis</strong>. These capabilities help support teams monitor quality and identify training opportunities. Voice APIs can be customized to match specific business requirements and workflows through low-code configuration options.</p><p>Voice SDKs now offer sophisticated features beyond simple transmission, including:</p><ul><li><strong>Background noise suppression</strong> that filters out environmental distractions</li><li><strong>Voice enhancement algorithms</strong> that improve clarity and reduce fatigue</li><li><strong>Adaptive bit rate technology</strong> that maintains connections even in challenging network conditions</li><li><strong>Multi-party conferencing</strong> capabilities that enable seamless escalation to specialists</li></ul><p>These advancements make voice communication more reliable and effective than ever before. Support teams leveraging these capabilities report significantly improved customer satisfaction and lower call abandonment rates.</p><h3 id="video-integration-capabilities">Video Integration Capabilities</h3><p>Video support creates personal connections that text and voice alone cannot achieve. This visual element proves <strong>invaluable for troubleshooting complex hardware issues</strong> or demonstrating product features. The psychological impact of face-to-face interaction cannot be overstated in building trust and rapport.</p><p>Modern video SDKs offer features like <strong>screen sharing, annotation tools, and virtual backgrounds</strong>. These tools empower agents to deliver more effective and engaging support experiences. Companies implementing video support report <strong>higher first-contact resolution rates</strong> and improved customer satisfaction scores across demographic segments.</p><p>The technical sophistication of today's video SDKs includes:</p><ul><li><strong>Adaptive resolution</strong> that automatically adjusts to available bandwidth</li><li><strong>Low-latency transmission</strong> that enables natural conversation flow</li><li><strong>Enhanced privacy features</strong> like background blurring and virtual backgrounds</li><li><strong>Multi-participant video rooms</strong> that facilitate collaborative troubleshooting</li><li><strong>Recording and playback capabilities</strong> for training and quality assurance</li></ul><p>These features transform video from a simple communication channel into a powerful support tool. Industries with complex products or high-touch customer relationships have been particularly quick to adopt video-enabled support solutions.</p><h3 id="ai-and-machine-learning-components">AI and Machine Learning Components</h3><p>AI capabilities represent the <strong>most transformative element</strong> of modern communication SDKs. These intelligent systems can analyze conversations in real-time, providing valuable insights and automation opportunities that were unimaginable just a few years ago.</p><p><strong>Natural language processing</strong> helps route inquiries to appropriate agents based on intent and sentiment. Automated transcription converts conversations into searchable, analyzable text. <strong>AI assistants</strong> can handle routine inquiries, freeing human agents for more complex issues that require emotional intelligence and creative problem-solving.</p><p>The AI components in modern SDKs offer increasingly sophisticated capabilities:</p><ul><li><strong>Intent recognition</strong> identifies customer needs without explicit statements</li><li><strong>Sentiment analysis</strong> detects emotional states and escalates frustrated customers</li><li><strong>Predictive analytics</strong> anticipates customer needs based on patterns</li><li><strong>Automated response suggestions</strong> speed agent interactions while maintaining quality</li><li><strong>Knowledge base integration</strong> surfaces relevant information automatically</li></ul><p>These AI capabilities augment human agents rather than replacing them. The most successful implementations use AI to handle routine tasks while escalating complex scenarios to human agents who can provide empathy and creative solutions.</p><h2 id="benefits-for-customer-support-teams">Benefits for Customer Support Teams</h2><h3 id="enhanced-agent-efficiency">Enhanced Agent Efficiency</h3><p>Real-time communication SDKs <strong>streamline workflows</strong> and reduce the cognitive load on support teams. Integrated interfaces eliminate the need to switch between multiple applications during customer interactions. This reduction in context-switching improves focus and reduces fatigue.</p><p><strong>Contextual information display</strong> puts relevant customer data at agents' fingertips. AI-powered suggestions help agents respond more quickly and accurately. These efficiency gains allow support teams to <strong>handle higher volumes without sacrificing quality</strong> or experiencing burnout.</p><p>The efficiency benefits extend beyond individual interactions:</p><ul><li><strong>Reduced average handling time</strong> without compromising quality</li><li><strong>Lower training requirements</strong> as integrated systems guide newer agents</li><li><strong>Improved first-call resolution</strong> rates through better information access</li><li><strong>Decreased agent turnover</strong> due to reduced stress and improved job satisfaction</li><li><strong>More consistent customer experiences</strong> across different team members</li></ul><p>These efficiency improvements translate directly to bottom-line benefits. Organizations implementing integrated communication SDKs report operational cost reductions while simultaneously improving customer satisfaction metrics.</p><h3 id="improved-first-contact-resolution">Improved First-Contact Resolution</h3><p>The combination of voice, video, and AI significantly <strong>improves first-contact resolution rates</strong>. Visual communication helps agents better understand complex issues that text descriptions might obscure. This visual context eliminates the frustrating back-and-forth that characterizes many traditional support interactions.</p><p><strong>Screen sharing</strong> allows agents to guide customers through solutions step-by-step. Co-browsing features enable agents to take control when necessary, resolving issues faster. These capabilities translate to <strong>shorter resolution times</strong> and higher customer satisfaction across all demographic segments.</p><p>First-contact resolution improvements yield multiple benefits:</p><ul><li><strong>Reduced support costs</strong> through fewer follow-up contacts</li><li><strong>Increased customer loyalty</strong> from positive resolution experiences</li><li><strong>Lower customer effort scores</strong> as issues are resolved more quickly</li><li><strong>Improved agent confidence</strong> from successful problem-solving</li><li><strong>Valuable data collection</strong> from complete interaction recordings</li></ul><p>Organizations transitioning to real-time communication SDKs typically see first-contact resolution improvements of 15-30% within the first six months of implementation. This dramatic improvement creates a positive feedback loop of customer and agent satisfaction.</p><h3 id="data-driven-support-optimization">Data-Driven Support Optimization</h3><p>Modern SDKs generate valuable data that can drive <strong>continuous improvement</strong>. Call analytics reveal patterns in customer inquiries and agent performance. This wealth of structured data transforms support from a reactive necessity to a proactive business intelligence resource.</p><p><strong>Sentiment analysis</strong> identifies emotionally charged interactions that might require special attention. Conversation transcripts provide training material for new agents and AI systems. This wealth of data helps support leaders make <strong>informed decisions</strong> about staffing, training, and process improvements based on objective metrics rather than intuition.</p><p>The data advantages of modern communication SDKs include:</p><ul><li><strong>Comprehensive interaction analytics</strong> across channels and touchpoints</li><li><strong>Quality assurance automation</strong> through conversation analysis</li><li><strong>Predictive workload management</strong> based on historical patterns</li><li><strong>Customer journey mapping</strong> across multiple interactions</li><li><strong>Identification of systematic product or service issues</strong></li></ul><p>Forward-thinking organizations use this data to continuously optimize their support operations. The insights gained often extend beyond the support function, informing product development, marketing strategies, and overall customer experience initiatives.</p><h2 id="implementation-considerations">Implementation Considerations</h2><p>Successful implementation requires <strong>careful planning and cross-functional collaboration</strong>. IT teams must ensure proper integration with existing systems and adequate security measures. The technical foundation must support real-time communication while maintaining compliance with relevant data protection regulations.</p><p>Support team leaders should develop new protocols and training programs. <strong>Change management strategies</strong> help ensure agent adoption and enthusiasm. A phased implementation approach often yields the best results, allowing teams to adapt gradually to new capabilities and processes.</p><p>Key considerations for successful implementation include:</p><ul><li><strong>Technical infrastructure assessment</strong> to identify potential bottlenecks</li><li><strong>Security and compliance review</strong> to ensure regulatory adherence</li><li><strong>Integration planning</strong> with existing CRM and support systems</li><li><strong>Agent training and change management</strong> strategies</li><li><strong>Metrics definition</strong> for measuring implementation success</li><li><strong>Pilot program design</strong> for testing and refinement</li></ul><p>Organizations that take a strategic approach to implementation report higher success rates and faster time-to-value. Involving front-line agents in the selection and configuration process improves adoption and identifies practical considerations that might otherwise be overlooked.</p><h2 id="industry-specific-applications">Industry-Specific Applications</h2><p>Different industries benefit from real-time communication SDKs in unique ways. Understanding these specific applications helps organizations prioritize features and implementation approaches most relevant to their business context.</p><h3 id="healthcare-support">Healthcare Support</h3><p>Healthcare organizations use real-time communication SDKs to provide <strong>remote patient support</strong> and troubleshooting for medical devices. HIPAA-compliant video enables visual assessment while maintaining privacy standards. AI-powered triage ensures urgent cases receive immediate attention while routing routine inquiries appropriately.</p><p>The ability to securely share and annotate medical information transforms patient support experiences. Remote monitoring devices can be configured with agent assistance, improving adoption rates and proper usage. These capabilities prove particularly valuable for elderly patients and those with chronic conditions.</p><h3 id="financial-services">Financial Services</h3><p>Banking and financial institutions leverage real-time communication for <strong>secure account support</strong> and complex financial consultations. Video identification verification enhances security while maintaining convenience. Screen sharing enables agents to guide customers through complex financial applications and forms.</p><p>AI components help detect potential fraud patterns during interactions. Automated compliance recording ensures regulatory requirements are met. These capabilities help financial institutions balance security, compliance, and customer convenience in an increasingly digital environment.</p><h3 id="technology-and-saas">Technology and SaaS</h3><p>Technology companies implement real-time SDKs for <strong>technical troubleshooting</strong> and onboarding assistance. Screen sharing and remote control capabilities dramatically improve resolution rates for complex software issues. Video demonstrations help customers understand advanced features and configurations.</p><p>AI-powered knowledge base integration surfaces relevant documentation automatically. Usage analytics help identify common pain points and improvement opportunities. These capabilities reduce churn by ensuring customers can successfully implement and utilize complex technical products.</p><h2 id="measuring-roi-and-performance">Measuring ROI and Performance</h2><p>Implementing real-time communication SDKs represents a significant investment. Measuring return on this investment requires careful definition of key performance indicators aligned with business objectives.</p><h3 id="customer-experience-metrics">Customer Experience Metrics</h3><p>The most immediate impact typically appears in customer experience metrics:</p><ul><li><strong>Customer Satisfaction (CSAT)</strong> scores for supported interactions</li><li><strong>Net Promoter Score (NPS)</strong> improvements from enhanced support</li><li><strong>Customer Effort Score (CES)</strong> reductions through simpler resolution</li><li><strong>First Contact Resolution (FCR)</strong> rate improvements</li><li><strong>Average Resolution Time</strong> reductions</li></ul><p>These metrics provide a clear picture of the customer-facing benefits of implementation. Organizations typically see improvements across all these metrics within 3-6 months of successful deployment.</p><h3 id="operational-efficiency-metrics">Operational Efficiency Metrics</h3><p>The operational benefits manifest in efficiency improvements:</p><ul><li><strong>Average Handle Time (AHT)</strong> reductions without quality compromise</li><li><strong>Agent Productivity</strong> increases in resolved issues per hour</li><li><strong>Training Time</strong> reductions for new agents</li><li><strong>Agent Turnover</strong> rate improvements</li><li><strong>Escalation Rate</strong> reductions as more issues are resolved directly</li></ul><p>These operational improvements translate directly to cost savings and increased capacity. The combination of improved customer experience and operational efficiency creates a compelling business case for implementation.</p><h2 id="the-future-of-real-time-support">The Future of Real-time Support</h2><p>As technology continues to evolve, we can expect even more <strong>immersive and intelligent support experiences</strong>. Augmented reality will enable remote visual assistance for physical products. More sophisticated AI will handle increasingly complex inquiries without human intervention, while still maintaining the option for human escalation.</p><p><strong>Voice and emotion recognition</strong> will become more accurate, allowing for truly personalized support experiences. The boundaries between human and automated support will continue to blur. Organizations that <strong>embrace these technologies now</strong> will be best positioned for the future of customer support.</p><p>Emerging technologies on the horizon include:</p><ul><li><strong>Augmented Reality (AR)</strong> support for physical product troubleshooting</li><li><strong>Virtual Reality (VR)</strong> for immersive training and complex product demonstrations</li><li><strong>Emotion AI</strong> that responds to customer frustration with appropriate tone and solutions</li><li><strong>Predictive support</strong> that reaches out before customers experience problems</li><li><strong>Ambient intelligence</strong> that integrates support into everyday devices and environments</li></ul><p>These technologies will continue to transform customer expectations and support capabilities. Organizations investing in flexible, extensible communication platforms today will be better positioned to adopt these emerging capabilities as they mature.</p><h2 id="getting-started-with-real-time-communication-sdks">Getting Started with Real-time Communication SDKs</h2><p>Organizations considering implementation should begin with a clear assessment of current support challenges and objectives. This foundation helps identify the most valuable initial use cases and appropriate technology partners.</p><p>Start by evaluating current customer satisfaction pain points and support inefficiencies. Identify specific scenarios where real-time communication would add significant value. Consider both customer experience improvements and operational efficiency gains when building the business case.</p><p>Research potential technology partners based on industry experience, integration capabilities, and scalability. Request demonstrations focused on your specific use cases rather than generic capabilities. Involve front-line agents in the evaluation process to ensure practical usability.</p><h2 id="conclusion">Conclusion</h2><p>Real-time voice, video, and AI SDKs represent a <strong>paradigm shift in customer support</strong>. These technologies enable more efficient, effective, and emotionally intelligent service experiences that benefit both customers and companies. The integration of multiple communication modalities creates a support environment that adapts to customer needs rather than forcing customers to adapt to support limitations.</p><p>Forward-thinking organizations are already implementing these solutions and reaping the rewards. As these technologies mature and become more accessible, they will increasingly become <strong>the standard rather than the exception</strong>. The question is no longer whether to adopt real-time communication SDKs, but how quickly you can implement them to stay competitive in a rapidly evolving marketplace.</p><p>The organizations that succeed in this transformation will be those that approach implementation strategically, focusing on both technical integration and organizational change management. The rewards include not just improved operational metrics, but fundamentally transformed customer relationships built on efficient, effective support experiences.</p><p>Are you looking for a cloud contact centre solution that works without a IVR number? Are you looking forward to integrate real-time voice/video calling into a Website, Mobile App or even Physical Store? Do reach out to us at <strong>hello@samvyo.com</strong> or book a <a href="https://samvyo.com/demo?ref=samvyo.com" rel="noreferrer">demo</a>, to know how we can help you achieve these that can be highly beneficial for your business.</p>]]></content:encoded></item><item><title><![CDATA[Integrating Real-Time Video SDKs with Existing Business Systems: A Comprehensive How-To Guide]]></title><description><![CDATA[Learn how to seamlessly integrate real-time video SDKs with your existing business systems. This expert guide covers selection, architecture planning, implementation, and optimization.]]></description><link>https://www.samvyo.com/blog/integrating-real-time-video-sdks-business-systems-comprehensive-guide</link><guid isPermaLink="false">67ecec6a2016a5f94cddc0ef</guid><category><![CDATA[real-time video SDK]]></category><category><![CDATA[business systems integration]]></category><category><![CDATA[video API integration]]></category><category><![CDATA[Real-time communication]]></category><category><![CDATA[enterprise video solutions]]></category><category><![CDATA[video SDK architecture]]></category><category><![CDATA[video conferencing integration]]></category><dc:creator><![CDATA[Saurav K. Panda]]></dc:creator><pubDate>Mon, 17 Mar 2025 07:54:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1578574577315-3fbeb0cecdc2?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fGV4cGxhbmF0aW9ufGVufDB8fHx8MTc0MzU4MDMwN3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1578574577315-3fbeb0cecdc2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fGV4cGxhbmF0aW9ufGVufDB8fHx8MTc0MzU4MDMwN3ww&ixlib=rb-4.0.3&q=80&w=2000" alt="Integrating Real-Time Video SDKs with Existing Business Systems: A Comprehensive How-To Guide"/><p>In today's digital-first business landscape, <strong>video communication</strong> has become an essential component for customer engagement and operational efficiency. Organizations across various sectors are implementing <strong>real-time video capabilities</strong> to enhance their service delivery and improve collaboration. The integration of <strong>Video Software Development Kits (SDKs)</strong> with existing <strong>business systems</strong> presents both opportunities and challenges that require careful consideration.</p><p>As businesses continue to evolve their digital transformation strategies, <strong>video communication</strong> stands out as a powerful tool for creating meaningful interactions. This comprehensive guide will walk you through the process of seamlessly integrating <strong>video SDKs</strong> with your existing business infrastructure, ensuring optimal performance and user experience. <a href="https://samvyo.com/products/real-time-voice-video-ai-sdk-for-businesses?ref=samvyo.com" rel="noreferrer">Check out Samvyo real-time voice/video sdks here</a>.</p><h2 id="the-growing-importance-of-real-time-video-integration">The Growing Importance of <strong>Real-Time Video Integration</strong></h2><p>The global pandemic accelerated digital transformation initiatives, making <strong>real-time video solutions</strong> a necessity rather than a luxury for many organizations. Studies show that businesses implementing <strong>integrated video communication</strong> report significant improvements in customer satisfaction, employee productivity, and operational efficiency.</p><p><strong>Video SDK integration</strong> allows companies to add sophisticated communication capabilities to their existing applications without building complex infrastructure from scratch. This approach saves development time and resources while ensuring professional-quality <strong>video experiences</strong>.</p><h2 id="understanding-real-time-video-sdks">Understanding <strong>Real-Time Video SDKs</strong></h2><p><strong>Real-time video SDKs</strong> are pre-built software components that allow developers to implement <strong>video communication features</strong> without building the underlying technology from scratch. These <strong>SDKs</strong> typically include <strong>APIs</strong> for video streaming, recording, and interactive features that enable businesses to customize their <strong>video solutions</strong>.</p><p>Modern <strong>video SDKs</strong> offer various capabilities including one-to-one video calls, group <strong>video conferencing</strong>, screen sharing, and recording functionalities. Some advanced <strong>SDKs</strong> also provide AI-powered features such as background blur, noise suppression, and virtual backgrounds that enhance the overall user experience.</p><h3 id="core-components-of-video-sdks">Core Components of <strong>Video SDKs</strong></h3><p>Understanding the fundamental building blocks of <strong>video SDKs</strong> is essential for successful integration. Most modern <strong>real-time video platforms</strong> include several key components:</p><p><strong>Signaling servers</strong> handle the initial connection between participants, managing the exchange of metadata required to establish direct media connections. These servers play a crucial role in session initiation and management.</p><p><strong>Media servers</strong> handle the processing, routing, and sometimes recording of audio and video streams. In more sophisticated <strong>video SDK implementations</strong>, these servers also manage transcoding to ensure compatibility across different devices and network conditions.</p><p><strong>Client-side libraries</strong> provide the interface between your application and the underlying <strong>video communication infrastructure</strong>. These libraries abstract the complexity of real-time communication protocols and provide developer-friendly APIs.</p><h2 id="assessing-your-business-requirements">Assessing Your <strong>Business Requirements</strong></h2><p>Before beginning the <strong>integration process</strong>, it's crucial to identify your specific business needs and technical requirements. Consider factors such as expected user volume, required video quality, and the specific user experiences you want to create.</p><p>The <strong>integration approach</strong> will differ significantly depending on whether you're implementing <strong>video</strong> for customer support, telemedicine, virtual events, or internal team collaboration. Understanding these use cases will help you select the right <strong>SDK</strong> and design an appropriate architecture for <strong>integration</strong>.</p><h3 id="defining-technical-requirements">Defining Technical Requirements</h3><p>Successful <strong>SDK implementation</strong> begins with clearly defined technical specifications. Document your requirements for:</p><p><strong>Concurrent users</strong> will impact server resources and architecture decisions. Determine whether your system needs to support dozens, hundreds, or thousands of simultaneous connections.</p><p><strong>Video quality requirements</strong> vary by use case. Medical applications might require high-definition video, while basic customer support could function well with standard definition to accommodate users with limited bandwidth.</p><p><strong>Platform compatibility</strong> considerations should include all operating systems, browsers, and devices your users might employ. Comprehensive <strong>cross-platform support</strong> ensures accessibility for your entire user base.</p><h3 id="business-and-user-experience-goals">Business and User Experience Goals</h3><p>Beyond technical considerations, define what success looks like from business and user perspectives:</p><p><strong>Customer engagement metrics</strong> should be established to measure the impact of your <strong>video integration</strong>. These might include session duration, customer satisfaction scores, or conversion rates.</p><p><strong>Workflow efficiency improvements</strong> often drive the business case for <strong>video SDK adoption</strong>. Document current processes and establish baseline metrics to quantify future improvements.</p><p><strong>Accessibility requirements</strong> ensure your <strong>video solution</strong> serves all users regardless of abilities or disabilities. Consider features like closed captioning, screen reader compatibility, and keyboard navigation.</p><h2 id="selecting-the-right-video-sdk">Selecting the Right <strong>Video SDK</strong></h2><p>The market offers numerous <strong>video SDK options</strong> with varying features, pricing models, and technical specifications. Key factors to consider include:</p><h3 id="technical-compatibility">Technical Compatibility</h3><p>Ensure the <strong>SDK</strong> supports your existing technology stack including programming languages, frameworks, and environments. Check whether the <strong>SDK</strong> works across all platforms your business operates on—web, iOS, Android, and desktop applications.</p><p><strong>Programming language support</strong> is particularly important for seamless integration. Leading <strong>video SDKs</strong> offer libraries for popular languages like JavaScript, Swift, Kotlin, Python, and .NET.</p><p><strong>Framework compatibility</strong> ensures the <strong>SDK</strong> works with your development ecosystem. Verify support for frameworks like React, Angular, Vue.js, Flutter, or Native iOS and Android development.</p><h3 id="scalability-and-performance">Scalability and Performance</h3><p>Evaluate the <strong>SDK's</strong> ability to handle your expected user load without degradation in <strong>video quality</strong>. Consider factors such as bandwidth optimization, adaptability to varying network conditions, and server infrastructure requirements.</p><p><strong>Dynamic quality adaptation</strong> is essential for delivering consistent experiences across diverse network conditions. The best <strong>video SDKs</strong> automatically adjust resolution, frame rate, and bitrate based on available bandwidth.</p><p><strong>Geographic distribution</strong> of your user base may necessitate multi-region deployment. Look for <strong>SDKs</strong> with global infrastructure or those compatible with your existing content delivery networks.</p><h3 id="security-features">Security Features</h3><p>Security is paramount when implementing <strong>video communication systems</strong>. Look for <strong>SDKs</strong> that offer end-to-end encryption, compliance with industry standards (HIPAA, GDPR), and robust authentication mechanisms to protect sensitive communications.</p><p><strong>End-to-end encryption</strong> ensures that video and audio streams remain private throughout transmission. This feature is essential for healthcare, financial services, and other industries handling sensitive information.</p><p><strong>Access control mechanisms</strong> protect your <strong>video systems</strong> from unauthorized use. Look for capabilities like authentication tokens, participant permissions, and room access restrictions.</p><p><strong>Compliance certifications</strong> demonstrate adherence to industry regulations. Depending on your sector, look for <strong>SDKs</strong> with HIPAA, GDPR, SOC 2, or ISO 27001 compliance.</p><h3 id="customization-and-branding">Customization and Branding</h3><p>The ability to customize the user interface and overall experience is vital for maintaining brand consistency. Evaluate the <strong>SDK's</strong> flexibility in this regard:</p><p><strong>White-labeling capabilities</strong> allow you to present the <strong>video interface</strong> as a seamless part of your application. Look for <strong>SDKs</strong> that enable complete control over visual elements.</p><p><strong>UI component libraries</strong> can accelerate development while maintaining design flexibility. Some <strong>video platforms</strong> provide ready-made components that you can style to match your brand.</p><p><strong>API flexibility</strong> determines how deeply you can customize the behavior of the <strong>video system</strong>. Comprehensive APIs allow for tailored experiences that precisely match your requirements.</p><h2 id="integration-architecture-planning"><strong>Integration Architecture</strong> Planning</h2><p>A well-designed <strong>integration architecture</strong> ensures smooth functionality while minimizing disruption to existing systems. The architecture typically involves several interconnected components:</p><h3 id="backend-infrastructure">Backend Infrastructure</h3><p>Your backend systems need to interact with the <strong>video SDK</strong> to authenticate users, manage sessions, and handle signaling. This often requires developing middleware that bridges your existing authentication systems with the <strong>video service</strong>.</p><p><strong>Session management services</strong> coordinate the creation, monitoring, and termination of video calls. This component typically integrates with your existing user management and authentication systems.</p><p><strong>Configuration management</strong> ensures consistent settings across your <strong>video implementation</strong>. This service often stores and distributes settings like quality preferences, feature toggles, and regional routing rules.</p><p><strong>Analytics collection</strong> gathers data on usage patterns, performance metrics, and user behavior. This information drives ongoing optimization of your <strong>video communication system</strong>.</p><h3 id="frontend-implementation">Frontend Implementation</h3><p>The user interface must be updated to incorporate <strong>video elements</strong> while maintaining a cohesive user experience. This includes designing intuitive controls, status indicators, and responsive layouts that work across different devices.</p><p><strong>Responsive design principles</strong> ensure your <strong>video interface</strong> works well on devices of all sizes. Design layouts that adapt to both desktop and mobile contexts without compromising usability.</p><p><strong>Accessibility considerations</strong> should be built into your frontend implementation. Ensure video controls are keyboard-navigable, screen reader-compatible, and comply with WCAG guidelines.</p><p><strong>Consistent styling</strong> maintains your brand identity throughout the <strong>video experience</strong>. Apply your design system to all video-related UI elements for a seamless look and feel.</p><h3 id="api-integration-layer"><strong>API Integration</strong> Layer</h3><p>Develop a clear <strong>integration strategy</strong> for connecting your existing <strong>APIs</strong> with the <strong>video SDK's</strong> endpoints. This layer manages the flow of data between systems, handles events, and orchestrates the <strong>video sessions</strong> within your broader application ecosystem.</p><p><strong>Authentication flows</strong> must be carefully designed to maintain security while providing a smooth user experience. Consider implementing token-based authentication that works with your existing identity management system.</p><p><strong>Event handling mechanisms</strong> process notifications from the <strong>video SDK</strong> about connection changes, participant actions, and technical issues. These events often trigger application-specific responses.</p><p><strong>State synchronization</strong> ensures all participants have a consistent view of the <strong>video session</strong>. This is particularly important for interactive features like whiteboarding or screen sharing.</p><h2 id="implementation-best-practices">Implementation Best Practices</h2><p>When implementing the <strong>integration</strong>, follow these proven practices to ensure success:</p><h3 id="start-with-a-proof-of-concept">Start with a Proof of Concept</h3><p>Begin with a small-scale implementation to validate the technical approach and identify potential issues. This allows your team to gain familiarity with the <strong>SDK</strong> and refine the <strong>integration strategy</strong> before full deployment.</p><p><strong>Define clear success criteria</strong> for your proof of concept. These might include technical benchmarks like connection success rates as well as user experience metrics like video clarity and audio quality.</p><p><strong>Test with representative users</strong> to gather early feedback on the <strong>video experience</strong>. This input is invaluable for refining your approach before committing to a full-scale implementation.</p><p><strong>Document lessons learned</strong> throughout the proof of concept phase. These insights will inform your production implementation strategy and help avoid potential pitfalls.</p><h3 id="implement-robust-error-handling">Implement Robust Error Handling</h3><p>Network fluctuations and device issues can affect <strong>video quality</strong>. Implement comprehensive error handling that gracefully manages connection problems, provides helpful user feedback, and attempts recovery when possible.</p><p><strong>Graceful degradation strategies</strong> ensure users maintain some level of communication even when conditions aren't ideal. For example, disabling video while preserving audio when bandwidth is limited.</p><p><strong>Informative error messages</strong> help users understand and potentially resolve issues. Design user-friendly notifications that explain problems in non-technical terms and suggest appropriate actions.</p><p><strong>Automatic reconnection logic</strong> attempts to restore disrupted sessions without user intervention. Implement exponential backoff algorithms to prevent network flooding during outages.</p><h3 id="optimize-network-usage">Optimize Network Usage</h3><p><strong>Video communication</strong> is bandwidth-intensive, so implement adaptive streaming techniques that adjust <strong>video quality</strong> based on network conditions. Consider implementing bandwidth estimation and quality scaling to provide the best possible experience even in challenging network environments.</p><p><strong>Simulcast streaming</strong> transmits multiple quality levels simultaneously, allowing receivers to select the appropriate version based on their available bandwidth. This approach improves quality adaptation responsiveness.</p><p><strong>Bandwidth estimation algorithms</strong> continually assess available network resources. Implement client-side logic that proactively adjusts video parameters based on these measurements.</p><p><strong>Prioritization of critical streams</strong> ensures the most important content receives the necessary bandwidth. For example, in a teaching scenario, the instructor's stream might receive priority over student feeds.</p><h3 id="develop-clear-integration-documentation">Develop Clear Integration Documentation</h3><p>Comprehensive documentation accelerates development and ensures consistent implementation across teams. Create detailed guides covering all aspects of your <strong>video SDK integration</strong>:</p><p><strong>Architecture diagrams</strong> visualize the relationships between components, making it easier for developers to understand the overall system design. Include both high-level overviews and detailed component interactions.</p><p><strong>API reference materials</strong> document the interfaces between your systems and the <strong>video SDK</strong>. Include example requests, response formats, and error handling guidelines.</p><p><strong>Configuration guidelines</strong> help developers understand available options and best practices. Document environment-specific settings and recommended values for different use cases.</p><h2 id="testing-and-quality-assurance">Testing and Quality Assurance</h2><p>Thorough testing is essential for ensuring a reliable <strong>video integration</strong>. Develop a comprehensive testing strategy that covers:</p><h3 id="functional-testing">Functional Testing</h3><p>Verify that all <strong>video features</strong> work as expected across different scenarios and use cases. Test edge cases such as users joining with different device types or switching between networks during a session.</p><p><strong>Feature verification tests</strong> ensure that capabilities like screen sharing, recording, and chat function correctly. Create test cases that cover the complete feature set of your <strong>video implementation</strong>.</p><p><strong>Integration tests</strong> verify that your systems and the <strong>video SDK</strong> work together seamlessly. Focus on authentication flows, data exchange, and state synchronization between components.</p><p><strong>User journey testing</strong> validates end-to-end scenarios from the user's perspective. Create scripts that simulate complete workflows like joining a meeting, sharing content, and handling interruptions.</p><h3 id="performance-testing">Performance Testing</h3><p>Conduct load testing to ensure your <strong>integration</strong> can handle the expected volume of concurrent users without performance degradation. Monitor server resources, bandwidth usage, and client-side performance metrics.</p><p><strong>Stress testing</strong> identifies breaking points by gradually increasing user load beyond expected levels. Establish the maximum capacity of your system and verify graceful degradation under extreme conditions.</p><p><strong>Endurance testing</strong> evaluates system stability over extended periods. Run long-duration tests to identify memory leaks, resource exhaustion, or performance degradation that might not appear in shorter sessions.</p><p><strong>Network simulation testing</strong> evaluates performance under various connectivity conditions. Use network emulation tools to simulate bandwidth limitations, latency, packet loss, and jitter.</p><h3 id="cross-platform-compatibility">Cross-platform Compatibility</h3><p>Test the <strong>integration</strong> across all supported platforms and devices to ensure consistent functionality. Pay special attention to browser variations, mobile device differences, and operating system specifics that might affect the <strong>video experience</strong>.</p><p><strong>Browser compatibility testing</strong> is crucial for web-based implementations. Test across Chrome, Firefox, Safari, Edge, and other browsers relevant to your user base, including older versions.</p><p><strong>Device testing</strong> verifies functionality across different hardware configurations. Include various smartphones, tablets, laptops, and desktop computers with different specifications.</p><p><strong>Operating system verification</strong> ensures compatibility with Windows, macOS, iOS, Android, and any other platforms you support. Test across multiple OS versions, particularly for mobile platforms.</p><h2 id="security-auditing-and-compliance">Security Auditing and Compliance</h2><p>Before full deployment, conduct thorough security assessments of your <strong>video integration</strong>. This process should include:</p><p><strong>Vulnerability scanning</strong> identifies potential security issues in your implementation. Use automated tools to detect common vulnerabilities in your code and configuration.</p><p><strong>Penetration testing</strong> simulates malicious attacks to identify security weaknesses. Engage security professionals to attempt unauthorized access, data interception, or service disruption.</p><p><strong>Compliance verification</strong> ensures adherence to relevant regulations. Review your implementation against requirements for GDPR, HIPAA, CCPA, or other applicable standards.</p><h2 id="deployment-and-rollout-strategy">Deployment and Rollout Strategy</h2><p>A carefully planned deployment minimizes disruption and maximizes adoption. Consider these strategies for implementing your <strong>video SDK integration</strong>:</p><p><strong>Phased rollout</strong> introduces functionality to limited user groups before expanding to your entire user base. This approach allows you to identify and address issues before they affect all users.</p><p><strong>Feature flags</strong> enable rapid enablement or disablement of specific capabilities. Implement toggles that allow you to control feature availability without redeploying your application.</p><p><strong>Rollback procedures</strong> ensure you can quickly revert to previous functionality if problems arise. Document the steps required to disable the new <strong>video integration</strong> and restore prior behavior.</p><h2 id="monitoring-and-optimization">Monitoring and Optimization</h2><p>After deployment, implement comprehensive monitoring to track performance metrics and user experience. Collect data on call quality, connection success rates, and user engagement to identify areas for improvement.</p><p><strong>Real-time monitoring dashboards</strong> provide visibility into system health and performance. Display key metrics like concurrent users, error rates, and quality scores to help operations teams identify issues quickly.</p><p><strong>User experience metrics</strong> measure the subjective quality of <strong>video communications</strong>. Implement mechanisms to collect Mean Opinion Score (MOS), Customer Satisfaction (CSAT), or Net Promoter Score (NPS) feedback.</p><p><strong>Technical performance indicators</strong> track objective measures like frame rate, resolution, packet loss, and latency. Establish baselines and alerts for these metrics to identify performance degradation.</p><p>Regular analysis of these metrics will help you optimize your <strong>video SDK integration</strong> over time, improving reliability and user satisfaction. Consider implementing analytics that capture both technical performance and business outcomes related to your <strong>video implementation</strong>.</p><h3 id="continuous-improvement">Continuous Improvement</h3><p><strong>Video communication technology</strong> evolves rapidly, requiring ongoing attention to maintain optimal performance and feature sets:</p><p><strong>Regular SDK updates</strong> ensure you benefit from the latest improvements and security patches. Establish a process for evaluating, testing, and deploying updates from your <strong>video platform</strong> provider.</p><p><strong>Feature enhancement planning</strong> keeps your implementation competitive. Maintain a roadmap of desired improvements based on user feedback and business objectives.</p><p><strong>Performance optimization</strong> should be an ongoing process. Regularly review usage patterns and performance data to identify opportunities for improvement.</p><h2 id="business-impact-measurement">Business Impact Measurement</h2><p>Quantify the value of your <strong>video SDK integration</strong> through structured measurement of business outcomes:</p><p><strong>Return on investment calculations</strong> compare implementation and operating costs against business benefits. Track metrics like reduced travel expenses, increased conversion rates, or improved customer retention.</p><p><strong>Productivity improvements</strong> may be measured through reduced process times, increased transaction volumes, or other efficiency metrics. Compare these figures to pre-implementation baselines.</p><p><strong>Customer satisfaction impact</strong> evaluates how <strong>video capabilities</strong> affect user perceptions. Monitor changes in satisfaction scores, support ticket volumes, and customer feedback.</p><h2 id="conclusion">Conclusion</h2><p>Integrating <strong>real-time video SDKs</strong> with existing <strong>business systems</strong> requires careful planning, appropriate architecture design, and ongoing optimization. By following the comprehensive approach outlined in this guide, your organization can successfully implement <strong>video capabilities</strong> that enhance user experience and drive business value.</p><p>Remember that successful <strong>integration</strong> is not merely a technical achievement but a strategic one that should align with your overall business objectives. With thoughtful implementation, <strong>real-time video</strong> can transform customer interactions and operational processes, positioning your business for success in an increasingly visual digital landscape.</p><p>The journey toward effective <strong>video communication integration</strong> may be complex, but the potential rewards—enhanced customer relationships, streamlined operations, and competitive differentiation—make it well worth the investment. By approaching the process systematically and leveraging the guidance provided in this article, you can navigate the challenges successfully and unlock the full potential of <strong>real-time video</strong> within your organization.</p><p>Are you feeling overwhelmed while trying to integrate video/voice sdks into you business workflows? We are here to help. We are already helping businesses of various sizes including Fortune 500 companies integrate real-time voice/videos into their core business workflows. Drop us a note at <strong>hello@samvyo.com</strong> or <a href="https://samvyo.com/contact?ref=samvyo.com" rel="noreferrer">here</a>, for a free 30mins exploratory call to discuss your business requirement.</p>]]></content:encoded></item><item><title><![CDATA[Comprehensive Cost-Benefit Analysis of Building vs. Buying Real-Time Communication SDKs]]></title><description><![CDATA[Explore whether to build or buy a real-time communication SDK. Compare costs, time-to-market, and benefits in this in-depth RTC analysis.]]></description><link>https://samvyo.com/blog/comprehensive-cost-benefit-analysis-building-vs-buying-rtc-sdks</link><guid isPermaLink="false">67ed1ef42016a5f94cddc196</guid><category><![CDATA[real-time communication SDKs]]></category><category><![CDATA[build vs buy RTC]]></category><category><![CDATA[cost-benefit analysis]]></category><category><![CDATA[video conferencing]]></category><category><![CDATA[live streaming]]></category><category><![CDATA[WebRTC]]></category><dc:creator><![CDATA[Saurav K. Panda]]></dc:creator><pubDate>Mon, 17 Feb 2025 11:54:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1579621970795-87facc2f976d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fGNvc3R8ZW58MHx8fHwxNzQzNTk0OTcxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1579621970795-87facc2f976d?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fGNvc3R8ZW58MHx8fHwxNzQzNTk0OTcxfDA&ixlib=rb-4.0.3&q=80&w=2000" alt="Comprehensive Cost-Benefit Analysis of Building vs. Buying Real-Time Communication SDKs"/><p>In today's hyper connected world, <strong>real-time communication (RTC)</strong> powers countless business processes. Seamless <strong>video conferencing</strong>, <strong>live streaming</strong>, and <strong>instant messaging</strong> have become essential features that drive user satisfaction. Implementing RTC effectively can dramatically improve engagement, collaboration, and customer retention. <a href="https://www.samvyo.com/products/real-time-voice-video-ai-sdk-for-businesses?ref=samvyo.com" rel="noreferrer">Learn more about Samvyo real-time communication sdk here</a>. This blog post conducts an in-depth <strong>cost-benefit analysis</strong> to determine whether organizations should <strong>build</strong> their own <strong>RTC solution</strong> or <strong>buy</strong> a <strong>real-time communication SDK</strong>.</p><h2 id="introduction-to-real-time-communication-sdks">Introduction to Real-Time Communication SDKs</h2><p>A <strong>Real-Time Communication Software Development Kit (RTC SDK)</strong> simplifies the integration of <strong>voice</strong>, <strong>video</strong>, and <strong>messaging</strong> features into web or mobile applications. Many industry players—such as <strong>Agora</strong>, <strong>Twilio</strong>, and <strong>Vonage</strong>—provide comprehensive <strong>RTC SDK</strong> solutions that dramatically lower development complexity. These SDKs enable rapid deployment and robust performance, making them a strategic option for businesses looking to incorporate <strong>real-time communication</strong> capabilities into existing or new products.</p><h3 id="why-real-time-communication-matters">Why Real-Time Communication Matters</h3><p>Modern businesses thrive on rapid information exchange and interactive platforms. Features like <strong>video calls</strong> and <strong>live chat</strong> not only improve customer experiences but also streamline internal operations. By leveraging <strong>RTC</strong>, companies can reduce friction in communication, speed up support processes, and differentiate themselves in competitive markets. At the same time, implementing RTC in-house can be challenging if your team lacks the right expertise.</p><h2 id="key-considerations-building-vs-buying">Key Considerations: Building vs. Buying</h2><h3 id="1-initial-investment-and-development-costs">1. Initial Investment and Development Costs</h3><p>Building a <strong>custom RTC solution</strong> requires significant upfront investment. Your business might need to hire specialized developers proficient in <strong>WebRTC</strong>, <strong>signaling protocols</strong>, and <strong>network infrastructure</strong>. Additionally, setting up and maintaining servers for <strong>real-time communication</strong> can be costly. On the other hand, purchasing an <strong>RTC SDK</strong> typically reduces these initial costs, because the SDK vendor handles most of the complex infrastructure. This allows organizations to focus resources on core business features and competitive differentiation.</p><p><strong>Key Insight:</strong> Startups and smaller organizations often benefit financially from buying an SDK because it avoids heavy development overhead. Larger enterprises with extensive technical resources might still consider building if they need highly specialized features.</p><h3 id="2-time-to-market">2. Time-to-Market</h3><p><strong>Time-to-market</strong> remains an essential factor in today's fast-paced environment. A <strong>custom-built RTC solution</strong> could take anywhere from several months to over a year to develop and fully optimize. This timeline is a direct reflection of the complexities inherent in <strong>real-time communication</strong>—including debugging <strong>latency</strong> issues, configuring <strong>signaling servers</strong>, and ensuring consistent <strong>audio/video quality</strong> under varying network conditions. Conversely, an <strong>RTC SDK</strong> accelerates deployment, enabling you to launch new features within weeks.</p><p><strong>Key Insight:</strong> Delays can cause you to miss strategic opportunities, especially in industries where early adopters gain a competitive edge. An <strong>RTC SDK</strong> helps you move faster and keeps you ahead of market demands.</p><h3 id="3-maintenance-and-support">3. Maintenance and Support</h3><p>Ongoing <strong>maintenance</strong> can be a long-term burden for in-house solutions. Continuous improvements to handle new devices, operating systems, or browser versions require perpetual testing and updates. <strong>RTC</strong> protocols also evolve, and you need to stay informed about changes in standards, especially if you rely on <strong>WebRTC</strong>. Buying an <strong>RTC SDK</strong> offloads these tasks to the provider, who routinely updates their technology stack to ensure it remains stable, secure, and compliant.</p><p><strong>Key Insight:</strong> If your team lacks the bandwidth for constant maintenance, an <strong>SDK provider</strong> can be a more efficient choice, giving you peace of mind and a stable, <strong>production-ready</strong> environment.</p><h3 id="4-scalability-and-performance">4. Scalability and Performance</h3><p>An <strong>RTC solution</strong> that fails to scale can quickly become a bottleneck for growth. Building a robust platform that supports thousands (or millions) of concurrent users requires specialized knowledge of <strong>load balancing</strong>, <strong>media servers</strong>, and <strong>distributed systems </strong>— in practice, <a href="https://samvyo.com/blog/sfu-scaling-clustering-cascading-and-where-the-bottleneck-moves?ref=samvyo.com">clustering and cascading SFUs once a single media server hits its ceiling</a>. On the other hand, <strong>RTC SDK</strong> providers usually offer infrastructure that automatically scales to meet user demand. Their back-end systems spread traffic across multiple nodes, ensuring consistent performance even during usage spikes.<strong> </strong></p><p><strong>Key Insight:</strong> If your business anticipates rapid user growth or traffic surges (e.g., large-scale virtual events), an <strong>SDK</strong> is often more cost-effective and less risky because its infrastructure is battle-tested.</p><h3 id="5-technical-expertise-and-resource-allocation">5. Technical Expertise and Resource Allocation</h3><p>Building an <strong>RTC platform</strong> internally demands a team with deep knowledge of <strong>real-time communication protocols</strong>, <strong>encryption</strong>, <strong>media optimization</strong>, and troubleshooting for a variety of endpoints — <a href="https://samvyo.com/blog/webrtc-sdk-vs-build-what-you-actually-write-yourself?ref=samvyo.com">the itemised list of components you end up writing yourself</a> is longer than most estimates assume. Recruiting and retaining such specialized talent is challenging. By purchasing a <strong>RTC SDK</strong>, you leverage the expertise of industry specialists, reducing your need to build that in-house skill set. This frees up your internal development teams to concentrate on feature innovation rather than core <strong>RTC</strong> infrastructure.</p><p><strong>Key Insight:</strong> For companies that value focusing on product differentiation and user-facing features, a <strong>bought SDK</strong> may provide the perfect balance of advanced functionality and reduced complexity.</p><h3 id="6-security-and-compliance">6. Security and Compliance</h3><p>Security breaches and data privacy regulations pose serious risks for any organization. Building a <strong>custom RTC solution</strong> demands that you implement robust encryption protocols, regularly conduct security audits, and ensure compliance with standards like <strong>GDPR</strong> and <strong>HIPAA</strong>. <strong>RTC SDK</strong> providers often incorporate these measures out of the box, including features like end-to-end encryption and frequent software patches.</p><p><strong>Key Insight:</strong> If compliance is paramount in your industry, confirm that your chosen <strong>SDK vendor</strong> adheres to relevant regulations. This often reduces legal risk and the cost of comprehensive internal audits.</p><h2 id="comprehensive-cost-benefit-analysis">Comprehensive Cost-Benefit Analysis</h2><h3 id="direct-financial-costs">Direct Financial Costs</h3>
<!--kg-card-begin: html-->
<table><tbody><tr><th><span><strong>Cost Element</strong></span></th><th><span><strong>Build (Custom RTC)</strong></span></th><th><span><strong>Buy (RTC SDK)</strong></span></th></tr><tr><td><span>Initial Development</span></td><td><span>$300K – $600K (or more)</span></td><td><span>$20K – $60K</span></td></tr><tr><td><span>Infrastructure Setup</span></td><td><span>High (servers, load balancers)</span></td><td><span>Often included in provider’s pricing</span></td></tr><tr><td><span>Maintenance &amp; Upgrades</span></td><td><span>$100K+ per year</span></td><td><span>$10K – $25K per year</span></td></tr><tr><td><span>Time-to-Market</span></td><td><span>6 – 18 months</span></td><td><span>1 – 3 months</span></td></tr><tr><td><span>Specialized Talent</span></td><td><span>Required (RTC engineers)</span></td><td><span>Limited need for in-house expertise</span></td></tr><tr><td><span>Security Compliance</span></td><td><span>Build from scratch + audits</span></td><td><span>Provider ensures built-in security</span></td></tr></tbody></table>
<!--kg-card-end: html-->
<p>Building your own <strong>RTC platform</strong> typically involves higher upfront costs due to hiring specialized engineers, setting up infrastructure, and addressing security compliance from zero. Conversely, an <strong>RTC SDK</strong> has a lower barrier to entry, though ongoing subscription or usage costs must also be considered.</p><h3 id="potential-hidden-costs">Potential Hidden Costs</h3><ul><li><strong>Opportunity Cost:</strong> Months spent building an RTC solution could be spent enhancing other features or improving user experience.</li><li><strong>Vendor Lock-In:</strong> Buying an SDK creates some reliance on the provider’s pricing and product roadmap.</li><li><strong>Future Upgrades:</strong> In-house solutions require additional resources for major overhauls (e.g., adopting new video codecs).</li><li><strong>Troubleshooting and Support:</strong> Unexpected outages or performance issues can escalate maintenance costs if you maintain an internal solution.</li></ul><h3 id="long-term-strategic-value">Long-Term Strategic Value</h3><p>Building an <strong>RTC solution</strong> can be beneficial if you possess specialized needs or plan to differentiate through custom functionality. Yet, an <strong>RTC SDK</strong> often covers a wide range of use cases while offloading the complexities of large-scale infrastructure management. This allows internal teams to prioritize product innovation, customer acquisition, and brand differentiation.</p><h2 id="real-world-scenarios">Real-World Scenarios</h2><h3 id="scenario-1-bootstrapped-startup-launching-a-video-chat-feature">Scenario 1: Bootstrapped Startup Launching a Video Chat Feature</h3><p>A small startup wants to add <strong>live video calls</strong> to a social platform. They have limited funding and a tight schedule, aiming to demo a prototype to investors within two months. Adopting a <strong>RTC SDK</strong> becomes an obvious choice. The startup pays a modest monthly fee or usage-based cost, eliminates the need for an in-house RTC expert, and can deliver a working proof of concept in record time.</p><h3 id="scenario-2-large-healthcare-provider-requiring-hipaa-compliance">Scenario 2: Large Healthcare Provider Requiring HIPAA Compliance</h3><p>A major healthcare provider needs to deploy <strong>telehealth</strong> features supporting secure <strong>video consultations</strong> with doctors. Detailed compliance measures (HIPAA in the United States, GDPR in Europe) are critical. While building an in-house solution gives maximum control over data management, it also creates significant overhead and potential liability. Choosing a <strong>RTC SDK</strong> from a vendor with proven, <strong>HIPAA-compliant</strong> infrastructure ensures compliance and lowers risk.</p><h3 id="scenario-3-social-media-giant-seeking-uniquely-customized-rtc">Scenario 3: Social Media Giant Seeking Uniquely Customized RTC</h3><p>A social media network with hundreds of millions of users wants to implement real-time broadcasting. They need advanced features like interactive filters, multi-guest streaming, and large-scale concurrency. While an <strong>RTC SDK</strong> might offer partial solutions, the scale and hyper-specific feature set could justify a custom build. The organization’s existing engineering resources may reduce cost burdens, and the final result can be highly tailored to internal demands.</p><h2 id="expanded-advantages-and-disadvantages">Expanded Advantages and Disadvantages</h2><h3 id="advantages-of-building">Advantages of Building</h3><ol><li><strong>End-to-End Control:</strong> You own every aspect of the <strong>RTC infrastructure</strong>, from <strong>security protocols</strong> to <strong>scalability</strong> decisions. This can be crucial for high-stakes industries (e.g., finance, healthcare, or defense).</li><li><strong>Highly Specialized Features:</strong> You can develop advanced capabilities that off-the-shelf SDKs might not provide. This is vital if you plan to create next-generation streaming or interactive experiences.</li><li><strong>Reduced External Dependencies:</strong> With an internal solution, you can mitigate reliance on external vendors. Changes in your vendor's policies or pricing models will not affect your bottom line.</li></ol><h3 id="disadvantages-of-building">Disadvantages of Building</h3><ol><li><strong>Large Upfront Costs:</strong> Engineering, <strong>infrastructure</strong>, <strong>security audits</strong>, and maintenance are all high-cost line items. Projects can balloon beyond initial estimates if complexities arise.</li><li><strong>Slower Time-to-Market:</strong> The time required to build, test, and optimize a robust <strong>RTC solution</strong> can be considerable. Delays can harm your competitive positioning.</li><li><strong>Ongoing Maintenance:</strong> Real-time communication technology evolves quickly. You will need to continuously update your stack, respond to new device requirements, and address vulnerabilities.</li></ol><h3 id="advantages-of-buying-an-rtc-sdk">Advantages of Buying an RTC SDK</h3><ol><li><strong>Reduced Overhead:</strong> The SDK vendor maintains servers, addresses bug fixes, and updates standards. You can offload the mundane tasks of server management.</li><li><strong>Fast Iterations:</strong> By integrating a comprehensive <strong>RTC SDK</strong>, new features or updates can be rolled out in weeks instead of months, ensuring agility.</li><li><strong>Vendor Expertise:</strong> Established <strong>RTC SDK</strong> providers rely on seasoned RTC engineers, ensuring best practices around <strong>latency</strong>, <strong>bandwidth optimization</strong>, and cross-platform compatibility.</li></ol><h3 id="disadvantages-of-buying-an-rtc-sdk">Disadvantages of Buying an RTC SDK</h3><ol><li><strong>Vendor Lock-In:</strong> Long-term reliance on a provider can be risky if their roadmap or pricing changes unexpectedly. Migrating away can be challenging, especially if the vendor’s API is deeply integrated.</li><li><strong>Limited Custom Features:</strong> Off-the-shelf solutions might not support every advanced feature or specialized use case you envision.</li><li><strong>Cost Predictability Issues:</strong> Although initial costs are lower, usage-based fees can add up if your user base grows exponentially.</li></ol><h2 id="practical-steps-to-evaluate-your-options">Practical Steps to Evaluate Your Options</h2><ol><li><strong>Assess Technical Requirements:</strong> List out essential features (e.g., screen sharing, multi-party conferencing, moderation controls). Compare them against available <strong>RTC SDK</strong> features.</li><li><strong>Estimate Development Resources:</strong> Determine how many specialized engineers you would need for building or maintaining your own system. Evaluate current staff expertise.</li><li><strong>Analyze Budget Scenarios:</strong> Calculate the total cost of building over one to three years vs. the subscription or usage fees of a purchased <strong>RTC SDK</strong>.</li><li><strong>Check Regulatory Constraints:</strong> Evaluate data privacy and compliance requirements for your region or industry. Decide if an external provider’s compliance certifications suffice.</li><li><strong>Conduct Performance Testing:</strong> If possible, run a trial with an <strong>RTC SDK</strong> to measure performance, latency, and reliability under simulated user loads.</li><li><strong>Long-Term Roadmap:</strong> Consider whether real-time features are core to your product. If RTC is a critical differentiator, building might be more appealing.</li></ol><h2 id="pitfalls-and-mistakes-to-avoid">Pitfalls and Mistakes to Avoid</h2><ol><li><strong>Underestimating Complexity:</strong> Real-time communication is inherently complex. Businesses that assume they can build a minimal solution quickly often face spiraling costs and delayed launches.</li><li><strong>Ignoring Hidden Fees:</strong> Some <strong>SDK vendors</strong> offer appealing baseline costs but charge extra for advanced features or higher user caps. Transparently compare full pricing.</li><li><strong>Neglecting Quality Assurance:</strong> RTC depends on countless variables, including network conditions, device performance, and global server distributions. Thorough testing is vital.</li><li><strong>Overlooking User Feedback:</strong> Gather feedback on call quality, user experience, and reliability. This helps shape your decision to build or buy in future iterations.</li></ol><h2 id="projections-and-trends-in-rtc">Projections and Trends in RTC</h2><ol><li><strong>5G Expansion:</strong> With 5G adoption, real-time communication will gain even lower latencies. Building a solution that can handle these new speeds might require another advanced skill set.</li><li><strong>Edge Computing:</strong> RTC solutions that leverage edge servers can reduce round-trip times and deliver better performance. Many <strong>RTC SDK</strong> vendors already integrate edge computing strategies.</li><li><strong>AI-Powered Enhancements:</strong> Noise suppression, real-time transcription, and background replacement are becoming standard. Your choice to build vs. buy might hinge on how quickly you want to adopt these features.</li><li><strong>Global Collaboration:</strong> As remote work grows, real-time solutions must handle global userbases. An <strong>SDK</strong> with worldwide data centers can drastically reduce latency, offering better call quality across continents.</li></ol><h2 id="extensive-comparison-and-decision-framework">Extensive Comparison and Decision Framework</h2>
<!--kg-card-begin: html-->
<table><tbody><tr><td><span><strong>Metric</strong></span></td><td><span><strong>Build Internally</strong></span></td><td><span><strong>Buy an RTC SDK</strong></span></td></tr><tr><td><span><strong>Control</strong></span></td><td><span>Complete control over feature set &amp; data handling</span></td><td><span>Limited to features the vendor provides, but faster</span></td></tr><tr><td><span><strong>Upfront Cost</strong></span></td><td><span>High (staff, hardware, development)</span></td><td><span>Low to moderate (subscription, usage-based)</span></td></tr><tr><td><span><strong>Scalability</strong></span></td><td><span>Must architect for scale (potentially costly)</span></td><td><span>SDKs often include auto-scaling &amp; global infrastructure</span></td></tr><tr><td><span><strong>Feature Updates</strong></span></td><td><span>Entirely on your development roadmap</span></td><td><span>SDK vendor often rolls out new features automatically</span></td></tr><tr><td><span><strong>Security &amp; Compliance</strong></span></td><td><span>Must implement &amp; maintain in-house</span></td><td><span>Built-in if vendor is reputable, but must validate</span></td></tr><tr><td><span><strong>Time-to-Market</strong></span></td><td><span>Slower (months to years)</span></td><td><span>Faster (weeks to a few months)</span></td></tr><tr><td><span><strong>Maintenance</strong></span></td><td><span>Ongoing internal effort &amp; patching</span></td><td><span>Vendor-provided updates &amp; support</span></td></tr><tr><td><span><strong>Risk Management</strong></span></td><td><span>Potential for large internal failure points</span></td><td><span>Possible vendor lock-in, but minimal internal overhead</span></td></tr></tbody></table>
<!--kg-card-end: html-->
<h2 id="best-practices-for-selecting-an-rtc-sdk">Best Practices for Selecting an RTC SDK</h2><ul><li><strong>Evaluate Vendor Reputation:</strong> Examine online reviews, developer forums, and case studies to gauge reliability.</li><li><strong>Ask for Demos and Trials:</strong> Conduct pilot runs with sample applications to test call quality, latency, and scalability.</li><li><strong>Verify Feature Breadth:</strong> If you need advanced features like custom avatars, co-browsing, or interactive broadcasting, confirm the vendor supports them.</li><li><strong>Check Documentation:</strong> Good documentation and developer resources can significantly speed integration.</li><li><strong>Look for Flexible Pricing:</strong> Whether usage-based, monthly, or enterprise-level licensing, pick a model that aligns with your growth.</li></ul><h2 id="achieving-roi-in-real-time-communication">Achieving ROI in Real-Time Communication</h2><p><strong>Return on Investment (ROI)</strong> can be significant if <strong>RTC</strong> features align with user expectations. For many businesses, rapid user adoption leads to higher customer satisfaction and retention. Monetizable features (e.g., premium video chat or in-app call credits) can generate direct revenue streams. The speed at which these revenue streams offset the cost of building or buying an <strong>RTC solution</strong> is central to your final choice.</p><ol><li><strong>Enhanced Customer Engagement:</strong> Well-implemented RTC fosters deeper connections, helping users interact in real-time for support, sales, or social features.</li><li><strong>Reduced Churn:</strong> Faster response times and interactive feedback loops lead to higher user satisfaction. This can directly lower churn.</li><li><strong>Streamlined Internal Collaboration:</strong> Real-time tools for internal teams can boost productivity, reducing reliance on external communication platforms.</li><li><strong>Competitive Differentiation:</strong> If your market lags in adopting advanced RTC capabilities, being an early adopter of high-quality real-time features can differentiate you from competitors.</li></ol><h2 id="final-thoughts-on-build-vs-buy">Final Thoughts on Build vs. Buy</h2><p>Carefully weigh <strong>total cost of ownership</strong>, <strong>speed of deployment</strong>, and <strong>strategic alignment</strong>. Building from scratch is justified when your business has access to specialized RTC engineering talent and when real-time communication is your primary differentiator. Buying an <strong>RTC SDK</strong> is generally the more economical and agile route for most organizations. Ultimately, it boils down to resource availability, compliance obligations, and the unique features your application demands.</p><h3 id="making-the-ultimate-decision">Making the Ultimate Decision</h3><ol><li><strong>Scope Your Use Cases:</strong> Identify the must-have real-time features and their anticipated user volume.</li><li><strong>Calculate Costs Over Time:</strong> Compare multi-year expenses, including intangible costs like opportunity cost.</li><li><strong>Evaluate Team Skills:</strong> Honestly assess whether in-house talent can handle development and ongoing optimization.</li><li><strong>Plan for Future Growth:</strong> Envision user scale five years out. If your user base quadruples, can your custom solution handle it?</li><li><strong>Test Multiple Providers:</strong> If leaning toward buying, test multiple SDKs to confirm which meets your performance and compliance needs.</li></ol><p>By following this guide, you can make an <strong>authoritative</strong> and <strong>informed</strong> decision about whether to <strong>build</strong> or <strong>buy</strong> your <strong>real-time communication SDK</strong>. Each approach has advantages, but understanding the total <strong>cost of ownership</strong>, your organization’s <strong>technical capabilities</strong>, and <strong>time-to-market</strong> requirements will help you chart the most beneficial path forward. With robust <strong>RTC</strong> features in place—either through a <strong>custom build</strong> or a <strong>trusted SDK vendor</strong>—your business can enhance user experiences, foster deeper engagement, and secure a competitive edge in an increasingly real-time world.</p><p>Are you a decision maker starting with your cost-benefit analysis for your voice/video sdk business use case? Drop us a note at at <strong>hello@samvyo.com</strong> or <a href="https://samvyo.com/contact?ref=samvyo.com" rel="noreferrer">here</a>, for an one to one discussion to help you with your decision making with your business use case.</p><p/>]]></content:encoded></item><item><title><![CDATA[5 Key Insights for Enterprises Selecting the Right Real-Time Audio/Video SDK/API Provider]]></title><description><![CDATA[The top 5 key insights for Enterprise decision-makers for selecting the right Real-Time Audio/Video SDK]]></description><link>https://www.samvyo.com/blog/5-key-insights-for-enterprises-selecting-the-right-real-time-audio-video-sdk-api-provider/</link><guid isPermaLink="false">67d2dce5aeb302628d2915d0</guid><category><![CDATA[CPAAS]]></category><category><![CDATA[Customisable WebRTC Solutions]]></category><category><![CDATA[Real-Time Voice Video SDK]]></category><dc:creator><![CDATA[Saurav K. Panda]]></dc:creator><pubDate>Wed, 25 Dec 2024 19:50:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1551135049-8a33b5883817?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDZ8fGVudGVycHJpc2VzfGVufDB8fHx8MTc0MTg3MjM5Mnww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1551135049-8a33b5883817?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDZ8fGVudGVycHJpc2VzfGVufDB8fHx8MTc0MTg3MjM5Mnww&ixlib=rb-4.0.3&q=80&w=2000" alt="5 Key Insights for Enterprises Selecting the Right Real-Time Audio/Video SDK/API Provider"/><p>Integrating video calling, conferencing, or live streaming into existing workflows of a customer facing application has become essential for enterprises aiming to enhance customer engagement, streamline operations, or enable real-time communication. Whether you’re planning to embed these capabilities into a CRM, ERP, or a cloud contact center, the choice of a video SDK/API provider can significantly impact the success of your initiative. For enterprise decision-makers, selecting the right provider involves evaluating technical, business, and operational factors.</p><p>Here are the top five points to consider when choosing a video SDK/API provider for your organization:</p><h4 id="1-alignment-with-business-requirements-and-use-cases">1. <strong>Alignment with Business Requirements and Use Cases</strong></h4><p>Before selecting a video SDK, it’s essential to have a clear understanding of your business goals and specific use cases. Are you integrating video into a CRM for customer support, enhancing ERP systems with video conferencing for remote collaboration, or creating a live streaming platform for large-scale events?</p><p>Key questions to ask:</p><ul><li>Does the SDK support the features you need (e.g., screen sharing, recording, or real-time analytics)?</li><li>Is it compatible with your target devices and platforms (web, mobile, desktop)?</li><li>Can it meet regulatory requirements like HIPAA, GDPR, or SOC 2 for sensitive industries such as healthcare or finance?</li></ul><p>A provider with industry-specific expertise can add significant value by delivering solutions tailored to your needs.</p><h4 id="2-scalability-and-performance">2. <strong>Scalability and Performance</strong></h4><p>Enterprises require solutions that scale seamlessly as their user base grows. High-performance video applications depend on low latency, high reliability, and the ability to handle a large number of simultaneous connections.</p><p>Evaluate the provider on:</p><ul><li>Infrastructure: Does the provider offer global server coverage to ensure low latency for geographically distributed users?</li><li>Load handling: Can the SDK support concurrent sessions or large-scale events without performance degradation?</li><li>Adaptive bitrate streaming: Does it dynamically adjust video quality based on network conditions?</li></ul><p>Test the provider’s solution under different conditions, such as varying bandwidths or peak traffic, to ensure consistent performance.</p><h4 id="3-security-and-compliance">3. <strong>Security and Compliance</strong></h4><p>Security is a critical factor for enterprises, especially when handling sensitive customer data or enabling internal communications. WebRTC’s default encryption capabilities are a starting point, but enterprise-grade applications demand additional safeguards.</p><p>Key security features to look for:</p><ul><li>End-to-end encryption for media streams.</li><li>Secure signaling mechanisms using HTTPS or WSS.</li><li>Role-based access control (RBAC) and token-based authentication.</li><li>Compliance with standards such as ISO 27001, HIPAA, and GDPR.</li></ul><p>Proactively review the provider’s security documentation and conduct audits to ensure your application’s data integrity and user privacy.</p><h4 id="4-ease-of-integration-and-developer-support">4. <strong>Ease of Integration and Developer Support</strong></h4><p>A robust video SDK should offer straightforward integration capabilities to minimize development effort and time to market. Evaluate the provider’s developer ecosystem and resources, including:</p><ul><li>Comprehensive documentation, sample code, and SDKs for multiple programming languages.</li><li>Pre-built UI components to speed up development.</li><li>Access to technical support, developer forums, and training resources.</li></ul><p>Providers offering low-code or no-code options can further simplify the integration process, making them ideal for enterprises with limited technical resources.</p><h4 id="5-cost-and-long-term-viability">5. <strong>Cost and Long-Term Viability</strong></h4><p>Cost is always a significant factor when choosing a technology provider, but enterprises must also consider the long-term viability and ROI of the solution. Key considerations include:</p><ul><li>Pricing model: Does the provider charge based on usage, active users, or a flat rate? Is it scalable with your business growth?</li><li>Vendor stability: Does the provider have a proven track record and financial stability?</li><li>Customization: Can the SDK accommodate your future needs as your business evolves?</li></ul><p>Request detailed pricing plans and assess how costs align with your projected usage and growth.</p><h3 id="alternatives-to-using-a-video-sdkapi-provider">Alternatives to Using a Video SDK/API Provider</h3><p>While leveraging a video SDK is an efficient and cost-effective way to integrate video communication capabilities, some enterprises may prefer to build a custom WebRTC-based application for greater control and flexibility. Building an in-house solution allows businesses to tailor the technology to their exact specifications, but it comes with significant challenges:</p><ul><li>Higher development costs and longer time to market.</li><li>Need for specialized expertise in WebRTC and related technologies.</li><li>Ongoing maintenance, updates, and scalability concerns.</li></ul><p>For enterprises that value flexibility but want to avoid the complexities of custom development, commercially available solutions like <a href="https://samvyo.com/?ref=samvyo.com" rel="noreferrer">Samvyo</a>, offer a balanced approach. <a href="https://samvyo.com/?ref=samvyo.com" rel="noreferrer">Samvyo</a> provides enterprise-grade pre-built solutions to integrate seamlessly into your existing workflows, whether it’s a CRM, ERP, or cloud contact center. With features like advanced analytics, end-to-end encryption, and global scalability, these solutions cater to businesses seeking both reliability and customization.</p><h3 id="final-thoughts-on-selecting-the-right-real-time-audiovideo-apisdk-provider">Final Thoughts on Selecting the Right Real-Time Audio/Video API/SDK Provider</h3><p>Choosing the right video SDK/API provider is a critical decision that can shape the success of your video-enabled workflows. By focusing on alignment with business needs, scalability, security, ease of integration, and cost-effectiveness, enterprises can make informed decisions that drive long-term value.</p><p>If building a custom solution feels overwhelming, exploring providers like <a href="https://samvyo.com/?ref=samvyo.com" rel="noreferrer">Samvyo</a> can be a game-changing alternative. Their ready-to-integrate solutions not only fast-track implementation but also offer the reliability and scalability needed for enterprise-grade applications. Whatever your approach, the goal remains the same: to deliver seamless, secure, and engaging real-time audio/video communication experiences that elevate your business.</p><p>If you are an Enterprise looking for professional help for your planning process before venturing out to integrating a Real-Time Audio/Video SDK/API into your application or building Enterprise-Grade Custom Real-Time Audio/Video solutions for integrating to some of your critical business workflows, feel free to drop us an email at<a href="mailto:athello@centedge.io" rel="noopener"> </a><a href="mailto:hello@centedge.io" rel="noopener"><u>hello@</u></a><u><strong>samvyo.com</strong> </u>for a free 30mins strategic discussion session for diving deep into your requirement to provide you with the correct ingredients required to realize your requirement without time and cost overruns. You can reach out to us using <a href="https://samvyo.com/contact?ref=samvyo.com" rel="noreferrer">this link</a> as well.</p>]]></content:encoded></item><item><title><![CDATA[How to Compile libwebrtc for ARM: WebRTC for Embedded and IoT Devices]]></title><description><![CDATA[WebRTC was built for browsers. On a headless ARM board there is no browser — so you compile the engine itself. The full build for ARM32 and ARM64, plus the flags the quickstart skips: Clang for NEON, libc++ ABI matching, H.264 codecs, and slimming the binary for a device.]]></description><link>https://www.samvyo.com/blog/optimizing-webrtc-for-iot-and-embedded-devices-compiling-libwebrtc-for-arm</link><guid isPermaLink="false">67d2e051aeb302628d2915e6</guid><category><![CDATA[Customisable WebRTC Solutions]]></category><category><![CDATA[Embedded WebRTC]]></category><category><![CDATA[WebRTC on ARM]]></category><category><![CDATA[LibWebRTC]]></category><category><![CDATA[WebRTC C++]]></category><dc:creator><![CDATA[Saurav K. Panda]]></dc:creator><pubDate>Sun, 18 Aug 2024 17:36:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1625571705670-38fc39c923ba?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDZ8fGVtYmVkZGVkJTIwaGFyZHdhcmV8ZW58MHx8fHwxNzQxODczMzU5fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1625571705670-38fc39c923ba?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDZ8fGVtYmVkZGVkJTIwaGFyZHdhcmV8ZW58MHx8fHwxNzQxODczMzU5fDA&ixlib=rb-4.0.3&q=80&w=2000" alt="How to Compile libwebrtc for ARM: WebRTC for Embedded and IoT Devices"/><p>WebRTC is a browser technology by default — but IoT and embedded devices rarely have a browser to run it in, and even when they do, the browser is the wrong place for real-time video on constrained hardware. To run WebRTC natively on a camera, a gateway, or an industrial controller, you compile libwebrtc — the same C++ engine that lives inside Chrome — directly for ARM. Do it right and you get real-time audio and video on a low-power ARM CPU with a fraction of the overhead. Do it wrong and you lose days to a toolchain that fails quietly. This guide walks the full build to compile libwebrtc for ARM (both ARM32 and ARM64), then covers the flags and gotchas that the official docs leave out.</p><h2 id="why-compile-libwebrtc-natively-instead-of-using-the-browser"><strong>Why compile libwebrtc natively instead of using the browser</strong></h2><p>On a desktop, WebRTC in the browser is fine. On embedded and IoT hardware, three things change. There is often no browser at all — a headless camera or gateway has no Chrome to host a WebRTC session. Resources are tight — a browser carries enormous overhead you can’t spare on a device measured in hundreds of megabytes of RAM. And efficiency is the product — lower CPU means lower power, lower heat, and longer life in the field.</p><p>Compiling libwebrtc natively gives you the real-time stack — capture, encode, transport, the peer connection — as a C++ library you link into your own application, with none of the browser wrapped around it. The result is lower latency, tighter control over resources, and a build you can tune for the exact SoC you’re shipping. (For the wider picture of how these media flows are routed once they leave the device, see our explainer on what an SFU is.)</p><p>Before the build itself, a few things will save you a wasted afternoon.</p><h2 id="before-you-start-prerequisites"><strong>Before you start: prerequisites</strong></h2><p>The libwebrtc checkout is large — budget 25–30 GB of free disk and as much RAM as you can give the compile; linking is memory-hungry. Decide up front whether you’re building natively on the ARM device or cross-compiling from an x86 Linux machine. Cross-compiling on a fast x86 host is almost always the right call — compiling the full engine on the target board itself can take hours or fail on memory.</p><p>One decision matters more than any other: pin a version. The fetch webrtc command pulls the tip of tree, which breaks often. For anything you intend to ship, check out a stable milestone branch (branch-heads/XXXX) instead, so your build is reproducible and not at the mercy of whatever landed in the tree that morning. With that settled, here’s the build.</p>
<!--kg-card-begin: html-->
<h2>Steps to Compile LibWebRTC for ARM</h2>

<h4>1. Set Up the Build Environment</h4>
<p>Start with an Ubuntu environment — either on the ARM device directly, or on an x86 machine if you’re cross-compiling. Install the core dependencies:</p>

<pre><code>sudo apt-get update
sudo apt-get install build-essential python git</code></pre>

<h4>2. Fetch the LibWebRTC Source Code</h4>
<p>Clone depot_tools, Google’s toolset for managing the source, and put it on your PATH:</p>

<pre><code>git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH="$PATH:/path_to_depot_tools"</code></pre>

<p>Then fetch the source and sync its dependencies:</p>

<pre><code>fetch --nohooks webrtc
cd src
gclient sync</code></pre>
<p>This is the step to pin to a milestone branch rather than tip-of-tree if you’re building for production, as noted above.</p>

<h4>3. Explore Available GN Build Options</h4>
<p>Before generating the build, list every configurable option so you can tune the build for your target:</p>

<pre><code>gn args out/Default --list</code></pre>


<h4>4. Set Up GN Configuration</h4>
<p>Generate the build files for your target architecture. For ARM32:</p>

<p>For <strong>ARM32</strong>:</p>

<pre><code>gn gen out/arm32 --args='target_os="linux" target_cpu="arm" is_debug=false is_clang=true use_custom_libcxx=false'</code></pre>

<p>For <strong>ARM64</strong>:</p>

<pre><code>gn gen out/arm64 --args='target_os="linux" target_cpu="arm64" is_debug=false is_clang=true use_custom_libcxx=false'</code></pre>

<p>Selecting the correct <code>target_cpu</code> (either <code>arm</code> for ARM32 or <code>arm64</code> for ARM64) is crucial for optimizing the build for your IoT or embedded device.</p>

<h4>5. Compile the Code</h4>
<p>Once the GN configuration is set, you can proceed to compile the code using Ninja.</p>

<p>For ARM32:</p>

<pre><code>ninja -C out/arm32</code></pre>

<p>For ARM64:</p>

<pre><code>ninja -C out/arm64</code></pre>

<p>The compilation process may take some time, depending on your system’s hardware capabilities.</p>

<h4>6. Deploy and Test</h4>
<p>Copy the compiled binaries to your target ARM device and test thoroughly. Don’t just check that it runs — verify the performance you compiled for actually materialized: CPU under load, that NEON acceleration is engaged, and that a real call survives a degrading network. A build that “works” on the bench can still fall over on the device.</p>

<!--kg-card-end: html-->
<h2 id="the-build-gotchas-nobody-warns-you-about"><strong>The build gotchas nobody warns you about</strong></h2><p>The commands above get you a build. These are the things that decide whether it’s a build you can actually ship.</p><p>is_clang=true is mandatory on ARM. This flag makes the build use the Clang that libwebrtc ships with, which is required to compile the NEON flags in the ARM architecture that accelerate video rendering. The default GCC on Ubuntu can’t compile these flags — it complains about NEON and stops. Use the bundled Clang, not the system GCC.</p><p>use_custom_libcxx=false keeps your ABI sane. By default libwebrtc links its own bundled libc++. If your application is built against the system C++ standard library, that mismatch produces link errors and subtle runtime failures when you integrate the library. Setting this to false builds against the system libc++ so the library and your app agree on one ABI.</p><p>H.264 needs extra flags. Many embedded pipelines rely on hardware H.264, but libwebrtc ships without proprietary codecs enabled. To include H.264 you need to build with the proprietary-codec and FFmpeg flags turned on — broadly, rtc_use_h264=true, proprietary_codecs=true, and ffmpeg_branding="Chrome". If your device encodes or decodes H.264 in hardware, decide this before you build, not after.</p><p>Slim the binary down. A default build is large. For a device, a static library with the fat trimmed off is easier to ship — is_component_build=false for a single static lib, symbol_level=0 to drop debug symbols, and rtc_include_tests=false to skip building the test suite you’ll never run on-device. Each one cuts size and build time.</p><p>Mind the cross-compile sysroot. When you cross-compile from x86, the build needs a sysroot matching your target’s architecture and libc. A mismatched or missing sysroot is one of the most common reasons a cross-build fails late, after you’ve already waited through most of it.</p><p>None of these are in the quick-start. All of them are the difference between a demo binary and one that ships.</p><h2 id="what-we-learned-building-this-for-real"><strong>What we learned building this for real</strong></h2><p>We recently built a C++ video application for ARM devices — both 32-bit and 64-bit — to work with our existing cloud video infrastructure. The honest takeaway: it is not an easy task, and it needs real effort to compile and build a native C++ video application that behaves in production. The build is only the first hurdle. Integrating the library cleanly into your own application, getting the codecs your hardware actually uses, and keeping calls stable across the flaky networks embedded devices live on — that’s where the time goes. If you’re starting an embedded or IoT video project and this is new territory, expect the schedule to be dominated by the integration and tuning, not the initial compile.</p><h2 id="the-bottom-line"><strong>The bottom line</strong></h2><p>Compiling libwebrtc for ARM is how you bring real-time WebRTC to devices that were never meant to run a browser — cameras, gateways, controllers, anything on a low-power ARM CPU. The build itself is a handful of commands. What separates a shippable result from a wasted week is the detail: pinning a milestone instead of tip-of-tree, using Clang for NEON, matching your libc++ ABI, enabling the codecs your hardware needs, and testing on the real device under real network conditions. Get those right and native WebRTC on ARM is genuinely a different class of efficiency than anything browser-based.</p><h2 id="building-embedded-or-iot-video"><strong>Building embedded or IoT video?</strong></h2><p>If you have an IoT or embedded video conferencing or streaming use case and aren’t sure where to start, we’ve done this — native C++ WebRTC on 32-bit and 64-bit ARM, wired into cloud video infrastructure. Reach out at <a href="mailto:hello@samvyo.com" rel="noreferrer"><strong>hello@samvyo.com</strong></a>, or use the <a href="https://samvyo.com/demo?ref=samvyo.com" rel="noreferrer">demo link</a> on this page to talk through your use case with one of our engineers.</p><h2 id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2><h3 id="can-you-run-webrtc-on-arm-and-embedded-devices"><strong>Can you run WebRTC on ARM and embedded devices?</strong></h3><p>Yes. WebRTC isn’t limited to browsers — you can compile libwebrtc, the C++ engine inside Chrome, natively for ARM and link it into your own application. That lets a camera, gateway, or other embedded device run real-time audio and video without a browser and with far less overhead.</p><h3 id="do-you-need-a-browser-to-use-webrtc-on-iot-devices"><strong>Do you need a browser to use WebRTC on IoT devices?</strong></h3><p>No. A browser is one way to run WebRTC, not the only way. On IoT and embedded hardware you compile libwebrtc natively and run it as part of a C++ application, which is both possible on headless devices and far more efficient than hosting a browser.</p><h3 id="why-do-you-need-isclangtrue-to-compile-libwebrtc-for-arm"><strong>Why do you need is_clang=true to compile libwebrtc for ARM?</strong></h3><p>Because the ARM build relies on NEON flags for video acceleration, and the default GCC on Ubuntu can’t compile them — it errors on the NEON flags. Setting is_clang=true uses the Clang that libwebrtc bundles, which compiles them correctly.</p><h3 id="how-do-you-get-h264-support-in-a-libwebrtc-arm-build"><strong>How do you get H.264 support in a libwebrtc ARM build?</strong></h3><p>H.264 is a proprietary codec and is off by default. You enable it at build time with the proprietary-codec and FFmpeg flags — broadly rtc_use_h264=true, proprietary_codecs=true, and ffmpeg_branding="Chrome". This matters most when your device has hardware H.264 encode or decode.</p><h3 id="how-long-does-it-take-to-compile-libwebrtc-for-arm"><strong>How long does it take to compile libwebrtc for ARM?</strong></h3><p>It varies with your hardware, but a full build is heavy — potentially hours if you compile on the ARM device itself. Cross-compiling from a fast x86 machine is much quicker and is the recommended approach. Budget 25–30 GB of disk and plenty of RAM either way.</p><h3 id="can-samvyo-help-with-embedded-or-iot-webrtc"><strong>Can Samvyo help with embedded or IoT WebRTC?</strong></h3><p>Yes. Alongside its SFU-based cloud video platform and SDKs, Samvyo has built native C++ WebRTC clients for ARM devices that connect back to that infrastructure. For teams that need real-time video on embedded hardware without absorbing the full build-and-integrate effort themselves, that experience is available as part of the platform.</p>]]></content:encoded></item><item><title><![CDATA[WebRTC Media servers, Why, When, and How to choose one for your next application.]]></title><description><![CDATA[A comprehensive guide to help you choose your media server for building a custom webrtc video application that can manage Enterprise workloads.]]></description><link>https://samvyo.com/blog/webrtc-media-servers-why-when-and-how-to-choose-one-for-your-next-app</link><guid isPermaLink="false">67ed025c2016a5f94cddc117</guid><category><![CDATA[enterprise video solutions]]></category><category><![CDATA[Customisable WebRTC Solutions]]></category><category><![CDATA[WebRTC]]></category><category><![CDATA[webrtc media servers]]></category><dc:creator><![CDATA[Saurav K. Panda]]></dc:creator><pubDate>Thu, 20 Jun 2024 10:22:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1492619375914-88005aa9e8fb?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDh8fHZpZGVvfGVufDB8fHx8MTc0MzU4MDQ0NXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1492619375914-88005aa9e8fb?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDh8fHZpZGVvfGVufDB8fHx8MTc0MzU4MDQ0NXww&ixlib=rb-4.0.3&q=80&w=2000" alt="WebRTC Media servers, Why, When, and How to choose one for your next application."/><p>A media server in a WebRTC infrastructure plays a critical role in scaling a WebRTC call beyond 4 participants. Whenever you join a call that has 8-10 participants or more, know that a media server is doing the hard work behind the scene to provide you with a smooth audio/video experience. If you have a need for building a WebRTC infrastructure and you need to select a WebRTC media server for your use case, then this post is going to help you with enough information to take an informed decision.</p><p>Before Jumping in to build your own webrtc infrastructure, make sure to read the comprehensive guide we for decision makers for choosing between build with WebRTC vs buy a proprietary video SDK like <a href="https://samvyo.com/products/real-time-voice-video-ai-sdk-for-businesses?ref=samvyo.com" rel="noreferrer">Samvyo real-time voice video sdk</a>.</p><h4 id="why-and-when-a-webrtc-media-server-is-required">Why and When a WebRTC Media Server is required?</h4><p>A WebRTC Media Server is a critical piece of software that helps a WebRTC application distribute audio/video streams to all the participants of an audio/video meeting. Without them, creating a large audio/video call beyond 4 users would be a highly difficult task due to the nature of WebRTC calls. WebRTC calls are designed for real-time use cases (&lt;1 second of delay between the sender and receiver of an audio/video stream). In this case, a user sending his/ her audio/video streams has to send the streams to all the participants who are joining the conference for viewing it in real-time, so that a real conversation can happen. Imagine a call with 10 people, where everybody is sending his / her audio/video stream to rest 9 people(other than himself/herself) so that they can view it in real time. Let's do some maths to find out some interesting details.</p><p>When a user joins an audio-video call that is running on WebRTC, he/she can share either audio/video/screen or all of them together.</p><p>If joined only with audio: ~40Kbps of upload bandwidth is consumed</p><p>if joined with only video: ~ 500Kbps of upload bandwidth is consumed</p><p>if joined with only screen share: ~ 800 Kbps of upload bandwidth is consumed</p><p>if all 3 are shared together : ~1340Kbps or 1.3Mbps of upload bandwidth is consumed</p><p>If there are 10 people in the meeting, then 1.3 * 9 = 11.7 Mbps of upload bandwidth will be consumed every second! Remember that you need to send your audio/video/screen-share or all of them together to everybody else except yourself. Anybody who doesn't have a consistent 11.7Mbps bandwidth, can't join this meeting!</p><p>This also brings another challenge for the device being used by the user to join the conference. The CPU of the device has to work very hard to compress and encode the audio/video/screen share video streams to send over the network as data packets. If the CPU has to spend 5% of its capacity to compress and encode the users audio/video/screen-share streams to send it to another user who has joined the meeting, then it has to spend 9 * 5 = 45% of its efforts to compress, encode, and send the user's audio/video/screen-share streams to rest 9 participants.</p><p>Is the CPU not wasting its efforts by trying to do the exact same thing 9 times in this case?</p><p>Can we not compress, encode, and send just the user's audio/video/screen-share streams</p><p>once to the cloud and the cloud does some magic to replicate the audio/video/screen-share streams of that user and send it to everybody else present in the same meeting room!</p><p>Yes we possibly can do this magic and the name of this magic is Media Server!</p><h4 id="different-kinds-of-webrtc-media-servers-mcu-vs-sfu">Different kinds of WebRTC Media Servers, MCU vs. SFU</h4><p>Primarily there are 2 kinds of Media servers. One is a <a href="https://samvyo.com/what-is-an-sfu-and-why-does-every-video-platform-use-one?ref=samvyo.com" rel="noreferrer">SFU</a> and another is a MCU.</p><p>According to the last example, now we know that we need a media server that can replicate and distribute the streams of a user to as many people as needed without wasting the user's network and CPU capacity. Let's take this example forward.</p><p>There is a situation, where the meeting needs to support various UI layouts with a good amount of configuration options regarding who can view and listen to whom! It turns out that this is going to be a virtual event with various UI layouts like Stage, backstage, front-row seats, etc. Here the job of the media server is to replicate and distribute the streams to everybody else except the user himself/herself. Therefore in this case of a 10-user virtual event, every user will be sending only his / her streams to the media server once and receiving the streams from everybody else as individual streams. This way, the event organizer can create multiple UI layouts for viewing by different users according to the place they currently are in, i.e. the backstage/ stage / front row. In this situation, the SFU is helping us by sending all the streams as individual audio/video streams without forcing the way they should be displayed to an individual user. In an SFU, though the user sends only his/her audio/video/screen-share streams it receives from everybody else as individual streams which consumes download bandwidth based on the number of participants — which is also <a href="https://samvyo.com/blog/why-your-sfu-bandwidth-cost-scales-with-viewers-not-publishers?ref=samvyo.com">why the server's bandwidth bill is set by viewers, not publishers</a>. the more the number of participants, the more the download bandwidth is consumed!</p><p>Now let's take a different situation of a team meeting of 10 users of an organization who don't need much dynamism in the UI but are happy with the usual Grid layout of videos. In this situation, we can merge the audio and video streams of all other participants except himself/herself in the server and create one audio/video stream which can then be sent to all other participants. Here, all the users will send their own audio/video stream and receive all others' combined audio/video stream(Only one stream!) in a fixed layout as created by the server. The UI will just show one video which was sent by the server as the combined video element. Here MCU is helping us do our job neatly. In this situation, the download bandwidth consumption will be consistent irrespective of the number of users joining the meeting as every user will receive only one audio/video stream from the server. The 2 major downside of this approach is the number of servers needed to create a combined video of all users would be much higher than just replicating and sending the approach of an SFU and rigid UI layout which is already decided by the server without the UI having any control over it.</p><p>Two of the largest global video conferencing services use one of the approaches described above.</p><p>Gmeet : SFU</p><p>MS Teams: MCU</p><p>SFUs are slowly gaining more popularity due to the amount of flexibility they provide in creating UI layouts which is highly important for an engaging user experience and takes much lesser servers to cater to a large number of users as compared to an MCU. We are going to discuss the most popular SFUs available out there today and how to choose one for your next WebRTC Media Server requirement.</p><h4 id="how-to-choose-a-webrtc-media-server-for-your-next-requirement">How to Choose a WebRTC Media Server for your next requirement?</h4><p>In this section, we are going to discuss the top open-source media servers currently available out there and how they perform against each other. Here, I am going to discuss those media servers which use WebRTC/ openRTC as their core implementation. I won't be covering the media servers built on PION, the go implementation of WebRTC as that needs a different post.</p><p>We would be discussing some of the key things about the below media servers.</p><ol><li>Jitsi Video Bridge(JVB), Jitsi (SFU)</li><li>Kurento (SFU + MCU)</li><li>Janus (SFU)</li><li>Medooze (SFU + MCU)</li><li>Mediasoup(SFU)</li></ol><p>We would primarily be discussing the performance of each media server along with its suitability for building a WebRTC infrastructure.</p><h4 id="jitsi-video-bridgejvb-jitsi">Jitsi Video Bridge(JVB), Jitsi</h4><p>Jitsi is a very popular open-source video conferencing solution available out there today. It is so popular because it provides a complete package for building a video conferencing solution including a web &amp; mobile UI, the media server component which is JVB along with some required add-ons like recording and horizontal scalability out of the box where it runs out of road at enterprise scale, is covered in <a href="https://samvyo.com/blog/open-source-video-infrastructure-for-enterprise-why-companies-outgrow-jitsi-livekit-and-self-hosted-webrtc?ref=samvyo.com">why companies outgrow Jitsi and LiveKit</a>.. It has very good documentation as well which makes it easy to configure it on a cloud like AWS.</p><h4 id="kurento">Kurento</h4><p>Kurento used to be the de facto standard for building WebRTC apps for the promises it made to the WebRTC developers with its versatility(SFU + MCU) and OpenCV integration for real-time video processing way back in 2014. But after the acquisition of Kurento and its team by Twillio in 2017, the development has stopped and now it's in maintenance mode. One can understand that it is not so great now from the fact that the current team which is maintaining Kurento has a freemium offering named OpenVidu which uses mediasoup as its core media server!</p><h4 id="janus">Janus</h4><p>Janus is one of the most performant SFUs available out there with very good documentation. It has a very good architecture where the Janus core does the job of routing and allows various modules to do various jobs including recording, bridging to SIP/PSTN, etc. It is being updated regularly by its backer to keep it up-to-date with the latest WebRTC changes. This can be a choice for building a large-scale Enterprise RTC application which needs a good amount of time and resource investment for building the solution. The reason is that it has its own way of architecting the application and can't be integrated as a module into a large application like mediasoup.</p><h4 id="medooze">Medooze</h4><p>Medooze is more known for its MCU capabilities than SFU capabilities though its SFU is also a capable one. Though it is a performant media server, it lacks in the documentation side which is key for open source adoption. It was acquired by Cosmo Software in 2020 after which Cosmo Software has been acquired by Dolby. This can be your choice if you are a pro in WebRTC and know most of the stuff by yourself. From Github commits it seems that it is still in active development but it still needs good effort in the documentation side.</p><h4 id="mediasoup">Mediasoup</h4><p>Mediasoup is a highly performant SFU media server available today with detailed documentation and it is backed by a team of dedicated authors with a vibrant open source community and backers. the best part is that it can be integrated into a large Nodejs / Rust application as a module to let it do its job as part of a large application. It has a super low-level API structure which enables developers to use whatever/however they need to use it inside their application. Though it needs a good amount of understanding to build a production-ready application that is beyond the demo provided by the original authors, it is not that difficult to work with it if one is passionate and dedicated to learning the details.</p><p>Below is a set of exhaustive performance benchmarking tests done by Cosmo Software people back in 2020 at the height of COVID when WebRTC usage was going beyond the roof to keep the world running remotely. Below are the important points from the test report that are needed to be considered. The whole test report can be found at the bottom of this post for people interested to know more.</p><p>Testing a WebRTC application needs to be done with virtual users which actually are cloud VMs joining a meeting room as a test user performing a certain task/tasks. In this case, the test users aka cloud VMs joined using the below-mentioned configuration. In this case, all the above servers were hosted as a single instance server using a VM as described below.</p><p>The next is load parameters which were used to test each of these media servers. The numbers are not the same for all these media servers as the peak load (after which a media server fails!) capacity is not the same for every one of these. Here these peak load numbers of each media server have been derived after a good amount of DRY runs.</p><figure class="kg-card kg-image-card"><img src="https://www.samvyo.com/blog-admin1/content/images/2025/04/SFU_test_VM_Config.png" class="kg-image" alt="WebRTC Media servers, Why, When, and How to choose one for your next application." loading="lazy" width="776" height="282" srcset="https://www.samvyo.com/blog-admin1/content/images/size/w600/2025/04/SFU_test_VM_Config.png 600w, https://www.samvyo.com/blog-admin1/content/images/2025/04/SFU_test_VM_Config.png 776w" sizes="(min-width: 720px) 720px"/></figure><p>The test result of the load test.</p><figure class="kg-card kg-image-card"><img src="https://www.samvyo.com/blog-admin1/content/images/2025/04/SFU_Test_result.png" class="kg-image" alt="WebRTC Media servers, Why, When, and How to choose one for your next application." loading="lazy" width="794" height="446" srcset="https://www.samvyo.com/blog-admin1/content/images/size/w600/2025/04/SFU_Test_result.png 600w, https://www.samvyo.com/blog-admin1/content/images/2025/04/SFU_Test_result.png 794w" sizes="(min-width: 720px) 720px"/></figure><ul><li>Page loaded: true if the page can load on the client side which is running on a cloud VM.</li><li>Sender video check: true if the video of the sender is displayed and is not a still or blank image.</li><li>All video check: true if all the videos received by the six clients from the SFU passed the video check which means every virtual client video can viewed by all other virtual clients.</li></ul><p>There are other important aspects of these media servers like RTT(Round Trip Time), Bitrates and overall video quality.</p><figure class="kg-card kg-image-card"><img src="https://www.samvyo.com/blog-admin1/content/images/2025/04/Avg_Bitrate.png" class="kg-image" alt="WebRTC Media servers, Why, When, and How to choose one for your next application." loading="lazy" width="794" height="446" srcset="https://www.samvyo.com/blog-admin1/content/images/size/w600/2025/04/Avg_Bitrate.png 600w, https://www.samvyo.com/blog-admin1/content/images/2025/04/Avg_Bitrate.png 794w" sizes="(min-width: 720px) 720px"/></figure><p>The Bitrate is directly responsible for video quality. It simply means how many media stream data packets are being transmitted in real time. the higher the bitrate the better is the image quality but the higher the load on the network to transmit and on the client side CPU to decode. Therefore, it is always a balancing act tp trying to send as many data packets aka the bitrate as possible without congesting the network or overburdening the CPU. Here a good media server can play a good role with techniques like <a href="https://samvyo.com/blog/what-is-simulcast-and-when-does-it-save-or-waste-bandwidth?ref=samvyo.com">Simulcast / SVC to personalise the bitrate</a> for each individual receiver based on their network and CPU capacity.</p><figure class="kg-card kg-image-card"><img src="https://www.samvyo.com/blog-admin1/content/images/2025/04/Avg_RTT.png" class="kg-image" alt="WebRTC Media servers, Why, When, and How to choose one for your next application." loading="lazy" width="814" height="472" srcset="https://www.samvyo.com/blog-admin1/content/images/size/w600/2025/04/Avg_RTT.png 600w, https://www.samvyo.com/blog-admin1/content/images/2025/04/Avg_RTT.png 814w" sizes="(min-width: 720px) 720px"/></figure><p>The RTT is an important parameter which tells that how fast a a media stream data aka RTP packet is delivered over the real time network conditions. The lower the RTT the better it is.</p><figure class="kg-card kg-image-card"><img src="https://www.samvyo.com/blog-admin1/content/images/2025/04/Avg_Video_Quality.png" class="kg-image" alt="WebRTC Media servers, Why, When, and How to choose one for your next application." loading="lazy" width="814" height="494" srcset="https://www.samvyo.com/blog-admin1/content/images/size/w600/2025/04/Avg_Video_Quality.png 600w, https://www.samvyo.com/blog-admin1/content/images/2025/04/Avg_Video_Quality.png 814w" sizes="(min-width: 720px) 720px"/></figure><p>As it tells, this is the video quality being transmitted by the media server in various load patterns. The higher the quality the better it is.</p><p>We hope we were able to provide a brief description of each media server with enough data points so that you can make a good decision in choosing the media server for your next video project. Feel free to drop us an email at <strong>hello@samvyo.com</strong> if you need any help with your selection process or with video infrastructure development process if you are not looking for a ready to use video sdk solution for some reason. If you are looking for custom WebRTC development, <a href="https://samvyo.com/?ref=samvyo.com" rel="noreferrer">check them out</a>.</p><p>PS: <a href="https://mediasoup.org/resources/CoSMo_ComparativeStudyOfWebrtcOpenSourceSfusForVideoConferencing.pdf?ref=videoedge.io" rel="noopener"><u>Here is the link</u></a> to the full test report if anybody is interested in reading the whole of it which has a detailed description of this load test along with many interesting findings.</p>]]></content:encoded></item><item><title><![CDATA[Twilio Video Alternatives in 2026: What Actually Happened, and How to Choose]]></title><description><![CDATA[Twilio killed its video API, then un-killed it. The tool survived — but the reason you went looking for alternatives didn’t. What actually happened, what Twilio Video was built on, the real alternatives on both sides, and how to choose one you won’t have to leave in a panic.]]></description><link>https://www.samvyo.com/blog/twilio-video-alternatives-for-enterprises</link><guid isPermaLink="false">67d2e167aeb302628d291604</guid><category><![CDATA[CPAAS]]></category><category><![CDATA[Customisable WebRTC Solutions]]></category><category><![CDATA[Real-Time Voice Video SDK]]></category><dc:creator><![CDATA[Saurav K. Panda]]></dc:creator><pubDate>Thu, 30 May 2024 19:02:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1533073526757-2c8ca1df9f1c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fGNyb3NzJTIwcm9hZHN8ZW58MHx8fHwxNzQxODczOTE0fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1533073526757-2c8ca1df9f1c?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fGNyb3NzJTIwcm9hZHN8ZW58MHx8fHwxNzQxODczOTE0fDA&ixlib=rb-4.0.3&q=80&w=2000" alt="Twilio Video Alternatives in 2026: What Actually Happened, and How to Choose"/><p>If you searched for a Twilio Video alternative in the last two years, you were probably reacting to the same news everyone else was: Twilio announced it was shutting its video API down. Here’s the part most articles still haven’t caught up on — it didn’t. Twilio reversed the decision, and Twilio Video is generally available today. So if the tool still works, why are you here looking for alternatives? Because the shutdown scare was never really about Twilio. It exposed a risk that lives inside every managed video API, and that risk didn’t disappear when Twilio changed its mind. This post covers what actually happened, the alternatives worth knowing, and — more usefully — how to choose one so you’re never caught in this position again.</p><h2 id="what-actually-happened-to-twilio-video">What actually happened to Twilio Video</h2><p>Let’s set the record straight, because being accurate here is genuinely useful — most competing articles still aren’t. In late 2023, Twilio announced the end of life for its Programmable Video product. The developer community reacted exactly as you’d expect: a scramble for alternatives. Then Twilio extended the timeline, and in late 2024 it reversed course entirely. As of 2026, Twilio Video is still generally available, with Group Rooms supporting up to 50 participants at roughly $0.004 per participant-minute.</p><p>So the immediate crisis passed. But anyone who spent early 2024 planning a migration remembers the feeling: the future of your core infrastructure was decided in a room you weren’t in. That feeling — not the tool itself — is the real subject of this post.</p><p>To understand why it happened, and why it could happen to any managed provider, it helps to know what Twilio Video was actually built on. This is where I can offer something most comparison articles can’t: I was there.</p><h2 id="the-deeper-story-what-twilio-video-was-built-on">The deeper story: what Twilio Video was built on</h2><p>Those of us who followed WebRTC from its earliest days — 2012, 2013 — remember a promise made to the developer community by an open-source media server called Kurento. At the time it was the leading media server, and its pitch was extraordinary: selective forwarding (SFU), stream mixing (MCU), and real-time processing through OpenCV, all in one package. On paper it was the perfect media server — the thing that would change media scaling and real-time video forever. It came out of a Spanish university, maintained by professors, students, and a community of contributors.</p><p>I used Kurento myself for commercial and personal projects in 2014 and 2015, and I was as excited about it as anyone. But after a couple of years running it in production, the cracks showed. It was hard to manage and hard to scale — resource-hungry, slow, and unable to handle large numbers of concurrent rooms. Capabilities you can’t do without, like ICE restarts (essential the moment you’re dealing with unreliable networks), were missing. By 2019 we’d concluded we had to move our commercial project to a better media server.</p><p>Here’s the part that matters. Twilio acquired Kurento — reportedly for around $40 million — and built Twilio Video on top of it. I suspect that somewhere around 2023, Twilio ran into a version of the same realization we’d had in 2019: that the foundation had limits that were expensive to keep fighting. I can’t prove that drove the EOL decision — I can only tell you what it looked like from the outside, with the benefit of having walked the same road.</p><p>The lesson isn’t “Kurento was bad” or “Twilio made a mistake.” It’s that a foundational choice made early — the media server you build on — echoes for years, and by the time its limits surface, they’re structural. That’s true for the vendor you buy from just as much as for a stack you build yourself. (If you want the primer on why the media server matters this much, our explainer on what an SFU is covers it.)</p><p>Which reframes the question you probably came here with.</p><h2 id="why-%E2%80%9Cwill-they-shut-it-down-again%E2%80%9D-is-the-wrong-question">Why “will they shut it down again?” is the wrong question</h2><p>The instinct after a scare like this is to ask, “Is my next vendor going to do the same thing?” It’s the wrong question, because you can’t answer it — no vendor will tell you, and roadmaps change. The better question is: if they did, how much would it cost me to leave?</p><p>That’s vendor risk, and it’s a property of your architecture, not your provider’s intentions. If your video is deeply coupled to one provider’s proprietary APIs, an EOL notice is a crisis. If your media path is portable — if you own the parts that are expensive to rebuild — it’s an inconvenience. (We go deeper on this in our piece on video API vendor risk.) Judge the alternatives below not just on features and price, but on how much they lock you in.</p><p>Broadly, those alternatives fall into two camps.</p><h2 id="the-two-real-paths-to-a-twilio-video-alternative">The two real paths to a Twilio Video alternative</h2><p>When people say “Twilio Video alternative,” they usually mean one of two very different things: an open-source media server you run, or a commercial SDK you rent. They solve the same problem from opposite ends.</p><p>The open-source route means taking a media server and building your video application on top of it. The strongest options today are mediasoup (a well-regarded SFU, though its demo project is a starting point, not a finished product), LiveKit (built on Pion, the Go implementation of WebRTC — a natural fit if your backend is Go), and Jitsi (a ready-to-run conferencing stack whose prebuilt UI is hard to customize deeply, which makes it better for embedding than for a bespoke product). You get full control and no per-minute bill; you take on the engineering and the operations. (Our piece on why enterprises outgrow Jitsi, LiveKit, and self-hosted WebRTC covers where this route hits its limits.)</p><p>The commercial route means an SDK that hands you audio/video capability without building it yourself — providers like Agora and Daily, among others. You trade a per-minute bill and some vendor dependency for speed and someone else running the infrastructure. (We break down what that per-minute bill actually looks like at enterprise scale in our pricing analysis.)</p><p>Neither is universally right. Which one fits depends on a decision most people skip.</p><h2 id="build-from-scratch-or-use-a-vendor">Build from scratch, or use a vendor?</h2><p>The honest test is whether real-time video is core to your business or a feature inside it.</p><p>Building from scratch makes sense only if you have three things: a small team of genuine specialists in the core audio/video technologies (WebRTC, SIP, FFmpeg, GStreamer), the peripheral skills to build web and mobile clients around them, and a runway of at least 12 months with the budget to sustain a team of eight to ten — longer if your use case is unusual. What that team <a href="https://samvyo.com/blog/webrtc-sdk-vs-build-what-you-actually-write-yourself?ref=samvyo.com">actually ends up writing itself, versus what an SDK hands you</a> is the concrete version of this test. In return you get complete control and no vendor lock-in, and you own every one of the hard problems too.</p><p>Using a vendor makes sense if you don’t have that team, don’t have that runway, or simply don’t want video engineering to be your company’s problem. You get most of the benefits of open source — without personally maintaining it — plus support, scaling, and quality control. The financial outlay can be similar to building; the difference is a predictable result, faster.</p><p>The rule of thumb: if audio/video is mission-critical and tightly coupled to your core workflows, lean toward owning more of the stack. If it’s an important feature but not the product itself, a vendor is usually the rational call.</p><h2 id="how-to-choose-a-twilio-video-alternative">How to choose a Twilio Video alternative</h2><p>Four criteria separate a real Twilio Video alternative from a downgrade.</p><p>Reliability. Uptime, and behavior under stress. The only honest test is a proof-of-concept that pushes edge cases — how do audio and video hold up when the network degrades, or when a user <a href="https://samvyo.com/blog/nat-traversal-in-webrtc-why-the-call-connects-on-wi-fi-but-not-on-4g?ref=samvyo.com">switches from 5G to Wi-Fi mid-call and the session has to re-establish its path</a>? Those moments reveal how deeply a provider actually understands video.</p><p>Scalability. Not a concern for every use case — but if you need thousands of users in one room, or thousands of concurrent rooms, ask for the provider’s load-test reports, and better still, run your own against a POC.</p><p>Security. Non-negotiable with sensitive data. Does the provider offer end-to-end encryption where you need it? Can recordings be stored encrypted? Does it meet GDPR, HIPAA, or whatever your industry requires?</p><p>Integration. If it takes ten API calls to do something simple, or a critical API for your use case simply doesn’t exist, the other three criteria don’t matter. Run any candidate — open source or commercial — through all four, ideally with a real POC, before you commit.</p><h2 id="the-bottom-line">The bottom line</h2><p>Twilio Video didn’t shut down — but the scare did you a favor: it showed you how little control you have over a roadmap you don’t own. A good Twilio Video alternative isn’t just the one with the right features or the lowest per-minute rate. It’s the one that leaves you in control of the parts that are expensive to rebuild, so the next EOL notice — from anyone — is a shrug instead of a fire drill. Whether that’s an open-source stack you run or a vendor you can genuinely trust, decide it deliberately, and test it against your own edge cases before you build your business on it.</p><h2 id="talk-through-your-use-case">Talk through your use case</h2><p>If you want to work through a Twilio Video alternative tailored to your situation — especially if control over your media, your data, and your deployment matters — reach out at <a href="mailto:hello@samvyo.com" rel="noreferrer"><strong>hello@samvyo.com</strong></a>, or use the <a href="https://samvyo.com/demo?ref=samvyo.com" rel="noreferrer">demo link</a> on this page to schedule a conversation with one of our engineers.</p><h2 id="frequently-asked-questions">Frequently Asked Questions</h2><h3 id="is-twilio-video-shutting-down">Is Twilio Video shutting down?</h3><p>No. Twilio announced the end of life for its Programmable Video product in late 2023, extended the timeline in 2024, and then reversed the decision. As of 2026, Twilio Video is still generally available — the shutdown many teams migrated away from never actually happened.</p><h3 id="what-are-the-best-twilio-video-alternatives">What are the best Twilio Video alternatives?</h3><p>There’s no single best one — it depends on whether you want to own or rent. Open-source media servers like mediasoup, LiveKit, and Jitsi give you control with no per-minute cost but require engineering. Commercial SDKs like Agora and Daily give you speed and managed infrastructure for a usage-based fee. The right choice depends on your team, your scale, and how critical video is to your product.</p><h3 id="is-twilio-video-still-available-in-2026">Is Twilio Video still available in 2026?</h3><p>Yes. After reversing its planned end-of-life, Twilio kept Programmable Video generally available. Group Rooms support up to 50 participants at roughly $0.004 per participant-minute. The service works — but the episode is a reminder that a managed provider’s roadmap can change without your input.</p><h3 id="should-i-migrate-off-twilio-video">Should I migrate off Twilio Video?</h3><p>Not necessarily. If it meets your needs, staying is reasonable. The more useful question is how much switching would cost you if you had to — which depends on how tightly your application is coupled to Twilio’s proprietary APIs. If that lock-in feels risky, evaluate more portable alternatives now, on your own timeline, rather than under pressure later.</p><h3 id="where-does-samvyo-fit-among-twilio-video-alternatives">Where does Samvyo fit among Twilio Video alternatives?</h3><p>Samvyo is built for teams that want an alternative without trading away control. It ships the same embeddable SDKs a CPaaS provider gives you, plus the OEM and white-label depth and deployment options they usually don’t — and because it’s based on an SFU architecture available on-premise or as a managed cloud, you can keep the media path, TURN, and recording under your own control while the platform stays resilient by design. That combination is aimed squarely at the vendor-lock-in risk the Twilio episode exposed.</p>]]></content:encoded></item></channel></rss>